Jenkins搭配ansible部署

架构流程

现在运维组工具里加入了gitlab这个版本控制工具,再加上原有的jenkins和ansible,整个代码模块部署流程如下:
1.在代码服务器上push更改的代码到gitlab;
2.gitlab通过webhook推送事件到jenkins,触发构建任务;
3.jenkins从gitlab将最新代码拉取下来;
4.jenkins通过ansible将最新的代码部署到应用服务器;
5.推送构建状态到gitlab;

安装ansible

jenkins虽然支持ansible,但是前提是jenkins所在的主机上要有ansible程序,安装ansible的方法如下:

1
2
3
pip install --upgrade pip
pip install paramiko PyYAML Jinja2 httplib2 six
pip install ansible #安装的是2.5.4版本

然后需要jenkins服务器与代码服务器之间建立ssh免密码登陆的关系,这里就不说细节了,可以去看一下http://blog.51cto.com/chenx1242/1763978 这个文章。

再去/etc/ansible/hosts手动输入一下授信服务器的IP地址,启动一下ansible看效果:
akb48

如果在启动ansible的时候出现了如下的错误:

1
2
/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.21.1) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)

那就是python库中urllib3 (1.21.1) or chardet (2.2.1)的版本不兼容,解决办法如下:

1
2
3
pip uninstall urllib3
pip uninstall chardet
pip install requests

安装插件

登陆jenkins的web页面,选择系统管理—>管理插件,安装如下三个插件:Ansible pluginAnsible Tower PluginAnsiColor。如图:
akb48

安装插件并且重启了ansible之后,还是系统管理-–>全局工具配置,找到ansible安装,分别把ansible的路径根据实际情况填写进去,如图:
akb48

填写完毕之后保存即可。

配置工程

打开某一个project,就用之前在https://rorschachchan.github.io/2018/05/25/Gitlab-Jenkins搭建持续集成系统/ 这个文章里用到的jicheng-test,因为它已经跟gitlab集成了,所以只要gitlab有commit变化,就会webhook到jenkins进行操作。

配置jicheng-test,选择构建这个标签页。在增加构建步骤选择Invoke Ansible Ad-Hoc Command,这里我为了做实验随便写了一点命令,如图:
akb48

上面的配置就是先让jenkins输出这个是来自jenkins机器的信息!!,然后启动ansible,对/etc/ansible/hosts里的所有ip机器执行hostnamecd /mnt ; echo "我是你大爷!" >> 321.txt这两个命令。

测试结果

前文说了,这个jicheng-test已经做了gitlab+jenkins的配置,所以只要在代码服务器的git文件夹里,执行commit,代码被push到gitlab服务器上的同时也会触发jenkins打包。

于是操作如图:
akb48

在gitlab的网页端查看代码已经上传:
akb48

再去jenkins里确认是否被成功触发了:
akb48

这次操作显示蓝灯,就是OK,点击选择控制台输出,查看一下执行细节:
akb48

效果达到!试验成功!

如果需要回滚,就在jenkins新建一个与gitlab相连的project,切换gitlab的分支,然后重新commit,触发jenkins打包并且ansible部署即可。

故障排错

可能在jenkins集成的时候出现如下错误:

1
2
3
4
5
	代码服务器ip	| UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Host key verification failed.\r\n",
"unreachable": true
}

这是因为jenkins在执行ansible是通过jenkins用户去操作的,虽然我们在安装ansible那一步的时候已经构建了服务器之间的ssh关系,但是那只是root用户的,所以如果没配置jenkins用户的ssh免密码登录,那么sudo su -s /bin/bash jenkins切换到jenkins用户在ssh jenkins@目标IP这一步的时候,会出现如下的提示:

1
2
3
4
The authenticity of host '目标IP(目标IP)' can't be established.
ECDSA key fingerprint is SHA256:Nerx/EZH+ul0/qeb21+ii5EctQ0mO8hijIDlAWEGje8.
ECDSA key fingerprint is MD5:6e:d8:6d:17:ca:79:9c:5e:bc:7e:9e:e6:33:41:08:25.
Are you sure you want to continue connecting (yes/no)?

因为ansible不会主动帮你输入yes,所以还需要在jenkins用户下把id_dsa.pub文件添加到代码服务器的authorized_keys里,制作一个ssh免密码登录。如果这时候你手动执行一下ssh jenkins@目标IP并且输入yes之后,再重新构建这个project就会发现错误变样了:

1
2
3
4
5
	代码服务器ip | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
"unreachable": true
}

原因还是上面的话,由于目标机器上是没有jenkins这个用户的,所以自然也不会存在登录密码,即使用了jenkins用户制作了authorized_keys也是没用,所以需要指定ssh到目标IP的用户,如果是ansible的命令就是ansible all -i /etc/ansible/hosts -u root -m shell -a "具体的shell命令",但是jenkins里配置root的地方很难找,所以就可以在/etc/ansible/hosts里更改一下,改成如下的样子:

1
目标ip地址 ansible_ssh_user=root			#指定用root用户登录到目标IP

这样执行命令就没有障碍了,不过root用户权限过大,实际生产环境还是建立一个更加保险的账号最佳。

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------