ansible - script - ¿Omitir tarea imposible cuando se ejecuta en modo de verificación?
ejecutar script ansible (6)
Estoy escribiendo un libro de jugadas de Ansible y tengo una tarea que siempre fallará en el modo de verificación:
hosts: ...
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
En el modo de verificación, el archivo no se creará, por lo que la tarea de link
siempre fallará. ¿Hay alguna forma de marcar esa tarea para omitirla cuando se ejecuta en modo de verificación? Algo como:
- file: state=link src={{filename}} dest=latest
when: not check_mode
Ansible 2.1 admite la variable mágica ansible_check_mode
que se establece en True
en el modo de verificación ( documentos oficiales ). Esto significa que podrás hacer esto:
- file:
state: link
src: ''{{ filename }}''
dest: latest
when: not ansible_check_mode
o
- file:
state: link
src: ''{{ filename }}''
dest: latest
ignore_errors: ''{{ ansible_check_mode }}''
Lo que más te guste.
Aquí hay una especie de solución hacky:
hosts: ...
tasks:
- command: /bin/true
register: noop_result
- set_fact: check_mode={{ noop_result|skipped }}
- set_fact: filename="{{ansible_date_time.iso_8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
when: not check_mode
En el modo de verificación, la tarea de command
se omitirá, por lo que check_mode
se establecerá en true
. Cuando no esté en el modo de verificación, la tarea siempre debería tener éxito y check_mode
se establecerá en false
.
Aunque ya hay una respuesta aceptada , quería mencionar que la solución mencionada por no me funcionó, ya que seguí recibiendo el siguiente error: skipped expects a dictionary
Lo que terminó trabajando para mí fue una solución un poco menos compleja al pasar una variable adicional con la -e
siguiente manera:
# On the terminal
ansible-playbook [...] --check -e ''{"check_mode":true}''
# In the playbook or role
when: [...] and not check_mode
# In the proper `group_vars/` file
check_mode: false
¡Déjame saber lo que piensan ustedes!
Otras opciones a tener en cuenta son las etiquetas o la opción --step
.
Etiquetas
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
tags:
- test
Entonces el comando Ansible a usar sería:
ansible-playbook example.yml --skip-tags "test" --check
Hay otros ejemplos para omitir / especificar las tareas que le gustaría ejecutar utilizando etiquetas en la documentación de etiquetas de Ansible .
Inicio y paso
Ansible también proporciona un buen modo de depuración paso a paso con la opción --step
.
Ejecutar ansible-playbook example.yml --step --check
llevará interactivamente a través de cada tarea en su libro de jugadas
Desde la sección "Inicio y paso" de la documentación de Ansible :
Esto hará que no pueda detenerse en cada tarea y pregunte si debería ejecutar esa tarea. Supongamos que tienes una tarea llamada "configure ssh", la ejecución del libro se detendrá y preguntará:
Perform task: configure ssh (y/n/c):
Responder "y" ejecutará la tarea, responder "n" omitirá la tarea y responder "c" continuará ejecutando todas las tareas restantes sin preguntar.
Probablemente podría simplemente establecer un when: filename is defined
para todas las tareas. El inconveniente es que no puede fallar en el modo normal si no se define el filename
.
hosts: ...
tasks:
- set_fact: filename="{{ansible_date_time.iso_8601}}"
- file: state=present name={{filename}}
when: filename is defined
- file: state=link src={{filename}} dest=latest
when: filename is defined
Tuve el mismo tipo de situación con unarchive
:
unarchive
falla en el modo de verificación si el archivo no existe y también si el directorio de destino no existe (ambos se realizan en los pasos previos a la unarchive
). always_run: true
este problema configurando always_run: true
a los pasos de preparación para que también se ejecuten en modo de verificación:
---
- name: create artifact directory
file: {{ artifact_dest_dir }} state=directory
always_run: true
- name: download artifact on the remote host
get_url:
url={{ artifact_url }}
dest={{ artifact_dest_dir }}/{{ artifact_filename }}
force=yes
always_run: true
- name: unpack build artifact
unarchive: src={{ artifact_dest_dir }}/{{ artifact_filename }}
dest={{ artifact_dest_dir }}
copy=no
Funciona en mi caso, pero con directorios dependientes del tiempo, esta podría no ser una buena solución.