首页 > 解决方案 > 如何使用“循环”语法遍历多个字典列表?

问题描述

我是 Ansible 的新手,并试图弄清楚 YAML 和 Ansible 的语法。

我在尝试使用“循环”而不是“with_items”循环遍历多个字典列表时遇到了一个致命错误。

---
- hosts: localhost
  vars:
     allow_list:
      - {name: user1, uid: 1001}
      - {name: user2, uid: 1002}
      - {name: user3, uid: 1003}
      - {name: user4, uid: 1004}
      
     deny_list: 
      - {name: user11, uid: 1011}
      - {name: user12, uid: 1012}
      - {name: user13, uid: 1013}
      - {name: user14, uid: 1014}

  tasks:
     - name: debug all users
       debug:
        msg: "{{user.name}} {{user.uid}}"
       loop:
          - "{{allow_list}}"
          - "{{deny_list}}"
       loop_control:
        loop_var: user

错误日志:

fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'name'\n\nThe error appears to have been in '/Ansible/playbook.yml': line 17, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n     - name: debug all users\n       ^ here\n"}

标签: pythonloopsansible

解决方案


您在这里循环一个包含两个项目的列表,这些项目是您的初始列表。您需要做的是将这两个列表与{{ allow_list + deny_list }}. 看看这篇文章

您的代码已修复:

---
- hosts: localhost
  vars:
     allow_list:
      - { name: user1, uid: 1001 }
      - { name: user2, uid: 1002 }
      - { name: user3, uid: 1003 }
      - { name: user4, uid: 1004 }
      
     deny_list: 
      - { name: user11, uid: 1011 }
      - { name: user12, uid: 1012 }
      - { name: user13, uid: 1013 }
      - { name: user14, uid: 1014 }

  tasks:
     - name: debug all users
       debug:
         msg: "{{ item.name }} {{ item.uid }}"
       loop: "{{ allow_list + deny_list }}"

如果您想在一个set_fact块中处理它:

---
- hosts: localhost
  vars:
     allow_list:
      - { name: user1, uid: 1001 }
      - { name: user2, uid: 1002 }
      - { name: user3, uid: 1003 }
      - { name: user4, uid: 1004 }
      
     deny_list: 
      - { name: user11, uid: 1011 }
      - { name: user12, uid: 1012 }
      - { name: user13, uid: 1013 }
      - { name: user14, uid: 1014 }

     some_var: 42

  tasks:
    - name: set fact on condition
      set_fact:
        userlist: "{{ allow_list }}"
      when: some_var <= 5

    - name: set fact on negated condition
      set_fact:
        userlist: "{{ allow_list + deny_list }}"
      when: some_var > 5

    - name: debug all users
      debug:
        msg: "{{ item.name }} {{ item.uid }}"
      loop: "{{ userlist }}"

您需要确保set_fact每次都运行您的一个块,否则您最终会出现错误或意外结果。


推荐阅读