playbook - ansible tower
Definir condicionalmente la variable en Ansible. (3)
Creo que estás buscando el filtro default(omit)
.
http://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#omitting-parameters
Según el ejemplo, el modo se comportará como si no estuviera configurado para los dos primeros elementos del bucle.
- name: touch files with an optional mode
file:
dest: "{{item.path}}"
state: touch
mode: "{{item.mode|default(omit)}}"
loop:
- path: /tmp/foo
- path: /tmp/bar
- path: /tmp/baz
mode: "0444"
Quiero definir condicionalmente una variable en un libro de juego de Ansible como este: my_var: "{{ ''foo'' if my_condition}}"
. Me gustaría que la variable permaneciera indefinida si la condición no se resuelve como verdadera.
Ansible da un error si trato de hacer esto: fatal: [foo.local] => {''msg'': ''AnsibleUndefinedVariable: One or more undefined variables: the inline if-expression on line 1 evaluated to false and no else section was defined.'', ''failed'': True}
. ¿Por qué es esto un error de todos modos?
El caso completo se ve así: {role: foo, my_var: "foo"}
. Si se define my_var
, el rol hace algo especial. En algunos casos, no quiero que el rol haga esto. Podría usar when: condition
, pero luego tendría que copiar todo el bloque de roles. También podría usar una variable bool extra, pero me gustaría una solución sin tener que cambiar la "interfaz" del rol.
¿Algunas ideas?
Este código puede ayudarte a definir una variable con condición.
- hosts: node1
gather_facts: yes
tasks:
- name: Check File
shell: ls -ld /etc/postfix/post-install
register: result
ignore_errors: yes
- name: Define Variable
set_fact:
exists: "{{ result.stdout }}"
when: result|success
- name: Display Variable
debug: msg="{{ exists }}"
ignore_errors: yes
Entonces aquí "existe" se mostrará solo si la condición es verdadera.
Puedes usar algo como esto: my_var: "{{ ''foo'' if my_condition else '''' }}"
. El ''else'' sucederá si la condición no coincide, y en este caso establecerá un valor vacío para la variable. Creo que esta es una solución corta, legible y elegante.