遍历Ansible剧本中的列表数据

时间:2019-05-09 13:58:40

标签: ansible yaml nested-loops ansible-inventory

在寻求使某些网络环境自动化的过程中,我想知道如何遍历嵌套列表中的不同项目。为了更加清楚,我将使用现有的广告资源和剧本解释我要做什么。

库存如下,(虚拟内容)

parameters:
- mode: ""
  speed: ""
  duplex: ""
interfaces:
  - Int_One
  - Int_Two

如您所见,我有一个包含一些网络信息(参数)的列表,另一个包含两个接口的列表。我要在剧本中完成的操作是使用“参数”列表中的信息来配置这两个接口。换句话说,使用“参数”列表中的信息在“接口”上循环。但是到目前为止,我无法在正确的时间使用正确的数据

很高兴知道我在剧本中使用了预定义的“思科网络模块”。

Playbook如下,

- name: Deploy Network Interfaces
  "Some network module":
    mode: '{{ item.0.mode }}'
    speed: '{{ item.0.speed }}'
    duplex: '{{ item.0.duplex }}'
    interface: '{{ item.1.interfaces }}'
    state: present
  delegate_to: localhost
  loop: 
    - "{{ parameters }}"
    - "{{ parameters|subelements('interfaces') }}"

如您所见,网络模块要求提供“接口”。因此,我再次想遍历“接口”列表,并使用“参数”列表中定义的数据来部署它们。

能告诉我如何处理此问题的人吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

给出您的示例,以下是一种解决方案:

- hosts:
    - localhost
  gather_facts: False

  vars:
    parameters:
    - mode: "auto"
      speed: "1000"
      duplex: "full"
    interfaces:
      - Int_One
      - Int_Two

  tasks:
  - name: DBEUG
    debug:
      msg: >
        mode: {{parameters.0.mode}},
        speed: {{parameters.0.speed}},
        duplex: {{parameters.0.duplex}},
        interface: {{item}}
    loop:
      "{{interfaces}}"

答案 1 :(得分:0)

您的问题有点令人困惑。您有两个变量;名为parameters的列表:

parameters:
- mode: ""
  speed: ""
  duplex: ""

还有一个名为interfaces的列表:

interfaces:
  - Int_One
  - Int_Two

parameters有一个项目,而interfaces有两个项目。它们具有不同数量的项目这一事实使得很难弄清它们之间的关系。如果每个接口都有 unique 参数,则您可能需要这样的东西:

interfaces:
  - name: Int_One
    mode: ""
    speed: ""
    duplex: ""
  - name: Int_Two
    mode: ""
    speed: ""
    duplex: ""

在这种情况下,您将像这样编写剧本:

- name: Deploy Network Interfaces
  "Some network module":
    mode: '{{ item.mode }}'
    speed: '{{ item.speed }}'
    duplex: '{{ item.duplex }}'
    interface: '{{ item.name }}'
    state: present
  delegate_to: localhost
  loop: "{{ interfaces }}"

另一方面,如果所有接口都具有相同参数,那么您可能会像这样构造数据:

parameters:
  mode: ""
  speed: ""
  duplex: ""

interfaces:
  - Int_One
  - Int_Two

然后像这样写你的剧本:

- name: Deploy Network Interfaces
  "Some network module":
    mode: '{{ parameters.mode }}'
    speed: '{{ parameters.speed }}'
    duplex: '{{ parameters.duplex }}'
    interface: '{{ item.name }}'
    state: present
  delegate_to: localhost
  loop: "{{ interfaces }}"