我想通过将动态分配的 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