
美好的一天
我们有几个云群集,每个群集中都有大量虚拟机。 所有这些业务都在Hetzner'e托管。 在每个群集中,我们有一台主计算机,从中创建一个快照,并自动将其分发到群集中的所有虚拟机。
这种方案不允许我们正常使用gitlab-runners,因为当出现许多相同的已注册运行器时会出现很多问题,这促使我们找到了解决方法并撰写了本文/手册。
这可能不是最佳实践,但是此解决方案似乎尽可能方便和简单。
对于本教程,我要求一只猫。
主计算机上所需的软件包:在所有虚拟机上实施自动肠道拉动的一般原则是,您需要一台将安装Ansible的计算机。 在此机器上,ansible将发送git pull命令并重新启动已更新的服务。 为此,我们在集群外部创建了一个单独的虚拟机,并安装在其上:
由于组织方面的问题-您需要注册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
):
现在是时候检查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)-
我们转到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命令的群集的名称。