Ansible
獲取寄存器值並稍後將其用作變數
我想通過將動態分配的 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