在 Ansible 剧本中循环列表数据

Looping over list data in Ansible playbooks

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

库存如下所示,(虚拟内容)

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

如您所见,我有一个包含一些网络信息(参数)的列表和另一个包含两个接口的列表。我想在我的剧本中完成的操作是使用 "parameters" 列表中找到的信息配置这两个接口。换句话说,使用 "parameters" 列表中的信息遍历 "interfaces"。但截至目前,我无法让它在正确的时间使用正确的数据

值得一提的是,我在我的剧本中使用了预定义的 "Cisco network module"。

剧本如下,

- 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') }}"

如您所见,网络模块需要提供 "interface"。所以我想再次遍历 "interfaces" 列表并使用 "parameters" 列表中定义的数据部署它们。

谁能告诉我如何处理这个问题?

提前致谢!

根据您的示例,解决方案如下:

- 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}}"

你的问题有点令人费解。你有两个变量;名为 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 }}"