Ansible +自动git拉入云中的虚拟机集群



美好的一天


我们有几个云群集,每个群集中都有大量虚拟机。 所有这些业务都在Hetzner'e托管。 在每个群集中,我们有一台主计算机,从中创建一个快照,并自动将其分发到群集中的所有虚拟机。

这种方案不允许我们正常使用gitlab-runners,因为当出现许多相同的已注册运行器时会出现很多问题,这促使我们找到了解决方法并撰写了本文/手册。

这可能不是最佳实践,但是此解决方案似乎尽可能方便和简单。

对于本教程,我要求一只猫。

主计算机上所需的软件包:

  • 蟒蛇
  • 吉特
  • 带有ssh密钥的文件

在所有虚拟机上实施自动肠道拉动的一般原则是,您需要一台将安装Ansible的计算机。 在此机器上,ansible将发送git pull命令并重新启动已更新的服务。 为此,我们在集群外部创建了一个单独的虚拟机,并安装在其上:

  • 蟒蛇
  • Ansible
  • gitlab运行器

由于组织方面的问题-您需要注册gitlab-runner,创建ssh-keygen,将此计算机的公共ssh密钥放在主计算机上的.ssh/authorized_keys ,打开端口22以在主计算机上可以访问。

现在配置ansible


因为我们的目标是使一切变为可能。 在/etc/ansible/ansible.cfg文件中/etc/ansible/ansible.cfg我们取消注释host_key_checking = False以便ansible不要求确认新机器。

接下来,您需要自动为ansible生成一个清单文件,该文件将从中提取您需要在其中进行git pull的机器的ip。

我们使用Hetzner API生成此文件,但是您可以从AWS,Asure数据库中获取主机列表(您有某个API可以显示正在运行的计算机,对吗?)。

清单文件的结构对于Ansible非常重要,其外观应如下所示:

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


为了生成这样的文件,让我们做一个简单的脚本(我们称它为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 

现在是时候检查ansible是否有效,并且是与ip地址接收者的朋友:

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

输出应接收在其上执行命令的计算机的主机名。
关于语法的几句话:

  • /etc/ansible/./vm_list-生成机器列表
  • -i-库存文件的绝对路径
  • -m-告诉Ansible使用shell模块
  • -a是一个参数。 任何团队都可以在这里输入。
  • group是集群的名称。 如果需要在所有群集上执行此操作,请将组更改为全部

继续-尝试在我们的虚拟机上进行git pull:

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

如果我们在输出中看到最新的信息,或者从存储库中卸载,那么一切正常。

现在这是什么意思


我们教给我们的脚本在gitlab的master分支中提交时自动执行

首先,我们将使脚本更漂亮,并将其放在可执行文件中(我们称之为exec_pull)-

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

我们转到gitlab并在项目中创建文件.gitlab-ci.yml
在里面放了以下内容:

 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 

一切准备就绪。 现在-

  • 提交
  • 庆幸一切正常

将.yml移植到其他项目时,只需更改要重新启动的服务名称以及将在其上执行ansible命令的群集的名称。

Source: https://habr.com/ru/post/zh-CN472064/


All Articles