我正在尝试获取路径列表。
变量文件夹(web_folder,app_folder或db_folder)可能是未定义的,并且应该是未定义的。
在这种情况下,我只是不想在列表中使用未定义的值。
- set_fact: root_paths="{{ root_paths | default([]) + [ item ] }}"
loop:
- "{{ web_folder }}"
- "{{ app_folder }}"
- "{{ db_folder }}"
when: item is defined
当我这样做时,我收到一条错误消息“该任务包括一个带有未定义变量的选项。”
如果我定义默认值,例如'-'并将when条件替换为
when: item != '-'
我不喜欢这种解决方案。
我尝试了
有什么建议吗?
答案 0 :(得分:1)
Q:我收到一条错误消息“该任务包括一个带有未定义变量的选项。”如果我定义默认值,例如'-'并将when条件替换为
when: item != '-'
。我不喜欢这种解决方案。
A:未定义变量的扩展会导致错误。要么对变量进行显式测试,要么使用 default 过滤器。
测试每个变量很麻烦
tasks:
- set_fact:
folders_defined: []
- set_fact:
folders_defined: "{{ folders_defined + [web_folder] }}"
when: web_folder is defined
- set_fact:
folders_defined: "{{ folders_defined + [app_folder] }}"
when: app_folder is defined
- set_fact:
folders_defined: "{{ folders_defined + [db_folder] }}"
when: db_folder is defined
- debug:
var: folders_defined
下一个选项(与您不喜欢的选项非常相似)是测试分配给未定义变量的默认值。例如,下面的剧本测试默认的空字符串。如有必要,请满足您的条件。
- hosts: localhost
vars:
web_folder: /my/web/folder
app_folder: /my/app/folder
folders: [web_folder, app_folder, db_folder]
tasks:
- set_fact:
folders_defined: "{{ folders_defined|default([]) +
[lookup('vars', item)] }}"
loop: "{{ folders }}"
when: lookup('vars', item, default='')|length > 0
- debug:
var: folders_defined
给予
ok: [localhost] => {
"folders_defined": [
"/my/web/folder",
"/my/app/folder"
]
}
答案 1 :(得分:0)
变量文件夹(web_folder,app_folder或db_folder)可能是未定义的,并且应该是未定义的。
如果未定义它们,则可以使用default
过滤器将它们初始化为空数组:
- set_fact: root_paths="{{ root_paths | default([]) + [ item ] }}"
loop:
- "{{ web_folder | default([]) }}"
- "{{ app_folder | default([]) }}"
- "{{ db_folder | default([]) }}"
when: item is defined
希望有帮助。