Ansible + auto git pull no cluster de máquina virtual na nuvem



Bom dia


Temos vários clusters de nuvem com um grande número de máquinas virtuais em cada uma. Todo esse negócio está hospedado em Hetzner'e. Em cada cluster, temos uma máquina principal, uma captura instantânea é feita e é distribuída automaticamente a todas as máquinas virtuais dentro do cluster.

Esse esquema não nos permite usar os corredores do gitlab normalmente, pois muitos problemas surgem quando muitos corredores registrados idênticos aparecem, o que nos levou a encontrar uma solução alternativa e a escrever este artigo / manual.

Provavelmente, essa não é a melhor prática, mas essa solução parecia o mais conveniente e simples possível.

Para o tutorial, peço um gato.

Pacotes necessários na máquina principal:

  • python
  • git
  • arquivo com chaves ssh

O princípio geral da implementação do pull automático do intestino em todas as máquinas virtuais é que você precisa de uma máquina na qual o Ansible será instalado. A partir desta máquina, o ansible enviará comandos git pull e reiniciará o serviço que foi atualizado. Criamos uma máquina virtual separada fora dos clusters para esses fins e instalamos nela:

  • python
  • ansible
  • gitlab-runner

De questões organizacionais - você precisa registrar o gitlab-runner, fazer o ssh-keygen, soltar a chave pública ssh desta máquina em .ssh/authorized_keys allowed_keys na máquina principal, abrir a porta 22 para ansible na máquina principal.

Agora configure ansible


Como nosso objetivo é automatizar tudo o que é possível. No arquivo /etc/ansible/ansible.cfg descomentamos a linha host_key_checking = False para que o ansible não solicite confirmação de novas máquinas.

Em seguida, você precisa gerar automaticamente um arquivo de inventário para o ansible, de onde ele coletará o ip das máquinas nas quais você precisa executar o git pull.

Geramos esse arquivo usando a API Hetzner. Você pode obter a lista de hosts do banco de dados da AWS, Asure (você tem uma API em algum lugar para exibir suas máquinas em execução, certo?).

A estrutura do arquivo de inventário é muito importante para o Ansible, sua aparência deve ser a seguinte:

 [] ip- ip- [2] ip- ip- 


Para gerar esse arquivo, vamos criar um script simples (vamos chamá-lo de vm_list ):

 #!/bin/bash echo [group] > /etc/ansible/cloud_ip && " CLI    IP    " >> /etc/ansible/cloud_ip echo " " >> /etc/ansible/cloud_ip echo [group2] > /etc/ansible/cloud_ip && " CLI    IP     " >> /etc/ansible/cloud_ip 

É hora de verificar se o ansible funciona e é amigo do destinatário dos endereços IP:

 /etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group 

A saída deve receber os nomes de host das máquinas nas quais o comando foi executado.
Algumas palavras sobre a sintaxe:

  • /etc/ansible/./vm_list - gera uma lista de máquinas
  • -i - caminho absoluto para o arquivo de inventário
  • -m - diz ao ansible para usar o módulo shell
  • -a é um argumento. Qualquer equipe pode ser inscrita aqui.
  • group é o nome do seu cluster. Se você precisar fazer em todos os clusters, altere group para all

Vá em frente - tente executar o git pull em nossas máquinas virtuais:

 /etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

Se já estivermos atualizados ou descarregados do repositório na saída, tudo funcionará.

Agora, o que tudo isso significou


Ensinamos nosso script a ser executado automaticamente ao confirmar no ramo mestre no gitlab

Primeiro, tornaremos nosso script mais bonito e o colocaremos em um arquivo executável (vamos chamá-lo de exec_pull) -

 #!/bin/bash /etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" 

Vamos ao nosso gitlab e, no projeto, criamos o arquivo .gitlab-ci.yml
Dentro colocamos o seguinte:

 variables: GIT_STRATEGY: none VM_GROUP: group stages: - pull - restart run_exec_pull: stage: pull script: - /etc/ansible/exec_pull 'cd /path/to/project/'$CI_PROJECT_NAME' && git pull' $VM_GROUP only: - master run_service_restart: stage: restart script: - /etc/ansible/exec_pull 'your_app_stop && your_app_start' $VM_GROUP only: - master 

Está tudo pronto. Agora -

  • fazer commit
  • alegrar-se que tudo funciona

Ao portar .yml para outros projetos, você só precisa alterar o nome do serviço para reinicialização e o nome do cluster no qual os comandos ansible serão executados.

Source: https://habr.com/ru/post/pt472064/


All Articles