Jenkins自动化部署--集成ansible

2021-06-02 17:52:03 浏览数 (1)

与Ansible集成

ansible

Ansible采用了与Puppet、Chef不一样的解决方案,不需要在受控机器上安装额外的客户端软件。原因是Ansible使用的是SSH协议与受控机器进行通信的,一般服务器默认有SSH服务。Ansible也因此被称为agentless (去客户端的)。

Ansible也不像Puppet、Chef那样需要在一台相对稳定的机器上安装一个主控程序,好让所有的受控机器连接上来。只要是安装了Ansible的机器就可以作为主控机器,比如工作时用的电脑。

Puppet和Chef都自己做了一套DSL,而Ansible使用YAML格式作为自己的DSL格式。

笔者认为这是非常聪明的设计:一是大家都熟悉YAML格式;二是不需要自己设计DSL;三是不用自己写编译器( YAML可以直接映射到Python对象)。所以,在学习过程中,笔者发现相对Puppet.Chef ,Ansible简单得多。

Ansible将部署逻辑放在一个称为“playbook”的YAML文件中。通常,文件名是playbook.yml。

  1. ---
  2. - hosts: web
  3. tasks:
  4. - name: install nginx
  5. apt: name=nginx state=latest
  6. - hosts: db
  7. tasks:
  8. - name: install mysql
  9. yum:name={{item}}
  10. with_items:
  11. - 'mysql-common '
  12. - 'mysql-client'
  13. - 'mysql-server'

组织受控机器的逻辑被放在inventory文件中。它是ini格式的,默认文件名为hosts。

  1. [web]
  2. 1.1.1.1
  3. [db]
  4. 2.2.2.2

这两个文件构成了Ansible自动化部署的基础。 只要运行ansible-playbook–inventory hosts–user vagrant–ask-pass playbook.yml命令,输入SSH登录时用户vagrant的密码,就可以执行我们描述好的部署逻辑了。为简单起见,我们使用用户名和密码的方式登录。更安全的方式是使用SSH密钥登录。

以上就是对Ansible的基本介绍。如果读者想更深入地学习,请前往Ansible官网。

了解Ansible的隐喻,对于了解Ansible背后的设计有一定的帮助。Ansible的隐喻很简单: Ansible是导演,受控机器列表( inventory )为演员列表,开发者则是编剧。开发者只要把剧本( playbook.yml )写好,Ansible拿着剧本与invenstory一对上号,演员就会按照剧本如实表演,不会有任何个人发挥。

Jenkins与Ansible集成能让Jenkins执行ansible命令。是具体步骤如下: 1.安装Ansible插件

2.在主控机器上安装Ansible,并设置不进行host key检查。主控机器指的是真正执行ansible命令的机器,也就是Jenkins。我们需要在主控机器上自行安装Asible,然后修改主控机器的Ansible配置,不进行host key检查。

  1. $cat /etc/ansible/ansible.cfg
  2. [defaults]
  3. host_key_checking = False

如果要求安全级别高,则应该提前将所有受控机器的fingerprint放到主控机器的know_hosts文件中。

3.在Jenkins上进入Manage Jenkins→Global Tool Configuration→Ansible配置页面,配置Ansible的执行路径,如图12-1所示。 我们可以同时添加多个Ansible版本。请留意Name字段的值,后面介绍的ansiblePlaybook步骤会使用到。

4.在Jenkins上添加登录受控机器的凭证。Ansible与受控机器连接的凭证需要我们在Jenk-ins上手动添加。根据项目的实际情况,可以选择使用用户名和密码的方式或者用户名和密钥的方式登录。

5.在pipeline中加入ansiblePlaybook步骤 部署项目的目录结构如下:

  1. % tree
  2. |---- Jenkinsfile
  3. |---- hosts
  4. |---- playbook.yml

hosts文件内容如下:

  1. [example]
  2. 192.168.23.12

playbook.yml文件内容如下:

  1. ---
  2. - hosts: example
  3. tasks:
  4. - debug: msg="{{ lookup('env', 'BUILD_TAG') }}"

Jenkinsfile内容:

  1. pipeline {
  2. agent any
  3. stages {
  4. stage('Deploy') {
  5. steps {
  6. ansiblePlaybook(
  7. playbook: "${env.wORKSPACE}/playbook.yml",
  8. inventory: "${env.wORKSPACE}/hosts",
  9. credentialsId: 'vagrant'
  10. )
  11. }
  12. }
  13. }
  14. }

ansiblePlaybook步骤执行的是ansible-playbook命令,其中playbook参数是playook文件的路径,inventory参数是inventory文件的路径,credentialsld参数就是在上一步中添加的凭证ID。 最后打印日志如下∶

在执行日志中,密码并不会被明文打印出来。这样,Jenkins与Ansible的集成就算完成了。但是这只是刚刚开始,在实际工作中,我们还需要考虑自定义的公共role应该放在哪里等与Ansible相关的问题。

参数详解

ansiblePlaybook步骤除支持playbook、inventory、credetialsld三个参数外,还支持以下参数。

  • installation :字符串类型,值为前面设置的Name字段的值。此参数的作用不言自明,用于指定不同版本的Ansible。
  • vaultCredentialsld : Ansible vault密码在Jenkins 中的凭证ID。它相当于ansible命令行的–vault-password-file参数。
  • disableHostKeyChecking :布尔类型,是否进行host key检查。这个参数可以用来代替12.2.2节中的第2个步骤。
  • become :布尔类型,在执行操作时是否加上sudo。它相当于ansible命令行的–become参数。
  • becomeUser :字符串类型,切换到超级管理员用户名,默认是root。它相当于ansible命令行的–become-user参数。
  • limit :字符串类型,指定执行的主机。相当于ansible命令行的-I参数。多个主机之间使用逗号分隔。
  • tags :指定执行打上特定tag的任务。它相当于ansible命令行的-t参数。多个tag之间使用逗号分隔。
  • skippedTags :字符串类型,指定跳过哪些tag的任务。它相当于ansible命令行的–skip-tags参数。多个tag之间使用逗号分隔。
  • startAtTask :字符串类型,从指定任务开始执行。它相当于ansible命令行的–start-at-task参数
  • forks :并行执行的进程数。相当于ansible命令行的-f参数。
  • extras :字符串类型,扩展参数。当ansiblePlaybook步骤的参数无法满足需求时,可以使用此参数。比如extras : ‘–syntax-check’
  • extraVars : List < org.jenkinsci.plugins.ansible.ExtraVar>类型,扩展变量。它相当于ansible命令行的-e参数。使用它的方式比较特

0 人点赞