Ansible:仅在未定义时设置变量

时间:2016-01-29 11:45:33

标签: ansible ansible-playbook

我想将一个ansible变量设置为某个默认值,但前提是该变量未定义。否则我想保持不变。

我尝试了这两种方法,它们都产生了递归循环:

namespace: "{{namespace|default(default_namespace)}}"
namespace: "{% if namespace is defined %}{{namespace}}{% else %}{{default_namespace}}{% endif %}"

4 个答案:

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

如果您需要按优先顺序设置变量,同样:

  1. 将变量设置为var_priority_1 但如果没有定义,那么:
  2. 将变量设置为var_priority_2 但如果没有定义,那么:
  3. 将变量设置为默认值。
  4. 我在尝试从库存主机变量中获取值时必须使用这样的条件,有时需要被角色变量覆盖:

    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') }}"