ansible:“默认”过滤器,将空字符串视为未定义

时间:2019-01-18 16:51:15

标签: ansible

如果我这样做:

- set_fact:
    NEW_VARIABLE: "{{ VARIABLE | default('default') }}"

并且VARIABLE是一个空字符串(""),而不是默认值不触发。

我可以这样做:

- set_fact:
    NEW_VARIABLE: "{{ VARIABLE | default('default') }}"
- set_fact:
    NEW_VARIABLE: "default"
   when: VARIABLE == ""

但是我实际上想循环执行此操作。因此,如果我可以使用ansible过滤器而不是有条件的过滤器,那么操作会容易得多。

这可能吗?是否有像default一样运作但将""视为未定义的过滤器?

2 个答案:

答案 0 :(得分:5)

您必须将第二个默认参数设置为true

{{ VARIABLE | default('default', true) }}

https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#defaulting-undefined-variables

答案 1 :(得分:2)

是的,有可能。

不知道您是否想要这样的东西,但是根据您的描述,这对您有用...

- hosts: localhost
  vars:
    VARIABLE: ""
  tasks:
    - set_fact:
        NEW_VARIABLE: '{{ (VARIABLE |length > 0) | ternary(VARIABLE, "default") }}'
    - debug: msg="{{ NEW_VARIABLE }}"
PLAY [localhost] ********************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *********************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "default"
}

我假设您的变量将始终定义为""。通过假设,可以检查其长度,然后使用三元滤波器。如果其大于0,则使用变量值;如果不大于0,则将NEW_VARIABLE设置为"default"。如果您不知道是否将定义VARIABLE,请在您的when: VARIABLE is defined任务上放一个set_fact,应该是这样。

来源:Ansible filters