ansible - Ansible:列表未定义时跳过循环
问题描述
示例剧本 -
---
- hosts: localhost
vars:
lesson:
name: Physics
students:
- Bob
- Joe
tasks:
- name: Display student names
debug:
msg: '{{ item }}'
loop: "{{ lesson.students }}"
when: item | default("")
上面的剧本可以很好地输出学生姓名。
但是,如果输入更改(如下所示)以致没有定义学生姓名,则会发生错误。如果根据下面的输入未定义列表,是否有一种简单的方法可以让剧本跳过此任务?我意识到如果输入指定了students: [],它会起作用,但是由于这个输入来自简单的用户,他们不会知道这一点。非常感谢!
vars:
lesson:
name: Physics
students:
错误:致命:[本地主机]:失败!=> msg: '传递给''loop'的无效数据',它需要一个列表,得到这个代替:. 提示:如果您只传递了一个元素的列表/字典,请尝试将 wantlist=True 添加到您的查找调用或使用 q/query 而不是查找。
更新-我尝试了以下变体,但仍然遇到相同的错误-
---
- hosts: localhost
vars:
lesson:
name: Physics
students:
tasks:
- name: Display student names variation 1
debug:
msg: '{{ item }}'
loop: "{{ lesson.students }}"
when: lesson.students is iterable
- name: Display student names variation 2
debug:
msg: '{{ item }}'
loop: "{{ lesson.students }}"
when: lesson.students is not none
- name: Display student names variation 3
debug:
msg: '{{ item }}'
loop: "{{ lesson.students }}"
when: ( item | default("") ) or ( item is not none )
解决方案
真正的问题是loop
需要一个列表,即使它是一个空列表。
如果您的 var 是未定义/无/空字符串,则它存在但不是列表,并且您的 when 条件将永远不会被评估,因为循环会在到达之前触发错误。
在这种情况下,您必须将 var 默认为空列表,这将导致 0 大小的循环相当于跳过任务。
由于您的 var 已定义,但None
您需要使用第二个可选参数来default
替换空/假值
注意:我在下面的示例中d
使用了短别名default
- name: Display student names
debug:
msg: '{{ item }}'
loop: "{{ lesson.students | d([], true) }}"
将错误扼杀在萌芽状态的一个好的做法是通过以下任一方式进行一致的数据声明:
- 根本不声明密钥并使用简单的默认值,即
# ... # vars: lesson: name: Physics # ... # loop: "{{ lesson.students | d([]) }}"
- 为键声明一个空列表而不是一个
None
值,即# ... # vars: lesson: name: Physics students: [] # ... # loop: "{{ lesson.students }}"
无论如何,我的第一个提议在这种情况下是最安全的,并且适用于所有上述 vars 声明。
推荐阅读
- python - 在python中使用客户端证书进行相互身份验证
- c# - Exclude values "starting with" from column in WPF DataGrid
- python-3.x - 获取本地网络上未在 /etc/hosts 中设置的远程计算机的主机名
- r - .5 的 R round() 规则
- python - 为什么我的样本权重会破坏我的神经网络?
- odoo - 如何为 res.user 而不是 res.partner 在 Odoo 的 Web 模块中自动登录?
- javascript - 使用 VueJs 导入 json 的问题
- python - 在 Heroku 上部署 Django?
- javascript - 将存储的数组对象显示为 Javascript 到 HTML 中的列表
- java - 如何提供静态页面