レジスタ値を取得し、後で変数として使用する

レジスタ値を取得し、後で変数として使用する

register: eth0動的に割り当てられたIPをifcfg-eth0ファイルに追加してVMに永続的に割り当てたいのですが、実際の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 問題だと思う問題を解決することを許可していただけるなら、インターフェイスの IP アドレスを解析するために grep を使用する代わりに、Ansible facts を使用してみてはいかがでしょうか。ホスト上のインターフェイス名がわかっている場合は、次のように簡単に実行できます。

IPADDR={{ ansible_eth0.ipv4.address }}

一方、インターフェース名がわからない (またはすべてのホストで異なる) が、各ホストに有効なインターフェースが 1 つしかないことがわかっている場合は、次のようなものを使用できます。

IPADDR={{ ansible_default_ipv4.address }}

Ansible がシステム上で収集するすべての事実を確認するには、次のコマンドを使用します。

ansible <hosts> -m setup

関連情報