Ansible + auto git pull em um cluster de máquinas virtuais na nuvem

Ansible + auto git pull em um cluster de máquinas virtuais na nuvem

Bom dia

Temos vários clusters de nuvem com um grande número de máquinas virtuais em cada um. Hospedamos todo esse negócio na Hetzner. Em cada cluster temos uma máquina mestre, um snapshot é obtido dela e distribuído automaticamente para todas as máquinas virtuais do cluster.

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

Esta provavelmente não é a melhor prática, mas esta solução parecia tão conveniente e simples quanto possível.

Para o tutorial, consulte cat.

Pacotes necessários na máquina mestre:

  • python
  • git
  • arquivo com chaves ssh

O princípio geral de implementação do gut pull automático 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. Para isso, criamos uma máquina virtual separada fora dos clusters e instalamos nela:

  • python
  • ansible
  • gitlab-runner

Por questões organizacionais - você precisa registrar o gitlab-runner, fazer ssh-keygen, fazer upload da chave ssh pública desta máquina para .ssh/authorized_keys na máquina master, abra a porta 22 para ansible na máquina master.

Agora vamos configurar o ansible

Pois nosso objetivo é automatizar tudo o que for possível. No arquivo /etc/ansible/ansible.cfg vamos descomentar a linha host_key_checking = Falsepara que o ansible não peça confirmação de novas máquinas.

A seguir, você precisa gerar automaticamente um arquivo de inventário para o ansible, de onde ele tirará o ip das máquinas nas quais você precisa fazer o git pull.

Geramos esse arquivo usando a API da Hetzner, você pode pegar a lista de hosts do seu banco de dados 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; deve ficar assim:

[группа]
ip-адрес
ip-адрес

[группа2]
ip-адрес
ip-адрес

Para gerar tal arquivo, faremos um script simples (vamos chamá-lo 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 é amigável no recebimento de endereços IP:

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

A saída deve conter os nomes de host das máquinas nas quais o comando foi executado.
Algumas palavras sobre 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 é o argumento. Qualquer comando pode ser inserido aqui
  • grupo – o nome do seu cluster. Se você precisar fazer isso em todos os clusters, altere o grupo para todos

Vamos mais longe - vamos tentar fazer 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 na saída vemos já atualizado ou descarregando do repositório, então tudo está funcionando.

Agora é para isso que tudo foi feito

Vamos ensinar nosso script a ser executado automaticamente ao fazer commit no branch master no gitlab

Primeiro, vamos deixar nosso script mais bonito e colocá-lo 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 criar um arquivo no projeto .gitlab-ci.yml
Colocamos o seguinte dentro:

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 

Tudo está pronto. Agora -

  • faça um commit
  • Estou feliz que tudo esteja funcionando

Ao transferir .yml para outros projetos, basta alterar o nome do serviço a ser reiniciado e o nome do cluster no qual os comandos ansible serão executados.

Fonte: habr.com

Adicionar um comentário