ansible使用循环和多个变量

时间:2014-11-06 08:21:50

标签: 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

变量文件的内容

#/root/tempplate.yml

- name: ens35
  bootproto: dhcp
- name: ens34
  bootproto: none

执行时:

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

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

1 个答案:

答案 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