usar script playbook ejecutar con comentarios automatizar arquitectura archivo ansible ansible-playbook

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.