本文是关于应用程序的自动化配置和部署。如果您的架构未使用容器类型的技术(例如Docker),则可能是在Linux上安装虚拟机甚至物理服务器。在这方面,Ansible允许您通过编写playbook自动在服务器上安装和配置软件。可用的范围从最简单到最复杂,从安装软件包到安装多个软件及其完整配置。

为了应用这些roles并对其进行自定义,我们将使用yaml格式的playbook文本文件,其中包含要应用于服务器或目标服务器组的角色列表。这些playbook可能包含有价值的参数,以使我们的安装更具针对性。显然,通过源代码管理器对Playbook进行版本控制是首选的。

- 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。

stage('Deploiement Ansible') {
    ansiblePlaybook (
      colorized: true, 
      become: true,
      playbook: 'ansible-playbooks/mariadb.yml'
   )
}

为了使其更有趣,这些playbook应该能够依靠参数来运行。例如,指定目标计算机,然后为每种类型的playbook指定一组配置。为此,通过阅读文档,我们意识到调用ansible二进制文件时完全可以传递参数

$ ansible-playbook monplaybook --extra-vars ="my var"

这非常适合我们,因为它将使我们的工作更加轻松。例如,对于我的mariaDB 10.1 Playbook,我决定配置root密码,并创建数据库和对该数据库具有管理员权限的用户(登录名,密码) 。

为了能够通过Jenkins增强这些元素的配置性,第一个想法是修改playbook以能够配置不同的元素:

- 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命令:

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作业准备在任何引用的计算机上运行一次或多次,并且可以通过图形界面和作业配置简单地执行这些作业。全部运行时无需输入密码。


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐