我想将一个ansible变量设置为某个默认值,但前提是该变量未定义 . 否则我想保持不变 .
我尝试了这两种方法,它们都产生递归循环:
namespace: "{{namespace|default(default_namespace)}}" namespace: "{% if namespace is defined %}{{namespace}}{% else %}{{default_namespace}}{% endif %}"
看起来你采取了错误的做法 .
请查看有关variable precedence的Ansible文档 . 如果未定义变量,则Ansible的内置功能使用默认变量 .
在Ansible 2.x中,变量优先级如下所示:
role默认库存变量
因此,如果要为变量定义默认值,则应在 role/defaults/main.yml 中进行设置 . 仅当变量未在其他位置定义时,Ansible才会使用该值 .
role/defaults/main.yml
另一种选择是使用Jinja2 filter . 使用Jinja过滤器,您可以为变量设置默认值,如下所示:
{{ some_variable | default(5) }}
- set_fact: namespace="default_namespace" when: namespace is undefined
如果您需要设置 variable by priority order ,同样:
将变量设置为var_priority_1 .但如果没有定义,那么:
将变量设置为var_priority_2 .但如果没有定义,那么:
将变量设置为默认值 .
在尝试从库存主机变量获取值时,我不得不使用这样的条件,有时需要被角色变量覆盖:
shell: | ... shell_var={{ role_var if role_var is defined else hostvars[item].host_var | default('defalut_value') }} ... with_items: "{{ groups[hosts_group_iterator] }}"
另外,如果您使用查找来定义默认变量(从环境中读取),您还将默认的第二个参数设置为 true :
true
- set_facts: ansible_ssh_user: "{{ lookup('env', 'SSH_USER') | default('foo', true) }}"
您还可以将多个默认定义连接在一起:
- set_facts: ansible_ssh_user: "{{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"
4 回答
看起来你采取了错误的做法 .
请查看有关variable precedence的Ansible文档 . 如果未定义变量,则Ansible的内置功能使用默认变量 .
在Ansible 2.x中,变量优先级如下所示:
因此,如果要为变量定义默认值,则应在
role/defaults/main.yml
中进行设置 . 仅当变量未在其他位置定义时,Ansible才会使用该值 .另一种选择是使用Jinja2 filter . 使用Jinja过滤器,您可以为变量设置默认值,如下所示:
如果您需要设置 variable by priority order ,同样:
将变量设置为var_priority_1 .
但如果没有定义,那么:
将变量设置为var_priority_2 .
但如果没有定义,那么:
将变量设置为默认值 .
在尝试从库存主机变量获取值时,我不得不使用这样的条件,有时需要被角色变量覆盖:
另外,如果您使用查找来定义默认变量(从环境中读取),您还将默认的第二个参数设置为
true
:您还可以将多个默认定义连接在一起: