使用ansible循环在列表字典上迭代

使用ansible循环在列表字典上迭代,ansible,Ansible,我有下面的测试剧本来循环列表字典 - hosts: localhost connection: local vars: machine_roles: masters: ["master1","master2"] workers: ["worker1","worker2"] tasks: - name: toto debug: msg: "{{ item.0.role}} --- {{ item.1 }}"

我有下面的测试剧本来循环列表字典

- hosts: localhost

  connection: local

  vars:

    machine_roles:

      masters: ["master1","master2"]
      workers: ["worker1","worker2"]

  tasks:

    - name: toto
      debug:
       msg: "{{ item.0.role}} --- {{ item.1 }}"

      loop:
        - "{{ machine_roles | dict2items(key_name='role', value_name='machine') | subelements('machine') }}"
我希望得到以下输出:

masters --- master1
masters --- master2
workers --- worker1
workers --- worker2
基于我对文档和类似帖子的理解,我希望我的剧本能完成这项工作。但是,在运行它时,我得到以下错误:

fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'role'\n\nThe error appears to be in '/root/git/visa-jupyter/jupyterhub-kubespawner/test.yml': line 14, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: toto\n      ^ here\n"}
令人惊讶的是,在调试
{{machine|roles | dict2items(key_name='role',value_name='machine')| subelements('machine')}
的结果时,我得到了:

    [
        [
            {
                "machine": [
                    "master1", 
                    "master2"
                ], 
                "role": "masters"
            }, 
            "master1"
        ], 
        [
            {
                "machine": [
                    "master1", 
                    "master2"
                ], 
                "role": "masters"
            }, 
            "master2"
        ], 
        [
            {
                "machine": [
                    "worker1", 
                    "worker2"
                ], 
                "role": "workers"
            }, 
            "worker1"
        ], 
        [
            {
                "machine": [
                    "worker1", 
                    "worker2"
                ], 
                "role": "workers"
            }, 
            "worker2"
        ]
    ]
在我看来,当组合
dict2items
子元素时,这就是文档中解释的预期结果

为什么在此数据结构上应用
loop
命令会失败,或者至少不会产生我所期望的结果

[编辑和回答] 我终于找到了错误。我通过以下操作引入了另一个循环关卡,让自己大吃一惊:

loop:
  - "{{ machine_roles | dict2items(key_name='role', value_name='machine') | subelements('machine') }}"
正确的语法是(就我而言):


这一定是一些奇怪的格式/缩进问题。您的代码运行良好

"msg": "masters --- master1"
"msg": "masters --- master2"
"msg": "workers --- worker1"
"msg": "workers --- worker2"

FWIW。这是到测试的链接。

我终于找到了我的错误。Cf我的编辑信息。与你的版本相比,我找到了方向。谢谢
"msg": "masters --- master1"
"msg": "masters --- master2"
"msg": "workers --- worker1"
"msg": "workers --- worker2"