示例剧本 -
---
- hosts: localhost
vars:
lesson:
name: Physics
students:
- Bob
- Joe
tasks:
- name: Display student names
debug:
msg: '{{ item }}'
loop: "{{ lesson.students }}"
when: item | default("")
Run Code Online (Sandbox Code Playgroud)
上面的剧本可以很好地输出学生姓名。
但是,如果输入发生更改(如下所示)以致未定义学生姓名,则会发生错误。如果根据下面的输入未定义列表,是否有一种简单的方法可以让剧本跳过此任务?我意识到如果输入指定Students: [],那么它会起作用,但由于此输入来自简单用户,因此他们不会知道这一点。非常感谢!
vars:
lesson:
name: Physics
students:
Run Code Online (Sandbox Code Playgroud)
错误:致命:[localhost]:失败!=> msg: '无效数据传递给''循环'',它需要一个列表,改为: 。提示:如果您传递了仅包含一个元素的列表/字典,请尝试将 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 )
Run Code Online (Sandbox Code Playgroud)
真正的问题是loop 需要一个列表,即使它是一个空列表。
如果您的 var 是未定义/无/空字符串,则它存在但不是列表,并且您的条件永远不会被评估,因为循环会在到达之前触发错误。
在这种情况下,您必须将 var 默认为空列表,这将导致 0 大小的循环,相当于跳过任务。
由于您的 var 已定义,但None您需要使用第二个可选参数,default以便空/假值也被替换
注意:我在下面的示例中使用了短别名dtodefault
- name: Display student names
debug:
msg: '{{ item }}'
loop: "{{ lesson.students | d([], true) }}"
Run Code Online (Sandbox Code Playgroud)
一个可以将错误消灭在萌芽状态的良好做法是通过以下任一方式进行一致的数据声明:
# ... #
vars:
lesson:
name: Physics
# ... #
loop: "{{ lesson.students | d([]) }}"
Run Code Online (Sandbox Code Playgroud)
None值,
即# ... #
vars:
lesson:
name: Physics
students: []
# ... #
loop: "{{ lesson.students }}"
Run Code Online (Sandbox Code Playgroud)
无论如何,我的第一个提议在这种情况下是最安全的,并且适用于所有上述变量声明。
| 归档时间: |
|
| 查看次数: |
4965 次 |
| 最近记录: |