Ansible

獲取寄存器值並稍後將其用作變數

  • May 30, 2017

我想通過將動態分配的 ip 添加到其 ifcfg-eth0 文件中來使虛擬機永久分配,我在使用register: eth0實際 ip 地址的值並將其放在最後一行 時遇到了麻煩line: "IPADDR=register.stdout"

---
- hosts: all
  become: yes
  tasks:
  - name: getting ip address  of eth0
    shell: ip r l | grep  -e eth0 | grep default | grep  -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    register: eth0

  - shell: rm -f /etc/sysconfig/network-scripts/ifcfg-eth0
  - file: path="/etc/sysconfig/network-scripts/ifcfg-eth0" state=touch

  - blockinfile:
     dest: "/etc/sysconfig/network-scripts/ifcfg-eth0"
     block: |
      DEVICE=eth0
      BOOTPROTO=static
      ONBOOT=yes
      USERCTL=no
      TYPE=Ethernet
      IPADDR=
      NETMASK=255.255.255.0
      GATEWAY=

  - name: adding ip in ifcfg-eth0
    lineinfile:
     dest: "/etc/sysconfig/network-scripts/ifcfg-eth0"
     regexp: "IPADDR="
     line: "IPADDR=register.stdout"

錯誤:

[tempuser@testing ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
# BEGIN ANSIBLE MANAGED BLOCK
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
USERCTL=no
TYPE=Ethernet
IPADDR=register.stdout
NETMASK=255.255.255.0
GATEWAY=
# END ANSIBLE MANAGED BLOCK[tempuser@testing ~]$

您正在通過嘗試使用不存在的名稱“register”來訪問寄存器變數 eth0。

當您在 ansible 中註冊一個變數時,您還告訴 ansible 您要將其註冊為的變數的名稱 - 在您的情況下為 eth0:

register: eth0

因此,以後要訪問它,您必須像這樣使用名稱 eth0:

IPADDR={{ eth0.stdout }}

現在,如果您允許我解決我認為是您的 XY 問題 - 而不是使用 grep 來解析您介面的 IP 地址,為什麼不嘗試使用 ansible fact 呢?如果您知道主機上的介面名稱,那麼您可以簡單地執行以下操作:

IPADDR={{ ansible_eth0.ipv4.address }}

另一方面,如果您不知道介面名稱(或者它們在所有主機上都不同) - 但您確實知道每個主機只有一個可行的介面,那麼您可以使用類似以下的內容:

IPADDR={{ ansible_default_ipv4.address }}

要查看 ansible 在系統上收集的所有事實,請使用以下命令:

ansible <hosts> -m setup

引用自:https://unix.stackexchange.com/questions/368018