我使用“ shell:”通过循环“ with_items:”并将其注册为另一个变量来获取一些数据。 稍后使用“ lineinfile:”我试图应用早期变量的内容,但无法使用“ {{variable.stdout}} ”,因为它显示为未在“ with_items:”
中定义有没有办法告诉ansible“ variable.stdout ”不要查看“ with_items:”
---
- include_vars: /root/template.yml
- name: Getting MAC
shell: "cat /sys/class/net/{{item.name}}/address"
register: mac
with_items:
- "{{ interfaces_ipv4 }}"
- name: Setting MAC
lineinfile:
state=present
dest=/etc/sysconfig/network-scripts/ifcfg-{{item.name}}
regexp='^HWADDR=.*'
line="HWADDR={{mac.stdout}}"
with_items:
- "{{ interfaces_ipv4 }}"
tags:
- set_mac
变量文件的内容
#/root/tempplate.yml
- name: ens35
bootproto: dhcp
- name: ens34
bootproto: none
执行时:
任务:[mac |设置MAC] ********************************************* ****** 致命的:[192.168.211.146] => 一个或多个未定义的变量:'dict'对象没有属性'stdout'
致命:所有主机都已经失败 - 正在中止
答案 0 :(得分:8)
register
的工作方式略有不同(请参阅here)。在这种情况下,您的变量将有一个results
项,这是一个列表,每次迭代的结果都是项目。该列表中的每个项目也都有一个item
项,迭代了该元素。
例如:
mac: {
msg: "All items completed",
results: [
{
changed: True,
stdout: "some_stdout",
item: {
name: "some_name1"
}
},
{
changed: True,
stdout: "some_stdout2",
item: {
name: "some_name2"
}
}
]
}
然后你可以循环而不是原始列表:
- name: Setting MAC
lineinfile:
state=present
dest=/etc/sysconfig/network-scripts/ifcfg-{{item.item.name}}
regexp='^HWADDR=.*'
line="HWADDR={{item.stdout}}"
with_items: mac.results
tags:
- set_mac