Transferindo Arquivos com Segurança: Usando os Módulos Ansible Copy e Fetch
Ansible é conhecido por suas capacidades de gerenciamento de configuração, mas mover arquivos de forma eficaz entre a máquina de controle e os nós gerenciados é um requisito fundamental para qualquer estratégia de implantação. Seja para implantar um arquivo de configuração personalizado, enviar um artefato de implantação ou recuperar logs do sistema, o processo deve ser rápido, confiável e seguro.
Este artigo foca nos dois módulos primários para transferência de arquivos: copy e fetch. Demonstraremos como aproveitar esses módulos usando a poderosa estrutura de comando ad-hoc do Ansible, permitindo operações de arquivo rápidas e únicas sem a necessidade de escrever um playbook completo. Ao final deste guia, você estará proficiente em enviar arquivos locais com segurança para sistemas remotos e puxar arquivos necessários de volta para seu nó de controle Ansible.
Pré-requisitos
Antes de executar os exemplos abaixo, certifique-se de ter o seguinte:
- Nó de Controle Ansible: Uma máquina com Ansible instalado.
- Arquivo de Inventário: Um arquivo de inventário operacional (por exemplo,
/etc/ansible/hosts) definindo seus nós gerenciados. - Conectividade: Acesso via chave SSH configurado para seus hosts remotos.
Todos os exemplos assumirão que o grupo alvo é chamado webservers no inventário.
Entendendo os Comandos Ad-Hoc para Transferência de Arquivos
Comandos ad-hoc são comandos de linha única executados diretamente do terminal, ideais para tarefas rápidas que não justificam um playbook permanente. A estrutura básica é:
ansible <grupo-de-hosts> -m <nome-do-modulo> -a "chave=valor chave2=valor2 ..."
Para transferência de arquivos, usamos os nomes dos módulos -m copy ou -m fetch, passando os argumentos necessários usando a flag -a.
O Módulo copy: Enviando Arquivos para Nós Remotos
O módulo copy é usado para transferir um arquivo localizado na máquina de controle Ansible para um ou mais nós gerenciados. Este é o método padrão para implantar arquivos de configuração, scripts ou pequenos ativos.
Argumentos Chave para copy
O módulo copy requer dois argumentos essenciais e aceita vários argumentos opcionais para gerenciamento de configuração:
| Argumento | Descrição | Obrigatório? | Exemplo de Valor |
|---|---|---|---|
src |
O caminho absoluto para o arquivo na máquina de controle Ansible. | Sim | /tmp/config.conf |
dest |
O caminho absoluto onde o arquivo será colocado no nó gerenciado remoto. | Sim | /etc/app/config.conf |
owner |
Nome do usuário que deve possuir o arquivo no nó remoto. | Não | nginx |
group |
Nome do grupo que deve possuir o arquivo no nó remoto. | Não | www-data |
mode |
Permissões (octal) a serem definidas no arquivo de destino. | Não | 0644 |
backup |
Se yes, cria um arquivo de backup antes de sobrescrever o original. |
Não | yes |
Exemplo 1: Implantação Simples de Arquivo
Suponha que você tenha um arquivo de Mensagem do Dia (motd) personalizado localmente e queira enviá-lo para todos os servidores web.
# Caminho do arquivo local: /home/user/ansible/motd_banner
# Destino remoto: /etc/motd
ansible webservers -m copy -a "src=/home/user/ansible/motd_banner dest=/etc/motd"
Exemplo 2: Definindo Permissões e Propriedade
Se você estiver implantando um arquivo de configuração seguro, deve especificar o proprietário, grupo e permissões restritas (por exemplo, apenas o proprietário pode ler/escrever).
# Implantando um arquivo de configuração de aplicativo, de propriedade de 'app_user', grupo 'devops',
# com permissões de leitura/escrita apenas para o proprietário (0600).
ansible webservers -m copy -b -a "src=/tmp/app_settings.yaml dest=/etc/app/settings.yaml owner=app_user group=devops mode=0600"
Observação sobre
-b: A flag-b(ou--become) é necessária quando o destino remoto requer permissões elevadas (como escrever em/etc).
O Módulo fetch: Recuperando Arquivos de Nós Remotos
O módulo fetch realiza a operação inversa de copy: ele recupera um arquivo do nó gerenciado de volta para a máquina de controle Ansible. Isso é útil para fazer backup de arquivos de configuração, recuperar logs ou coletar informações de diagnóstico.
Argumentos Chave para fetch
O módulo fetch requer o arquivo de origem no nó remoto e um diretório de destino na máquina de controle.
| Argumento | Descrição | Obrigatório? | Exemplo de Valor |
|---|---|---|---|
src |
O caminho absoluto para o arquivo no nó gerenciado remoto. | Sim | /var/log/nginx/error.log |
dest |
O caminho absoluto para o diretório na máquina de controle onde os arquivos serão salvos. | Sim | /tmp/backups/logs |
flat |
Se yes, o nome do arquivo resultante não conterá a estrutura do nome do host (não recomendado ao buscar de vários hosts). |
Não | no (padrão) |
Diferença Crítica: Estrutura de Destino
Ao contrário do módulo copy, o módulo fetch cria automaticamente um caminho de subdiretório estruturado com base no nome do host remoto para evitar colisões de nomes de arquivos ao recuperar arquivos de vários servidores.
O caminho resultante na máquina de controle será parecido com este:
<dest>/<hostname>/<src>
Por exemplo, buscar /etc/nginx/nginx.conf de host1 para /tmp/backups resulta em:
/tmp/backups/host1/etc/nginx/nginx.conf
Exemplo 3: Recuperando Backups de Configuração Remota
Para recuperar o arquivo de configuração em execução de todos os servidores web para um diretório de backup local:
# Recuperar nginx.conf de todos os servidores web para o diretório local /tmp/config_backups
ansible webservers -m fetch -a "src=/etc/nginx/nginx.conf dest=/tmp/config_backups"
Após executar este comando, se você direcionou webserver1 e webserver2, sua estrutura de diretórios local seria:
/tmp/config_backups/
├── webserver1
│ └── etc
│ └── nginx
│ └── nginx.conf
└── webserver2
└── etc
└── nginx
└── nginx.conf
Exemplo 4: Recuperando um Único Arquivo Sem Estrutura de Host (flat=yes)
Se você tiver certeza absoluta de que está apenas buscando um arquivo de um único host, ou se precisar apenas do conteúdo do arquivo (e não da estrutura de origem), você pode usar flat=yes. Isso resulta no arquivo sendo colocado diretamente na pasta de destino, nomeado após o arquivo remoto original.
# Recuperar um relatório de status de saúde local de um único host, salvando-o diretamente.
ansible webserver1 -m fetch -a "src=/tmp/health_status.txt dest=/tmp/reports flat=yes"
# Caminho resultante: /tmp/reports/health_status.txt
Aviso: Use
flat=yesapenas ao direcionar um único host ou se você pretende sobrescrever o arquivo em execuções subsequentes, pois o Ansible não evitará conflitos.
Melhores Práticas e Considerações de Segurança
Ao gerenciar arquivos usando Ansible, segurança e idempotência são primordiais:
1. Sempre Defina Permissões com copy
Nunca envie um arquivo de configuração sem definir explicitamente mode e owner. Se você confiar no umask padrão do sistema remoto, arquivos sensíveis (como chaves SSH ou credenciais de banco de dados) podem acabar com direitos de acesso excessivamente permissivos.
# Má Prática (Modo derivado do umask)
- name: Implantar chave insegura
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
# Boa Prática (Restringir explicitamente o acesso)
- name: Implantar chave segura
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
mode: '0600'
owner: root
2. Use backup=yes para Mudanças Críticas
Ao usar copy para sobrescrever um arquivo crítico existente (por exemplo, /etc/sudoers), inclua backup=yes. O Ansible criará uma cópia de backup com carimbo de data/hora no nó remoto antes de sobrescrever o arquivo, fornecendo uma opção fácil de reversão.
3. Considere o Módulo synchronize para Grandes Transferências
Embora copy e fetch sejam excelentes para operações ad-hoc rápidas e pequenos arquivos de configuração, se você precisar transferir grandes estruturas de diretórios ou precisar de transferências delta eficientes (apenas transferindo alterações), o módulo synchronize (que aproveita o rsync) é a ferramenta recomendada para desempenho e gerenciamento superiores.
Resumo
Os módulos copy e fetch são ferramentas indispensáveis no kit de ferramentas do administrador Ansible, fornecendo métodos robustos e seguros para manipular arquivos em uma infraestrutura. Ao dominar a sintaxe de comando ad-hoc e entender os argumentos chave, você pode gerenciar eficientemente artefatos de implantação e realizar operações necessárias de recuperação de dados sem a sobrecarga de criar playbooks completos para tarefas simples.
| Módulo | Direção | Exemplo de Comando Ad-Hoc |
|---|---|---|
copy |
Nó de Controle -> Nó Gerenciado | ansible all -m copy -a "src=/local/file dest=/remote/path mode=0644" |
fetch |
Nó Gerenciado -> Nó de Controle | ansible all -m fetch -a "src=/remote/file dest=/local/dir" |