Execução de Comandos Ad-hoc e Módulos Fundamentais no Ansible

Introdução ao Modo Ad-hoc

O modo Ad-hoc no Ansible refere-se à execução de comandos únicos e temporários diretamente na linha de comando, sem a necessidade de estruturar um playbook. Embora playbooks sejam ideais para orquestrações complexas e idempotentes, os comandos ad-hoc são perfeitos para tarefas rápidas e pontuais. Essa execução depende de módulos nativos (como command, shell, file, cron). Para explorar o catálogo disponível, utilize ansible-doc -l. Para detalhes de parâmetros de um módulo específico, use ansible-doc -s [nome_do_modulo] ou ansible-doc [nome_do_modulo] para a documentação completa.

Sintaxe de Execução

A estrutura básica de um comando ad-hoc segue o padrão abaixo:

ansible [inventário] -m [módulo] -a '[argumentos]' [opções_ansible]
  • Inventário: Hosts ou grupos definidos no arquivo de inventário (ex: /etc/ansible/hosts) ou gerados dinamicamente via scripts.
  • Módulo: A ferramenta a ser executada. Se omitido, o Ansible assume o módulo command (comportamento configurável via ansible.cfg).
  • Argumentos: Parâmetros específicos exigidos pelo módulo escolhido.
  • Opções Ansible: Flags adicionais da CLI, como autenticação, uso de escalonamento de privilégios, etc.

Gerenciamento de Usuários e Privilégios

Em ambientes de produção, é uma prática de segurança evitar o uso direto do usuário root. Recomenda-se criar um usuário dedicado com permissões de escalonamento de privilégios via sudo.

1. Preparação no nó gerenciado:

# Criar o usuário de automação
useradd automation_user

# Configurar sudo sem senha
echo "automation_user ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/automation_user
chmod 0440 /etc/sudoers.d/automation_user

# Preparar diretório SSH
mkdir -p /home/automation_user/.ssh
chown automation_user:automation_user /home/automation_user/.ssh
chmod 0700 /home/automation_user/.ssh

2. Ajustes no nó de controle (ansible.cfg):

[defaults]
remote_user = automation_user
ask_pass = False

[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False

3. Distribuição de chaves SSH:

# No nó de controle, copiar a chave pública para o nó alvo
ssh-copy-id -i ~/.ssh/id_ed25519.pub automation_user@node01.internal.local

Módulos de Execução de Comandos

Existem quatro módulos principais para execução de comandos no sistema operacional:

  • command: Executa comandos simples. Não suporta variáveis de ambiente ou operadores de shell como |, <, >, &.
  • shell: Similar ao command, mas processa a string através de um shell (/bin/sh), suportando pipes e redirecionamentos.
  • raw: Executa comandos diretamente via SSH, sem depender do Python no nó alvo. Útil para bootstrapping (instalar Python em sistemas novos).
  • script: Transfere um script local para o nó remoto e o executa.

Nota: O módulo raw não suporta parâmetros como chdir, creates ou removes, que são comuns nos demais módulos de execução.

Catálogo de Módulos Essenciais

1. command

Executa comandos nativos. Parâmetros úteis incluem chdir (diretório de trabalho), creates (idempotência se o arquivo existir) e removes (idempotência se o arquivo não existir).

# Executar no diretório /opt/logs e criar um arquivo de marcador
ansible webservers -m command -a 'chdir=/opt/logs touch execution.marker'

# Verificar uptime apenas se o arquivo de lock não existir
ansible webservers -a 'creates=/var/run/app.lock uptime'

2. script

Executa scripts locais nos nós remotos.

#!/bin/bash
# Conteúdo do script local: health_check.sh
free -m
df -h /var

ansible dbservers -m script -a './health_check.sh'

3. ping

Verifica a conectividade e a disponibilidade do Python nos nós.

ansible all -m ping

4. file

Gerencia atributos de arquivos, diretórios e links simbólicos.

# Criar um diretório com permissões específicas
ansible appservers -m file -a 'path=/opt/myapp/data state=directory owner=appuser group=appgroup mode=0750'

# Criar um link simbólico
ansible appservers -m file -a 'src=/opt/myapp/releases/current dest=/opt/myapp/active state=link'

# Remover um diretório recursivamente
ansible appservers -m file -a 'path=/opt/myapp/tmp state=absent'

5. copy

Transfere arquivos do nó de controle para os nós gerenciados.

# Copiar arquivo com backup do original e validação de permissões
ansible appservers -m copy -a 'src=./configs/app.conf dest=/etc/myapp/app.conf backup=yes owner=root mode=0644'

# Injetar conteúdo diretamente sem arquivo de origem
ansible appservers -m copy -a 'content="ENV=production\nDEBUG=false" dest=/etc/myapp/env.conf'

6. yum / apt (Gerenciadores de Pacotes)

Instala, atualiza ou remove pacotes. (Exemplo com yum/dnf).

# Garantir que o pacote esteja na versão mais recente
ansible webservers -m yum -a 'name=nginx state=latest'

# Instalar um grupo de pacotes
ansible webservers -m yum -a 'name="@Web Server" state=present'

7. service / systemd

Controla o estado e a inicialização de serviços.

# Iniciar o serviço e habilitar no boot
ansible webservers -m service -a 'name=nginx state=started enabled=yes'

# Recarregar configurações do systemd e reiniciar serviço
ansible webservers -m service -a 'name=myapp daemon_reload=yes state=restarted'

8. cron

Gerencia tarefas agenaddas no sistema.

# Agendar limpeza de logs à meia-noite
ansible appservers -m cron -a 'name="Log cleanup" minute="0" hour="0" job="find /var/log/myapp -name *.log -mtime +7 -delete"'

# Remover uma tarefa agendada
ansible appservers -m cron -a 'name="Log cleanup" state=absent'

9. user e group

Administra usuários e grupos do sistema operacional.

# Criar grupo
ansible dbservers -m group -a 'name=dbadmins state=present'

# Criar usuário com senha criptografada (SHA-512)
# Gerar hash localmente: python3 -c 'import crypt; print(crypt.crypt("MySecretPass", crypt.mksalt(crypt.METHOD_SHA512)))'
ansible dbservers -m user -a 'name=dbadmin group=dbadmins shell=/bin/bash password="$6$rounds=656000$salt$hash..."'

10. synchronize

Wrapper para rsync, ideal para sincronização eficiente de diretórios.

# Sincronizar diretório local para o remoto, excluindo arquivos .git
ansible webservers -m synchronize -a 'src=/repo/webapp/ dest=/var/www/html/ rsync_opts="--exclude=.git"'

11. filesystem e mount

Formatação e montagem de dispositivos de bloco.

# Criar sistema de arquivos XFS
ansible storage_nodes -m filesystem -a 'fstype=xfs dev=/dev/nvme1n1'

# Montar o dispositivo e adicionar ao fstab
ansible storage_nodes -m mount -a 'path=/data src=/dev/nvme1n1 fstype=xfs state=mounted opts=defaults,noatime'

12. get_url

Download de arquivos via HTTP, HTTPS ou FTP.

# Baixar binário e verificar checksum SHA256
ansible appservers -m get_url -a 'url=https://releases.example.com/tool.tar.gz dest=/opt/tool.tar.gz checksum=sha256:a1b2c3d4e5f6...'

13. unarchive

Extrai arquivos compactados nos nós remotos.

# Extrair arquivo local para o diretório remoto
ansible appservers -m unarchive -a 'src=/local/path/tool.tar.gz dest=/opt/ remote_src=no creates=/opt/tool/bin/executable'

14. debug

Exibe variáveis e mensagens para depuração de playbooks e comandos.

# Imprimir mensagem formatada
ansible localhost -e 'app_version=2.1.0' -m debug -a 'msg="Deploying version {{ app_version }}"'

# Imprimir o conteúdo de uma variável complexa
ansible localhost -e 'config_data={"port": 8080}' -m debug -a 'var=config_data'

Tags: Ansible ad-hoc configuration-management devops Linux

Publicado em 8-1 09:03