Ansible - Execução Avançada

Neste capítulo, aprenderemos o que é execução avançada com Ansible.

Como limitar a execução por tarefas

Esta é uma estratégia de execução muito importante, em que é necessário executar apenas uma execução e não todo o manual. For example, suponha que você deseja apenas parar um servidor (no caso de ocorrer um problema de produção) e, em seguida, postar a aplicação de um patch que gostaria de apenas iniciar o servidor.

Aqui, no manual original, parar e iniciar faziam parte de diferentes papéis no mesmo manual, mas isso pode ser resolvido com o uso de tags. Podemos fornecer tags diferentes para funções diferentes (que por sua vez terão tarefas) e, portanto, com base nas tags fornecidas pelo executor, apenas a função / tarefa especificada é executada. Portanto, para o exemplo acima fornecido, podemos adicionar tags como as seguintes -

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

O seguinte comando ajuda a usar tags -

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

Com o comando acima, apenas a função start-tomcat será chamada. A tag fornecida diferencia maiúsculas de minúsculas. Certifique-se de que a correspondência exata está sendo passada para o comando.

Como limitar a execução por hosts

Existem duas maneiras de realizar a execução de etapas específicas em hosts específicos. Para uma função específica, são definidos os hosts - em quais hosts específicos essa função específica deve ser executada.

Exemplo

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

Conforme o exemplo acima, dependendo dos hosts fornecidos, as respectivas funções somente serão chamadas. Agora meus hosts A e B estão definidos nos hosts (arquivo de inventário).

Solução Alternativa

Uma solução diferente pode ser definir os hosts do playbook usando uma variável e, em seguida, passar um endereço de host específico via --extra-vars -

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

Executando o Manual

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

Se {{target}} não estiver definido, o manual não fará nada. Um grupo do arquivo hosts também pode ser passado, se necessário. Isso não prejudica se o vars extra não for fornecido.

Manual direcionado a um único host

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