如何使用“循环”语法循环遍历字典的多个列表?

时间:2020-10-30 06:35:47

标签: python loops ansible

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

1 个答案:

答案 0 :(得分:1)

您要遍历一个包含两个项目的列表,这些项目是您的初始列表。您需要做的是将这两个列表与{{ allow_list + deny_list }}一起加入。检出this post

您的固定代码:

---
- 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块中的每一个都正确运行,否则最终会出现错误或意外结果。