Dominando Comandos Essenciais Ad-Hoc para Tarefas Rápidas do Ansible
Use comandos ad-hoc do Ansible para verificações rápidas, correções pontuais, alterações em arquivos e coleta de fatos sem escrever um playbook.
Dominando Comandos Ad-Hoc Essenciais para Tarefas Rápidas com Ansible
Os comandos ad-hoc do Ansible permitem executar uma tarefa rápida em um host ou em um grupo inteiro. Eles são úteis quando você precisa testar acesso, verificar espaço em disco, copiar um arquivo, reiniciar um serviço ou inspecionar fatos sem escrever um playbook primeiro.
Eles não substituem os playbooks. Use-os para trabalhos imediatos e, em seguida, mova tarefas repetidas ou arriscadas para automação versionada.
Estrutura Básica do Comando
Um comando ad-hoc segue esta forma:
ansible <padrão> -m <nome_do_módulo> -a "<argumentos_do_módulo>" [opções]
O padrão de host seleciona os alvos no inventário. O módulo decide o que o Ansible faz. Os argumentos passam valores específicos do módulo.
Opções comuns incluem:
-i <inventário>ou--inventory <inventário>: usar um arquivo de inventário ou fonte de inventário específica.-u <usuário>ou--user <usuário>: conectar-se como um usuário remoto específico.-bou--become: usar escalonamento de privilégios, geralmente sudo.-kou--ask-pass: solicitar a senha SSH.-Kou--ask-become-pass: solicitar a senha sudo.--limit <subconjunto>: restringir ainda mais os hosts selecionados.
Se você não passar -i, o Ansible usa seu inventário configurado. Em muitos sistemas, isso é /etc/ansible/hosts, mas seu ansible.cfg pode alterá-lo.
Testar Acesso com ping
O módulo ping não envia pacotes ICMP echo. Ele se conecta através do transporte normal do Ansible, executa um pequeno módulo no destino e espera pong de volta.
ansible all -m ping
Para um grupo:
ansible webservers -m ping
Um resultado bem-sucedido se parece com isso:
web01.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
Se isso falhar, corrija o inventário, DNS, chaves SSH, usuário remoto, configurações sudo ou disponibilidade do Python antes de solucionar problemas de tarefas de nível superior.
Executar Comandos Simples com command
O módulo command executa um programa diretamente no host remoto. Ele não invoca um shell, portanto pipes, redirecionamentos, expansão de glob e expansão de $VARIÁVEL não funcionam como fariam no seu terminal.
Verificar tempo de atividade:
ansible webservers -m command -a "uptime"
Verificar uso de disco:
ansible all -m command -a "df -h"
Listar um diretório protegido com sudo:
ansible dbservers -m command -a "ls -l /var/log" --become
Use command primeiro quando não precisar de recursos do shell. É mais fácil de entender e evita interpretação acidental do shell.
Use shell Apenas Quando Precisar de Recursos do Shell
O módulo shell executa o comando através de um shell no host remoto. Use-o para pipes, redirecionamentos, expansão de variáveis e condicionais do shell.
Encontrar os maiores diretórios de log:
ansible databases -m shell -a "du -sh /var/log/* | sort -rh | head -n 5"
Verificar uma variável de ambiente remota:
ansible all -m shell -a "printf '%s\n' \"$PATH\""
Tenha cuidado com entrada dinâmica. Se valores fornecidos pelo usuário forem inseridos em um comando shell sem aspas e validação, você pode criar um bug de injeção de comando.
Para edições de arquivos, prefira um módulo específico em vez de redirecionamento do shell. Por exemplo, adicione uma linha gerenciada com lineinfile:
ansible webservers -m lineinfile -a "path=/etc/app/app.conf line='feature_enabled=true' create=yes" --become
Isso é mais seguro e repetível do que anexar com echo ... >> arquivo.
Copiar Arquivos com copy
O módulo copy transfere arquivos do seu nó de controle para os hosts gerenciados.
ansible webservers -m copy -a "src=./myscript.sh dest=/tmp/myscript.sh mode=0755"
Copiar um arquivo de configuração que requer propriedade root:
ansible all -m copy -a "src=./app.conf dest=/etc/app/app.conf owner=root group=root mode=0644" --become
Se o destino já tiver o mesmo conteúdo e metadados, o Ansible relata nenhuma alteração.
Gerenciar Caminhos com file
Use o módulo file para criar diretórios, remover caminhos, definir propriedade, definir permissões ou criar links simbólicos.
Criar um diretório:
ansible appservers -m file -a "path=/opt/my_app state=directory mode=0755 owner=app group=app" --become
Remover um arquivo antigo:
ansible host1 -m file -a "path=/tmp/old_file.txt state=absent"
Criar um link simbólico:
ansible appservers -m file -a "src=/opt/my_app/releases/current dest=/opt/my_app/current state=link"
Coletar Fatos com setup
O módulo setup coleta fatos sobre um host, incluindo SO, rede, CPU, memória e detalhes do dispositivo.
Coletar todos os fatos de um host:
ansible webserver1 -m setup
Filtrar fatos quando você precisa apenas de uma pequena parte:
ansible all -m setup -a "filter=ansible_distribution*"
A saída pode ser grande, então filtrar mantém a solução de problemas legível.
Escolher Comandos Ad-Hoc ou Playbooks
Use comandos ad-hoc para verificações rápidas e tarefas pontuais:
- Testar conectividade com
ping. - Verificar estado com
command. - Copiar um arquivo conhecido com
copy. - Criar ou remover um caminho com
file. - Coletar fatos durante a solução de problemas.
Use playbooks quando a tarefa for repetida, tiver várias etapas, for revisada por colegas de equipe ou arriscada o suficiente para exigir controle de versão e estrutura previsível.
Verificações de Segurança Antes de Executar
Verifique o padrão de host antes de executar qualquer coisa destrutiva:
ansible webservers --list-hosts
Use --limit quando quiser um raio de ação menor:
ansible all --limit web01.example.com -m ping
Lembre-se de que command e shell não são automaticamente idempotentes. Um comando como useradd deploy pode falhar na segunda execução, a menos que você o escreva defensivamente. Módulos como user, file, copy e lineinfile geralmente fornecem um comportamento de repetição mais seguro.
Conclusão
Os comandos ad-hoc do Ansible são melhores para operações rápidas e direcionadas. Comece com ping, use command para verificações simples, reserve shell para sintaxe real do shell e prefira módulos como copy, file, lineinfile e setup quando eles corresponderem ao trabalho.