【问题标题】:Looping over list data in Ansible playbooks在 Ansible 剧本中循环列表数据
【发布时间】:2019-05-09 13:58:40
【问题描述】:

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

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

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

如您所见,网络模块需要提供“接口”。所以我想再次迭代“接口”列表并使用“参数”列表中定义的数据部署它们。

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

提前致谢!

【问题讨论】:

  • 没有“parameters.interfaces”。变量“interfaces”是独立的。这是缩进的错误吗?

标签: ansible yaml nested-loops ansible-inventory


【解决方案1】:

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

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

还有一个名为interfaces的列表:

interfaces:
  - Int_One
  - Int_Two

parameters 有一个项目,而interfaces 有两个。它们具有不同数量的项目这一事实使得很难弄清楚它们是如何相关的。如果每个接口都有唯一参数,您可能需要这样的参数:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多