Ansible如何在循环中忽略未定义的项目

时间:2019-08-30 18:04:03

标签: ansible

我正在尝试获取路径列表。 变量文件夹(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 != '-'

我不喜欢这种解决方案。

我尝试了

  • '{when:vars [item] is undefined“,来自this post,但这对我不起作用。
  • 我还用'with_items'替换了'loop'也不起作用

有什么建议吗?

2 个答案:

答案 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

希望有帮助。