我想将一个ansible变量设置为某个默认值,但前提是该变量未定义。否则我想保持不变。
我尝试了这两种方法,它们都产生了递归循环:
namespace: "{{namespace|default(default_namespace)}}"
namespace: "{% if namespace is defined %}{{namespace}}{% else %}{{default_namespace}}{% endif %}"
答案 0 :(得分:31)
您似乎采取了错误的做法。
查看有关variable precedence的Ansible文档。如果未定义变量,则Ansible的内置功能使用默认变量。
在Ansible 2.x中,变量优先级如下所示:
角色默认
库存变量
因此,如果要为变量定义默认值,则应在role/defaults/main.yml
中进行设置。仅当变量未在其他地方定义时,Ansible才会使用该值。
另一种选择是使用Jinja2 filter。使用Jinja过滤器,您可以为变量设置默认值,如下所示:
{{ some_variable | default(5) }}
答案 1 :(得分:13)
- set_fact: namespace="default_namespace"
when: namespace is undefined
答案 2 :(得分:2)
如果您需要按优先顺序设置变量,同样:
我在尝试从库存主机变量中获取值时必须使用这样的条件,有时需要被角色变量覆盖:
addData (input){
if (input.every(element => $(element).hasClass('valid'))) {
// Do stuff
}
}
答案 3 :(得分:1)
此外,如果您使用查找定义默认变量(从环境中读取),则还将默认的第二个参数设置为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') }}"