本文介绍使用Gitlab CI和Ansible在大型基础架构中更改本地命令服务器上的全局设置的能力/思想/概念。
假设您有20个开发团队和1个admin / DevOps团队。 如何在所有服务器上更改管理员密码? 如何将企业根证书添加到所有服务器? 等等
它解决什么问题?
典型情况:
有全局管理员/ DevOps。
有全局设置(NTP,DNS,代理等)
有本地开发团队:TeamA,TeamB,TeamC,TeamD等。
有些开发人员只能访问其团队的服务器。
如何添加/更新全局管理员,全局设置?

全局设置与本地命令设置分开存储在专用存储库中的事实使任务变得复杂。
如果整个公司中的服务器很少,则可以以简单的方式启动Ansible-立即开始更新所有服务器上的全局管理员和全局设置。
对于大型安装,公司通常使用Puppet,Chef。
概念图
为了在大型基础架构中更改本地命令服务器上的全局设置,我提出了git子模块机制。
具有本地设置的存储库使用具有全局设置的git子模块。
下面是将具有全局设置的私有存储库连接到本地命令存储库的示意图。

您可以使用Puppet,Chef,Salt在基础架构中使用git子模块来更新全局设置的概念,但是本文提供了Ansible的示例。
例如,安装tomcat,mysql,nginx并在一个名为team的团队中对其应用全局设置。
gitlab中有一个公共组,其中包含常规设置。
在公共组中,有一个基本引导项目,其中包含管理员,sysctl设置等。
通常在公司中有几个开发部门-通常将它们称为团队。
在gitlab中,创建一个团队组(您将拥有自己的团队名称)。
在团队组中,我们创建项目:应用程序,数据库,负载均衡器。
来自基本引导程序,应用程序,数据库,负载均衡器的屏幕截图:

base-bootstrap存储库作为git子模块包含在应用程序,数据库,负载均衡器存储库中。
每当存储库中的应用程序,数据库和负载均衡器开始更新base-bootstrap子模块时。
之后,将来自base-bootstrap的ansible-playbook和来自base-bootstrap的ansible-playbook应用于应用程序,数据库和负载均衡器服务器。

也就是说,如果您将新管理员添加到base-bootstrap或更改base-bootstrap中的系统设置,则对于应用程序,数据库,负载均衡器,base-bootstrap中的新设置将应用于应用程序,数据库,负载均衡器。
准备工作
您应该为初学者阅读有关Ansible的文章:
#从哪里开始
#Ansible指南
您必须在安装了docker的情况下部署gitlab和gitlab-runner。
这里以docker executor为例-您可以使用Shell executor。
如何部署gitlab和gitlab-runner:
#南桥Gitlab-CI文章
#在GitLab CI中持续集成和部署Docker
您应该有3台服务器(例如,在ubuntu上):应用程序,数据库,负载均衡器。
应用程序,数据库,负载均衡器是通用名称。
所有示例都可以被其他软件扩展,改进或使用-本文展示了一般原理。
如何实施
仓库和所有测试代码可以从这里获取: https : //github.com/patsevanton/ansible-gitlab-habr
如果使用用户名/密码访问服务器,则在所需的组(在本例中为团队)中创建userpassword变量(更改时,您还需要在代码中也更改变量)并在那里指定密码(密码中使用了密码password)
不要忘记在最终服务器上创建具有sudo权限的必要用户(该代码中使用了用户代码)。
对于使用SSH密钥访问服务器的用户,您需要在团队组中创建SSH_PRIVATE_KEY变量,并将用户的私钥添加到该变量中,该变量将连接到服务器。
这是连接服务器的简单示例,因此本文不涉及安全问题。
在每个存储库(应用程序,数据库,负载均衡器)中创建一个git子模块:
git submodule add git@gitlab.example.com:common/base-bootstrap.git git submodule add git@gitlab.example.com:team/team-users.git
需要子模块来访问共享的专用存储库。
在我们的例子中,这是具有base-bootstrap常规设置的存储库,以及team-users团队的用户存储库。
其中gitlab.example.com是您的gitlab服务器。
然后在.gitmodules中,我们将存储库的路径更改为相对
一个例子:
[submodule "team-users"] path = team-users url = ../team-users.git [submodule "base-bootstrap"] path = base-bootstrap url = ../../common/base-bootstrap.git
在主机的每个存储库中,我们将IP更改为我们自己的IP,在ansible.cfg中,将remote_user更改为我们的用户。
如果您在过去几个小时/天内没有任何提交,并且需要对服务器进行新的常规更改(例如,您需要添加新的管理员),在这种情况下,可以使用ansible-pull。
设置ansible-pull以下载通用的/ base-bootstrap存储库。
为此,添加部署令牌存储库。
转到通用/ base-bootstrap存储库,然后转到设置/存储库/部署令牌。
创建一个令牌。 生成的用户名和密码记录在base-bootstrap / vars / cron.yml中。
在检查完所有功能后,我认为有必要将ansible-pull的开始时间从“每2分钟”更改为适合您的时间。
如果ansible-pull下降,则意味着该服务的CI将下降,该CI在您每次提交到该服务存储库(即称为应用程序的服务)时开始
检查一下
创建一个新的管理员。
尝试在https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/users.yml中添加新管理员
系统变更
尝试在https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/sysctl.yml中添加/更改sysctl设置
向cron添加条目
尝试将cron条目添加到https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/cron.yml
扩展或安装您的应用程序
首先,您需要找到一个角色来安装应用程序。
转到https://galaxy.ansible.com/并找到安装应用程序的角色。
尝试使用服务器上控制台中的角色安装应用程序。 通常,所有角色在说明中都有说明。
例如,尝试在tomcat旁边安装java。 首先安装geerlingguy.java角色
ansible-galaxy install geerlingguy.java
创建与存储库相同的标准ansible.cfg。
创建库存:
[java] java ansible_host=IP-
创建一个剧本java.yml
- hosts: java become: yes vars_files: - vars/main.yml roles: - { role: geerlingguy.java }
运行ansible-playbook java.yml
如果一切顺利,则添加到所需的项目(在本例中为应用程序)
在robertdebock.tomcat的角色之后添加了geerlingguy.java的角色https://github.com/patsevanton/ansible-gitlab-habr/blob/master/team/application/tomcat-app.yml#L11
您需要在服务器上安装的所有其他应用程序也是如此。
剧本测试和安全性
为了简化本文,未解决密码存储和测试的问题。
有一些有关测试剧本的文章:
#Ansible:测试剧本(第1部分)
#与Molecule和Jenkins进行Ansible角色的测试和持续集成
问题答案
1)Mentat:毕竟为什么不将它与环境一起写在ansible基座中? 从一读看,它似乎是一次尝试重新发明它的尝试。 像ansible-playbook -i env / teamA personalAPlaybook.yml这样的应用程序非常方便
答:此方案可以更改全局设置。 问题中描述的是更改命令的本地设置。
PS也许在Ansible Tower中实现了相同的功能。 但是我对此无话可说-我没有与Ansible Tower合作。