在 Ansible 中,如何迭代键/值对列表?

Chr*_*s F 6 ansible ansible-2.x

假设我有一个 defaults/main.yml 文件

---
my_vars:
- var1: value1
- var2: value2
Run Code Online (Sandbox Code Playgroud)

如何编写任务以输出变量?

- debug: msg="The value of {{item.key}} is {{ item.value }}"
  with_items:
  - "What to put here???"
Run Code Online (Sandbox Code Playgroud)

ted*_*r42 1

您似乎在询问 X,但在示例中陈述了 Y。我的意思是,可以迭代的键/值对列表如下所示:

my_vars:
- var1: value1
  var2: value2
Run Code Online (Sandbox Code Playgroud)

或者甚至像这样:

my_vars:
  var1: value1
  var2: value2
Run Code Online (Sandbox Code Playgroud)

为了处理你的字典列表,这里有一个例子。我添加了一个变量来显示字典是如何“聚集”的。

---
- hosts: localhost
  connection: local
  vars:
    my_var:
    - var1: value1
      varX: valueY
    - var2: value2
  tasks:
  - debug: var=item
    with_items: "{{my_var}}"
  - debug: var=item.var1
    when: "'var1' in item"
    with_items: "{{my_var}}"
Run Code Online (Sandbox Code Playgroud)

输出:

TASK [debug] ***********************************************************************************************************
ok: [localhost] => (item={'varX': 'valueY', 'var1': 'value1'}) => {
    "item": {
        "var1": "value1",
        "varX": "valueY"
    }
}
ok: [localhost] => (item={'var2': 'value2'}) => {
    "item": {
        "var2": "value2"
    }
}

TASK [debug] ***********************************************************************************************************
ok: [localhost] => (item={'varX': 'valueY', 'var1': 'value1'}) => {
    "item": {
        "var1": "value1",
        "varX": "valueY"
    },
    "item.var1": "value1"
}
skipping: [localhost] => (item={'var2': 'value2'})
Run Code Online (Sandbox Code Playgroud)

同样,您可以看到“聚集”、var1 和 varX 显示在同一迭代中。Ansible 不能很好地处理深度嵌套。Ansible 可以处理字典列表的一个情况是当它们引用类似的事物时:

my_vars:
- name: bob
  legs: 4
  type: cow
- name: alice
  legs: 2
  type: bird
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过两种方式进行迭代 - with_items 或 with_subelements。

如果列表中确实有异构键并且想要一次迭代它们,则必须使用嵌套包含(恶心)。您还可以构建一个过滤器。我从来没有做过前者,后者只做过一次。