如果我这样做:
- set_fact:
NEW_VARIABLE: "{{ VARIABLE | default('default') }}"
并且VARIABLE
是一个空字符串(""
),而不是默认值不触发。
我可以这样做:
- set_fact:
NEW_VARIABLE: "{{ VARIABLE | default('default') }}"
- set_fact:
NEW_VARIABLE: "default"
when: VARIABLE == ""
但是我实际上想循环执行此操作。因此,如果我可以使用ansible过滤器而不是有条件的过滤器,那么操作会容易得多。
这可能吗?是否有像default
一样运作但将""
视为未定义的过滤器?
答案 0 :(得分:5)
您必须将第二个默认参数设置为true
{{ VARIABLE | default('default', true) }}
答案 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
,应该是这样。