python - 如何使用“循环”语法遍历多个字典列表?
问题描述
我是 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"}
解决方案
您在这里循环一个包含两个项目的列表,这些项目是您的初始列表。您需要做的是将这两个列表与{{ 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
每次都运行您的一个块,否则您最终会出现错误或意外结果。
推荐阅读
- node.js - Angular Mat-Form 导致网页在没有错误代码的情况下崩溃
- javascript - Javascript - isNaN and parseInt
- powershell - 如何在 powershell 脚本中创建调度程序任务路径的集合
- google-bigquery - 如何在 BigQuery 中将 8 字节双精度数(小端序)解析为 float64?
- javascript - 我将如何在按下加号按钮时显示的 html 网站上创建可编辑的“块”?
- php - 使用原始 php 变量设置默认选项(无 javascript 或其他库)
- python - Python - 重新格式化来自 Binance 的 JSON API 响应
- java - 如果您使用的是@EnableWebMvc 注解,为什么@RequestBody 调用的Dto 必须使用@NoArgsConstructor 进行注解?
- android - 仍然无法将订阅的 android 应用程序转移到另一个帐户?
- c++ - Metrics_Alpha.exe 中 0x78F90870 (ucrtbased.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000