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