首页 文章

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

提问于
浏览
18

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

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

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

4 回答

  • 30

    看起来你采取了错误的做法 .

    请查看有关variable precedence的Ansible文档 . 如果未定义变量,则Ansible的内置功能使用默认变量 .

    在Ansible 2.x中,变量优先级如下所示:

    role默认库存变量

    因此,如果要为变量定义默认值,则应在 role/defaults/main.yml 中进行设置 . 仅当变量未在其他位置定义时,Ansible才会使用该值 .

    另一种选择是使用Jinja2 filter . 使用Jinja过滤器,您可以为变量设置默认值,如下所示:

    {{ some_variable | default(5) }}
    
  • 13
    - set_fact: namespace="default_namespace"
      when: namespace is undefined
    
  • 2

    如果您需要设置 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] }}"
    
  • 0

    另外,如果您使用查找来定义默认变量(从环境中读取),您还将默认的第二个参数设置为 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') }}"
    

相关问题