template - ansible variables
Ansible: Establecer variable solo si no está definido (4)
Me gustaría establecer una variable ansible en algún valor predeterminado, pero solo si la variable no está definida. De lo contrario me gustaría mantenerlo sin cambios.
Probé estos dos enfoques y ambos producen un bucle recursivo:
namespace: "{{namespace|default(default_namespace)}}"
namespace: "{% if namespace is defined %}{{namespace}}{% else %}{{default_namespace}}{% endif %}"
Además, en el caso de que utilice la búsqueda para definir la variable predeterminada (lectura del entorno), también ha establecido el segundo parámetro predeterminado en true
:
- set_facts:
ansible_ssh_user: "{{ lookup(''env'', ''SSH_USER'') | default(''foo'', true) }}"
También puede concatenar varias definiciones predeterminadas juntas:
- set_facts:
ansible_ssh_user: "{{ some_var.split(''-'')[1] | default(lookup(''env'',''USER''), true) | default(''foo'') }}"
En caso de que necesite establecer su variable por orden de prioridad , de la misma manera:
- Establecer variable como var_priority_1.
Pero si no está definido, entonces: - Establecer variable como var_priority_2.
Pero si tampoco está definido, entonces: - Establecer variable a un valor predeterminado.
Tuve que usar esa condición al intentar obtener valor de las variables de los hosts de inventario, que a veces deben ser anuladas por las variables de rol:
shell: |
...
shell_var={{ role_var if role_var is defined else hostvars[item].host_var | default(''defalut_value'') }}
...
with_items: "{{ groups[hosts_group_iterator] }}"
Parece que estás tomando un enfoque equivocado.
Eche un vistazo a la documentación de Ansible relativa a la prioridad variable . Es una característica incorporada de Ansible utilizar la variable predeterminada si la variable no está definida.
En Ansible 2.x, la prioridad de la variable comienza así:
valores predeterminados de rol
vars de inventario
Entonces, si desea definir un valor predeterminado para una variable, debe establecerlo en role/defaults/main.yml
. Ansible usará ese valor solo si la variable no está definida en otro lugar.
Otra opción es usar un filtro Jinja2 . Con un filtro Jinja puede establecer un valor predeterminado para una variable como esta:
{{ some_variable | default(5) }}
- set_fact: namespace="default_namespace"
when: namespace is undefined