How to Copy files between remote hosts in ansible
- 0
How to Copy files between remote hosts in ansible ?. is the purpose behind this article. Cada artigo que eu fui ler estava me dando sugestões, mas nada prático. Eu simplesmente queria fazer um rsync ansible. Eu queria executar rsync
entre hosts remotos e copiar arquivos entre hosts remotos.
Então aqui está o artigo orientado a exemplo. Neste post, vamos discutir as duas principais opções disponíveis para copiar os arquivos entre servidores remotos ou remoto para remoto.
Quando queremos copiar arquivos de um host para outro host, em geral, a primeira coisa que vem à nossa mente é SCP e ansible ter um módulo dedicado para o mesmo nome COPY
Se você quiser copiar um arquivo de um Ansible Control Master para hosts remotos, o módulo COPY (scp) seria muito bom. Mas precisamos de algo mais quando queremos copiar os ficheiros entre hosts remotos ou copiar ficheiros entre remotos para hosts remotos.
Vamos usar alguns dos módulos possíveis como copy, fetch, synchronize para cumprir o requisito de copiar os ficheiros entre hosts em ansible.
Embora já estejamos cientes do que é o módulo Ansible Copy é usado para.
Aqui está a introdução simples a Ansible Fetch e Ansible Synchronize.
Ansible Fetch é puxar os ficheiros do servidor remoto para a máquina de controlo.
Ansible Synchronize é usado para copiar os ficheiros entre servidores remotos (ou) hosts alvo. Isto é mais como executar RSYNC com ajuda do Ansible.
Table of Contents
The Index
- The Plan / The Requirement
- Método1: Copiar arquivos entre hosts remotos usando o módulo fetch
- Método2: Copiar arquivo entre hosts remotos usando o módulo synchronize
- Synchronize Push
- Synchronize Pull
>
- A saída de execução
- Referências e outros artigos relacionados.
O Plano / O Requisito
Para começar, vamos definir algum requisito nós mesmos para que, pudéssemos nos relacionar e estar na mesma página.
Temos dois servidores nomeados da seguinte forma
- mwiappi01
- mwiapp02
O requisito é copiar um ficheiro de mwiapp01 para mwiapp02. Antes de prosseguirmos, este é o diagrama de infra-estrutura da nossa configuração.
Não se confunda com o nome Master. É apenas uma máquina de controle. Lembre-se que Ansible é agente menos. portanto não há mestre e escravo.
Método1: Copiar de app01 para app02 usando o módulo fetch
NÃO É necessária autenticação SSH entre nós remotos para este método
Esta é a melhor e mais fácil opção para transferir arquivos entre os nós remotos Quando você não tem a autenticação baseada em chaves SSH ativada entre os nós remotos. No entanto, não é o caminho mais curto (ou) beeline. Funciona bem onde nosso foco principal é fazer o trabalho qualquer que seja a abordagem.
É um processo de dois passos quando se trata deste método.
Passo1: Vá buscar o ficheiro do servidor remoto (fonte) para o master possível
Passo2: Empurre (Copie) o ficheiro do master possível para o servidor remoto ( destino)
Aqui o master age como um buffer onde os ficheiros são temporariamente armazenados e depois transferidos.
Considerar o seguinte playbook que executa ambas estas tarefas acima mencionadas.
--- - hosts: app tasks: - name: Fetch the file from the mwiapp01 to master run_once: yes fetch: src=/tmp/app01-to-app02.jar dest=buffer/ flat=yes when: "{{{ inventory_hostname == 'mwiapp01' }}" - nome: Copie o arquivo do master para mwiapp02 copy: src=buffer/app01-to-app02.jar dest=/tmp/ when: "{{{ inventory_hostname == 'mwiapp02' }}"
em nenhum lugar que usamos "when"
para executar a execução baseada em condicional e inventory_hostname
é a variável interna possível que apontará o nome da máquina remota de execução atual.
Algumas vezes você pode precisar usar
ansible_hostname
no lugar deinventory_hostname
Estamos basicamente instruindo o Ansible para executar a tarefa Fetch somente no servidor mwiapp01
e copiar a tarefa somente quando o mwiapp02
for o host de execução remota atual.
Método 2: Cópia do app01 para app02 usando o módulo de sincronização
A autenticação baseada em chaves SSH deve ser habilitada entre hosts remotos
Para sincronizar o módulo para trabalhar sem problemas,a autenticação baseada em chaves SSH deve ser habilitada entre nós remotos. Caso contrário, a tarefa de sincronização ficará presa e o seu Ansible play.
Em outras palavras, os nós remotos devem ser capazes de fazer login uns aos outros sem ter que digitar a senha manualmente. Conseguimos isso principalmente com a ajuda da chave SSH.
Como dito anteriormente. Ansible Synchronize é mais como Ansible RSYNC. o típico recurso rsync
do Linux.
Para saber como habilitar a autenticação baseada em chaves apenas em segundos, consulte o seguinte artigo
Ativar autenticação baseada em chaves SSH usando Ansible
A partir do momento que estamos prontos com a autenticação baseada em chaves SSH. Estamos prontos para reproduzir a jogada. ( playbook).
Existem dois métodos para copiar arquivos usando o módulo Synchronize
- Synchronize Pull
- Synchronize Push
Considerando os seguintes playbooks que copiam o arquivo de mwiapp01
a mwiapp02
usando ambos os métodos Synchronize Pull e Synchronize Push
Synchronize Pull
Apontado para: Source Server (mwiapp01)
Delegated to and Executed on: Servidor de Destino (mwiapp02)
Explicação: Como está sendo executado no servidor de destino onde o arquivo tem que chegar. A tarefa é puxar o arquivo do servidor de origem (ou) fonte.
Aqui está o playbook que é executado no servidor de destino mwiapp02
com ajuda de delegação e pulls
o arquivo do mwiapp01 ao mwiapp02
---- nome: Sync Pull task - Executado no host de destino "{{{groups}}" hosts: "utilizador: wlsusr tasks: - nome: Copiar o ficheiro de mwiapp01 para mwiapp02 usando o método Pull tags: sync-pull synchronize: src: "{{{{ item }}" dest: "{{{ item }}" modo: pull delegate_to: "{{{{grupos}}" register: syncfile run_once: true with_items: - "/tmp/app01-para-app02.jar"
Você pode pensar que o playbook está configurado para executar no primeiro servidor, já que a diretiva hosts
tem como alvo o primeiro servidor. hosts: "{{group}}"
mwiapp01
Mas você tem que notar que nós estamos realmente executando esta tarefa no segundo servidor mwiapp02
com a ajuda de delegate_to
Localize o seguinte registro de tela para entender melhor isto.
Synchronize Push
Target to: Servidor de Destino (mwiapp02)
Delegado para e Executado em: Servidor fonte (mwiapp01)
Explicação: Como está sendo executado no servidor de origem onde o arquivo já está presente. A tarefa é empurrar o arquivo para o servidor de destino
Aqui está o playbook que é executado no servidor fonte mwiapp01
e pushes
o arquivo de 01 a 02
- nome: Sync Push task - Executado nos hosts fonte "{{{groups}}": "utilizador: wlsusr tasks: - nome: Copiar o ficheiro de mwiapp01 para mwiapp02 usando o método Push tags: sync-push synchronize: src: "{{{{ item }}" dest: "{{{ item }}" modo: push delegate_to: "{{{{grupos}}" register: syncfile com_items: - "/tmp/app01-para-app02.jar"
Pode pensar que o playbook está configurado para executar no segundo servidor, pois a diretiva hosts
tem como alvo o primeiro servidor. hosts: "{{group}}"
mwiapp02
Mas você tem que notar que estamos realmente executando esta tarefa no primeiro servidor mwiapp01
com a ajuda de delegate_to
O Playbook é composto de duas listas de tarefas baseadas em host. A primeira roda usando Synchronize Pull irá rodar em mwiapp02
e a segunda com Synchronize Push irá rodar em mwiapp01
Though the playbook is intelligible ( fácil de entender). Eu sinto que existem algumas linhas peculiares que precisam de mais explicações, como "{{groups}}"
Representa o primeiro elemento (ou) servidor do grupo hospedeiro chamado “app” assim como um array
Espera que a imagem seguinte o deixe claro.
Outras duas linhas importantes no arquivo são as seguintes
- mode Representa o modelo do Synchronize. Ou Synchronize pull ou Synchronize push
- delegar_a Ele diz a um possível, onde o comando da tarefa (ou) deve realmente ser executado.
Espera que você já o tenha obtido. delegate_to
e o hosts
junto com o mode
no ansible-playbook, trabalham juntos para tornar possível a execução remota (ou) cópia entre nós remotos.
Execution Output
Na captura de tela anterior, nós executamos 3 comandos. O primeiro e o último é um comando ad-hoc Ansible para verificar a disponibilidade do ficheiro sob a directoria /tmp
em mwiapp02
server
usamos
--limit
para executar o comando em apenas um servidor, apesar de usarmos o hostgroup que contém dois servidores.
copiámos com sucesso um ficheiro de mwiapp01 para mwiapp02 usando ambos os módulos Fetch e Synchronize.
Conclusion
Neste post, aprendemos e executámos com sucesso como copiar ficheiros entre hosts remotos usando uma possível cópia e módulos fetch. Aprendemos dois métodos para copiar os arquivos entre hosts usando ansible.
Espera que você ache este artigo útil.
- Referência do módulo Ansible Copy module
- Referência do módulo Ansible Fetch
- Referência do módulo Ansible Synchronize
- Como copiar ou trocar a chave SSH entre vários hosts – Ansible
- Como trocar o arquivo IP e atualizar /etc/hosts em vários hosts – Ansible
Hope este artigo ajuda. Se você gostou deste artigo, por favor compartilhe-o