Ansible: ejecución avanzada

En este capítulo, aprenderemos qué es la ejecución avanzada con Ansible.

Cómo limitar la ejecución por tareas

Esta es una estrategia de ejecución muy importante en la que se necesita ejecutar solo una ejecución y no todo el libro de jugadas. For example, suponga que solo desea detener un servidor (en caso de que surja un problema de producción) y luego publicar la aplicación de un parche que solo desea iniciar el servidor.

Aquí, en el libro de jugadas original, detener y comenzar eran parte de diferentes roles en el mismo libro de jugadas, pero esto se puede manejar con el uso de etiquetas. Podemos proporcionar diferentes etiquetas para diferentes roles (que a su vez tendrán tareas) y, por lo tanto, basándonos en las etiquetas proporcionadas por el ejecutor, solo se ejecutará el rol / tarea especificada. Entonces, para el ejemplo anterior proporcionado, podemos agregar etiquetas como las siguientes:

- {role: start-tomcat, tags: ['install']}}

El siguiente comando ayuda a usar etiquetas:

ansible-playbook -i hosts <your yaml> --tags "install" -vvv

Con el comando anterior, solo se llamará al rol start-tomcat. La etiqueta proporcionada distingue entre mayúsculas y minúsculas. Asegúrese de que se esté pasando una coincidencia exacta al comando.

Cómo limitar la ejecución por hosts

Hay dos formas de lograr la ejecución de pasos específicos en hosts específicos. Para un rol específico, se definen los hosts, en cuanto a qué hosts específicos se debe ejecutar ese rol específico.

Ejemplo

- hosts: <A> 
   environment: "{{your env}}" 
   pre_tasks: 
      - debug: msg = "Started deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
     
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}" 
 
- hosts: <B> 
   pre_tasks: 
      - debug: msg = "started.... 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
        
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed the task.. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

Según el ejemplo anterior, según los hosts proporcionados, solo se llamarán los roles respectivos. Ahora mis hosts A y B están definidos en los hosts (archivo de inventario).

Solución alternativa

Una solución diferente podría ser definir los hosts del libro de jugadas usando una variable y luego pasar una dirección de host específica a través de --extra-vars -

# file: user.yml  (playbook) 
--- 
- hosts: '{{ target }}' 
   user: ... 
playbook contd….

Ejecutando el libro de jugadas

ansible-playbook user.yml --extra-vars "target = "<your host variable>"

Si {{target}} no está definido, el libro de jugadas no hace nada. Si es necesario, también se puede pasar un grupo del archivo de hosts. Esto no perjudica si no se proporcionan las vars adicionales.

Libro de jugadas dirigido a un solo anfitrión

$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts