本文是关于应用程序的自动化配置和部署。如果您的架构未使用容器类型的技术(例如Docker),则可能是在Linux上安装虚拟机甚至物理服务器。在这方面,Ansible允许您通过编写playbook自动在服务器上安装和配置软件。可用的范围从最简单到最复杂,从安装软件包到安装多个软件及其完整配置。
为了应用这些roles并对其进行自定义,我们将使用yaml格式的playbook文本文件,其中包含要应用于服务器或目标服务器组的角色列表。这些playbook可能包含有价值的参数,以使我们的安装更具针对性。显然,通过源代码管理器对Playbook进行版本控制是首选的。
代码语言:javascript复制- hosts: "monserveur.tld"
vars:
mariadb_version: '10.1'
mariadb_root_password:
- 'monpass'
mariadb_bind_address:
- '0.0.0.0'
mariadb_databases:
- name: 'mydb'
mariadb_users:
- name: 'mydbuser'
password: 'mydbpass'
priv: 'mydb.*:ALL,GRANT'
host: '192.10.%.%'
roles:
- role: bertvv.mariadb
使用Jenkins运行playbook
这个想法不一定得到广泛传播,让诸如Jenkins这样的自动化和任务编排工具去运行Ansible playbook非常容易。因此,使用Jenkins pipeline语言,您可以使用ansible_playbook方法,这将在Jenkins作业中执行作为参数传递的playbook。
代码语言:javascript复制stage('Deploiement Ansible') {
ansiblePlaybook (
colorized: true,
become: true,
playbook: 'ansible-playbooks/mariadb.yml'
)
}
为了使其更有趣,这些playbook应该能够依靠参数来运行。例如,指定目标计算机,然后为每种类型的playbook指定一组配置。为此,通过阅读文档,我们意识到调用ansible二进制文件时完全可以传递参数
代码语言:javascript复制$ ansible-playbook monplaybook --extra-vars ="my var"
这非常适合我们,因为它将使我们的工作更加轻松。例如,对于我的mariaDB 10.1 Playbook,我决定配置root密码,并创建数据库和对该数据库具有管理员权限的用户(登录名,密码) 。
为了能够通过Jenkins增强这些元素的配置性,第一个想法是修改playbook以能够配置不同的元素:
代码语言:javascript复制- hosts: "{{ variable_host | default('monserveur.tld') }}"
vars:
mariadb_version: '10.1'
mariadb_root_password:
- '{{ variable_dbrootpassword }}'
mariadb_bind_address:
- '0.0.0.0'
mariadb_databases:
- name: '{{ variable_dbname }}'
mariadb_users:
- name: '{{ variable_dbuser }}'
password: '{{ variable_dbpass }}'
priv: '{{ variable_dbname }}.*:ALL,GRANT'
host: '192.10.%.%'
roles:
- role: bertvv.mariadb
对于要在其上运行playbook的目标机器,我们决定向用户提供一个包含我们机器信息的下拉列表,并有可能在执行作业时输入新值。该下拉列表是使用Jenkins可扩展选择参数插件构建的。
为此,在安装插件后,我们转到Administer Jenkins>系统配置。在Extensible Choice: Available Choice Providers部分中,我们添加了以下新选择列表:
选择列表,使我们能够在作业执行期间选择目标服务器
现在,让我们回到Jenkins的Job,并将必要的参数添加到我们配置的Playbook中:
通过将这些参数传递给作业执行,我们可以自动安装mariaDB,增强root密码,使用给定名称创建新数据库,创建对该数据库具有权限的用户。
但是,最后一个参数是:Ansible要在目标计算机上执行命令,有必要将登录凭据传递给计算机。为此,我们使用Jenkins凭据管理功能,该功能使以安全的方式存储秘钥。这个模块允许我们在jenkins中存储登录名/密码对:
我们可以通过添加类型为Credentials的参数,以一种简单的方式将这些凭据传递给Jenkins作业:
然后,我们编辑作业的常规脚本,以将这组参数传递给ansible shell命令:
代码语言:javascript复制stage('Deploiement Ansible') {
withCredentials([usernamePassword(credentialsId: '${SUDOERIDENTIFIER}', passwordVariable: 'SUDOERPASS', usernameVariable: 'SUDOERLOGIN')]) {
ansiblePlaybook (
colorized: true,
become: true,
playbook: 'ansible-playbooks/mariadb.yml',
extras: '--extra-vars "variable_host=${HOSTNAME} variable_dbrootpassword=${ROOTPASSWORD} variable_dbname=${DBNAME} variable_dbuser=${DBUSER} variable_dbpass=${DBPASS} ansible_ssh_user=$SUDOERLOGIN ansible_ssh_pass=$SUDOERPASS ansible_sudo_pass=$SUDOERPASS"'
)
}
}
只需单击“使用参数启动构建”即可启动作业:
控制台结果与Ansible命令的输出相对应。
总结
因此,我们现在可以将Jenkins作业准备在任何引用的计算机上运行一次或多次,并且可以通过图形界面和作业配置简单地执行这些作业。全部运行时无需输入密码。