取得暫存器值並稍後將其用作變數

取得暫存器值並稍後將其用作變數

我想透過將動態分配的 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 ~]$

答案1

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

當您在 ansible 中註冊變數時,您也告訴 ansible 您想要將其註冊為的變數的名稱 - 在您的例子中為 eth0:

register: eth0

因此,要稍後訪問它,您必須使用名稱 eth0,如下所示:

IPADDR={{ eth0.stdout }}

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

IPADDR={{ ansible_eth0.ipv4.address }}

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

IPADDR={{ ansible_default_ipv4.address }}

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

ansible <hosts> -m setup

相關內容