Ansible: Set variable only if undefined

喜欢而已 提交于 2019-12-31 12:56:10

问题


I would like to set an ansible variable to some default value but only if the variable is undefined. Otherwise I would like to keep it unchanged.

I tried these two approaches and both of them produce recursive loop:

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

回答1:


It seems like you are taking a wrong approach.

Take a look at the Ansible documentation concerning variable precedence. It is a built-in feature of Ansible to use the default variable if the variable is not defined.

In Ansible 2.x the variable precedence starts like this:

role defaults

inventory vars

So if you want to define a default value for a variable you should set it in role/defaults/main.yml. Ansible will use that value only if the variable is not defined somewhere else.

Another option is to use a Jinja2 filter. With a Jinja filter you can set a default value for a variable like this:

{{ some_variable | default(5) }}



回答2:


- set_fact: namespace="default_namespace"
  when: namespace is undefined



回答3:


In case you need to set your variable by priority order, likewise:

  1. Set variable as var_priority_1.
    But if it is not defined, then:
  2. Set variable as var_priority_2.
    But if it is not defined either, then:
  3. Set variable to a default value.

I had to use such condition while trying to get value from inventory hosts variables, that sometimes need to be overridden by role vars:

shell: |
    ...
    shell_var={{ role_var if role_var is defined else hostvars[item].host_var | default('defalut_value') }}
    ...
  with_items: "{{ groups[hosts_group_iterator] }}"



回答4:


Additional, in case you using lookup to define default variable (read from environment) you have also set the second parameter of default to true:

- set_facts:
    ansible_ssh_user: "{{ lookup('env', 'SSH_USER') | default('foo', true) }}"

You can also concatenate multiple default definitions together:

- set_facts:
    ansible_ssh_user: "{{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"


来源:https://stackoverflow.com/questions/35083756/ansible-set-variable-only-if-undefined

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!