
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
):
É 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) -
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.