架构流程
现在运维组工具里加入了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
3pip 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看效果:
如果在启动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
3pip uninstall urllib3
pip uninstall chardet
pip install requests
安装插件
登陆jenkins的web页面,选择系统管理
—>管理插件
,安装如下三个插件:Ansible plugin
、Ansible Tower Plugin
、AnsiColor
。如图:
安装插件并且重启了ansible之后,还是系统管理-
–>全局工具配置
,找到ansible安装
,分别把ansible的路径根据实际情况填写进去,如图:
填写完毕之后保存即可。
配置工程
打开某一个project,就用之前在https://rorschachchan.github.io/2018/05/25/Gitlab-Jenkins搭建持续集成系统/ 这个文章里用到的jicheng-test,因为它已经跟gitlab集成了,所以只要gitlab有commit变化,就会webhook到jenkins进行操作。
配置jicheng-test,选择构建
这个标签页。在增加构建步骤
选择Invoke Ansible Ad-Hoc Command
,这里我为了做实验随便写了一点命令,如图:
上面的配置就是先让jenkins输出这个是来自jenkins机器的信息!!
,然后启动ansible,对/etc/ansible/hosts
里的所有ip机器执行hostname
和cd /mnt ; echo "我是你大爷!" >> 321.txt
这两个命令。
测试结果
前文说了,这个jicheng-test已经做了gitlab+jenkins
的配置,所以只要在代码服务器的git文件夹里,执行commit,代码被push到gitlab服务器上的同时也会触发jenkins打包。
于是操作如图:
在gitlab的网页端查看代码已经上传:
再去jenkins里确认是否被成功触发了:
这次操作显示蓝灯,就是OK,点击选择控制台输出,查看一下执行细节:
效果达到!试验成功!
如果需要回滚,就在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
4The 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用户权限过大,实际生产环境还是建立一个更加保险的账号最佳。