与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。
---
- hosts: web
tasks:
-
- name: install nginx
apt: name=nginx state=latest
- hosts: db
tasks:
-
- name: install mysql
yum:name={{item}}
with_items:
-
-
'mysql-common '
-
-
'mysql-client'
-
-
'mysql-server'
组织受控机器的逻辑被放在inventory文件中。它是ini格式的,默认文件名为hosts。
[web]
1.1.1.1
[db]
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检查。
$cat /etc/ansible/ansible.cfg
[defaults]
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步骤 部署项目的目录结构如下:
% tree
|----
Jenkinsfile
|---- hosts
|---- playbook.yml
hosts文件内容如下:
[example]
192.168.23.12
playbook.yml文件内容如下:
---
- hosts: example
tasks:
-
- debug: msg="{{ lookup('env', 'BUILD_TAG') }}"
Jenkinsfile内容:
pipeline {
agent any
stages {
stage('Deploy')
{
steps {
ansiblePlaybook(
playbook:
"${env.wORKSPACE}/playbook.yml",
inventory:
"${env.wORKSPACE}/hosts",
credentialsId:
'vagrant'
-
)
-
}
-
}
-
}
}
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参数。使用它的方式比较特