两种方法一种直接使用sh 执行ansible命令,另外一种使用jenkins ansible插件
两种方法都需要安装ansible。个人觉得使用sh执行ansible命令更简单。使用插件也没发现有什么其它好处(除了pipeline看起来比较好看之外)。这个问题欢迎大家讨论。

第一种方法:使用sh执行ansible命令

安装ansible(详见下文),配置credential(详见下文),安装sshpass(避免使用明文密码,安装方法详见下文),pipeline如下。

stage('Deploy') {
    steps {
	    dir('Jenkinsfile/ansible') {
	        withCredentials([usernamePassword(credentialsId: 'ansible_credential_for_ltktix0ipms04', passwordVariable: 'password', usernameVariable: 'username')]) {
                sh 'sshpass -p $password ansible-playbook test_ansible.yml -i test_ansible_inventory -u $username -k'
            }
		}
    }
}	

第二种方法:使用ansible插件

1. 安装Ansible

(略)
yum安装,源码编译安装,SUSE使用zypper 命令安装
(可以使用163的源:zypper ar -f http://mirrors.163.com/openSUSE/distribution/openSUSE-stable/repo/oss/ 163_suse_stable)

2. 安装jenkins ansible plugin插件

在这里插入图片描述

如果使用多个版本的ansible可以通过Global Tool Configuration配置

Configure Ansible in “Global Tool Configuration”
Jenkins Navigate Menu: “Jenkins” -> “Manage Jenkins” -> “Global Tool Configuration”

3. 配置ansible如何连接目标服务器

有几种方式供选择,一种是配置ssh互信。另外一种是使用Jenkins Credentials(Jenkins Credentials又分为两种:一种是Username with password,一种是SSH Username with private key)。方法各有优缺点,简单如下:

  1. 使用ssh互信,优点是当服务器密码修改,不用额外操作。但是每台Jenkins都需要配置与目标服务器的互信。这样也有依赖关系。
  2. 使用Jenkins的Credentials方法,不需要每台jenkins服务器配置ssh互信,但是当服务器密码修改时,credential的密码也需要做对应修改。
  3. 如果使用Jenkins的Credentials方法,则推荐使用SSH Username with private key方式,因为这种方式不需要安装sshpass命令。如果使用Username with password则需要安装sshpass命令。相互依赖越少越好,所以推荐使用private方式。
a. 配置SSH互信

$ ssh-keygen -f ~/.ssh/id_rsa -N ‘’
$ ssh-copy-id -i ~/.ssh/id_rsa.pub autodeploy@webserver-01

b. 配置Jenkins Credentials

如下截图,可见两种,第一种Username with password,第二种SSH Username with private key
具体配置方法略
在这里插入图片描述

c. 如果使用sername with password 方式,则需要安装sshpass

tar -zxvf sshpass-1.06.tar.gz
cd sshpass-1.06
./configure
make
make install

3. Jenkins Pipeline 中使用ansible插件

建议将playbook和inventory都保存在git中而不是jenkins服务器上,这样就不依赖于某台服务器,而且playbook和inventory文件也有了版本管理。
Ansible插件的具体使用方法参见:https://wiki.jenkins.io/display/JENKINS/Ansible+Plugin

    stage('Deploy') {
	    steps {
		    dir('Jenkinsfile/ansible') {
		        ansiblePlaybook(
			        credentialsId: 'ansible_credential_ID',
			    	inventory: 'test_ansible_inventory',
			    	playbook: 'test_ansible.yml'
			    )
			}
	    }
    }	
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐