Ansible - Esecuzione avanzata

In questo capitolo, impareremo cos'è l'esecuzione avanzata con Ansible.

Come limitare l'esecuzione per attività

Questa è una strategia di esecuzione molto importante in cui è necessario eseguire solo un'esecuzione e non l'intero playbook. For example, supponi di voler solo arrestare un server (nel caso in cui si verifichi un problema di produzione) e quindi applicare una patch per postare solo per avviare il server.

Qui nel playbook originale l'arresto e l'avvio facevano parte di ruoli diversi nello stesso playbook, ma questo può essere gestito con l'uso dei tag. Possiamo fornire tag diversi a ruoli diversi (che a loro volta avranno compiti) e quindi in base ai tag forniti dall'esecutore viene eseguito solo quel ruolo / compito specificato. Quindi, per l'esempio sopra fornito, possiamo aggiungere tag come il seguente:

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

Il seguente comando aiuta nell'utilizzo dei tag:

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

Con il comando precedente, verrà chiamato solo il ruolo start-tomcat. Il tag fornito fa distinzione tra maiuscole e minuscole. Assicurati che la corrispondenza esatta venga passata al comando.

Come limitare l'esecuzione da parte degli host

Esistono due modi per ottenere l'esecuzione di passaggi specifici su host specifici. Per un ruolo specifico, si definiscono gli host, in base a quali host specifici deve essere eseguito quel ruolo specifico.

Esempio

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

Come nell'esempio precedente, a seconda degli host forniti, verranno chiamati solo i rispettivi ruoli. Ora i miei host A e B sono definiti negli host (file di inventario).

Soluzione alternativa

Una soluzione diversa potrebbe essere la definizione degli host del playbook utilizzando una variabile, quindi il passaggio di un indirizzo host specifico tramite --extra-vars -

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

Esecuzione del Playbook

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

Se {{target}} non è definito, il playbook non fa nulla. Se necessario, è anche possibile passare un gruppo dal file hosts. Ciò non nuoce se non vengono fornite le variabili aggiuntive.

Playbook rivolto a un singolo host

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