Ansible é uma excelente ferramenta para automatização de tarefas.
Cria-se uma lista de computadores e instalando neles um servidor SSH e Python 3, é possível automatizar a instalação de programas, alteração de configurações e, o meu favorito, atualização dos computadores.
No maior estilo do TDD (Test Driven Development), muitas vezes, queremos ter certeza que algo está funcionando antes de prosseguir com a execução do playbook.
Exemplos destes casos são:
- A nova configuração funciona?
- O usuário realmente pode (não pode) usar usar sudo?
- Login do usuário root está mesmo desativado?
- O firewall liberou/bloqueou a porta HTTP?
Podemos criar testes como esses com certa facilidade e inclusive podemos escolher entre a máquina remota ou local para executar os comandos, o que é essencial para alguns testes.
Abaixo mostro dois exemplos, testando as permissões de um usuário do servidor remoto e testando se o computador local pode fazer login como root.
# Arquivo: tasks/testes.yml
---
- name: TESTE Verificar se o usuário 'admin' pode usar SUDO sem senha
# Teste no servidor remoto:
# - su admin -c "xxx": executa o comando xxx como admin;
# - whoami: imprime o nome do usuário; e
# - Esperamos que imprima 'admin' (sem o sudo) e em seguida
# imprima 'root' (com sudo).
ansible.builtin.command: |
su admin -c "whoami; sudo whoami"
register: result
changed_when: false
failed_when: >
result.stdout_lines[0] != 'admin'
or result.stdout_lines[1] != 'root'
timeout: 5
- name: TESTE Negar login do usuário 'root' port SSH
# Teste no computador local:
# - SSH, ativando senha e desativando chave pública;
# - whoami: um comando qualquer para ser executado; e
# - Esperamos que a tentativa de login seja negada.
ansible.builtin.command: >
ssh -oPasswordAuthentication=yes -oPubkeyAuthentication=no
-p{{ ansible_port }} root@{{ ansible_host }} whoami
register: result
changed_when: false
failed_when: "'Permission denied (publickey)' not in result.stderr"
timeout: 5
# Esta parte final definie que o teste é executado no computador local
# (que executa o Ansible).
# Desativamos ansible_become para que use o usuário atual, em vez de
# usar sudo para se tornar root.
delegate_to: localhost
vars:
ansible_become: false