Взять значение регистра и использовать его позже как переменную

Взять значение регистра и использовать его позже как переменную

Я хочу сделать динамически назначенный 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

Вы получаете доступ к регистровой переменной eth0, пытаясь использовать имя «register», которое не существует.

Когда вы регистрируете переменную в ansible, вы также сообщаете ansible имя переменной, под которой вы хотите ее зарегистрировать — в вашем случае eth0:

register: eth0

Поэтому, чтобы получить к нему доступ позже, вам придется использовать имя eth0, например так:

IPADDR={{ eth0.stdout }}

Теперь, если вы позволите мне решить то, что я считаю вашей проблемой XY - вместо использования grep для разбора IP-адреса вашего интерфейса, почему бы не попробовать использовать ansible facts? Если вы знаете имя интерфейса на хосте, то вы можете просто сделать что-то вроде этого:

IPADDR={{ ansible_eth0.ipv4.address }}

С другой стороны, если вы не знаете имя интерфейса (или они разные на всех ваших хостах), но вы знаете, что у каждого хоста есть только один работоспособный интерфейс, то вы можете использовать что-то вроде следующего:

IPADDR={{ ansible_default_ipv4.address }}

Чтобы просмотреть все факты, которые ansible собирает в системе, используйте следующую команду:

ansible <hosts> -m setup

Связанный контент