ansible使用循环和多个变量

Kev*_*ker 5 ansible ansible-playbook

我使用" 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
Run Code Online (Sandbox Code Playgroud)

变量文件的内容

#/root/tempplate.yml

- name: ens35
  bootproto: dhcp
- name: ens34
  bootproto: none
Run Code Online (Sandbox Code Playgroud)

执行时:

任务:[mac | 设置MAC]***************************************************致命:[192.168.211.146] => 一个或多个未定义的变量:'dict'对象没有属性'stdout'

致命:所有主机都已经失败 - 中止

hka*_*iti 8

register在循环内部使用时有点不同(见这里).在这种情况下,您的变量将有一个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"
          }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后你可以循环而不是原始列表:

- 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
Run Code Online (Sandbox Code Playgroud)