Ansible - Exécution avancée

Dans ce chapitre, nous allons apprendre ce qu'est une exécution avancée avec Ansible.

Comment limiter l'exécution par tâches

C'est une stratégie d'exécution très importante où l'on n'a besoin d'exécuter qu'une seule exécution et non le playbook entier. For example, supposons que vous souhaitiez uniquement arrêter un serveur (au cas où un problème de production surviendrait), puis après l'application d'un correctif, vous souhaitez uniquement démarrer le serveur.

Ici, dans le livre de jeu original, l'arrêt et le démarrage faisaient partie de différents rôles dans le même livre de jeu, mais cela peut être géré avec l'utilisation de balises. Nous pouvons fournir différentes balises à différents rôles (qui à leur tour auront des tâches) et donc en fonction des balises fournies par l'exécuteur, seul le rôle / la tâche spécifié est exécuté. Donc, pour l'exemple ci-dessus fourni, nous pouvons ajouter des balises comme les suivantes -

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

La commande suivante aide à utiliser les balises -

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

Avec la commande ci-dessus, seul le rôle start-tomcat sera appelé. La balise fournie est sensible à la casse. Assurez-vous que la correspondance exacte est transmise à la commande.

Comment limiter l'exécution par les hôtes

Il existe deux méthodes pour exécuter des étapes spécifiques sur des hôtes spécifiques. Pour un rôle spécifique, on définit les hôtes - quant à quels hôtes spécifiques ce rôle spécifique doit être exécuté.

Exemple

- 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}}"

Comme dans l'exemple ci-dessus, en fonction des hôtes fournis, les rôles respectifs seront uniquement appelés. Maintenant, mes hôtes A et B sont définis dans les hôtes (fichier d'inventaire).

Solution alternative

Une solution différente pourrait être de définir les hôtes du playbook à l'aide d'une variable, puis de transmettre une adresse d'hôte spécifique via --extra-vars -

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

Lancer le Playbook

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

Si {{target}} n'est pas défini, le playbook ne fait rien. Un groupe du fichier hosts peut également être transmis si nécessaire. Cela ne nuit pas si les variables supplémentaires ne sont pas fournies.

Playbook ciblant un seul hôte

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