使用 ansible+jenkins+gitlab 实现自动化发布和手动回滚前端项目 03
承接上文
上文讲到,jenkins
如何利用 gitlab
钩子实现从 gitlab
拉取代码自动化构建发布,本文将会讲到,如何把 ansible
引入到 jenkins
,并且利用 jenkins
的 ${BUILD_NUMBER}
变量来实现回滚
请把本文结合前文看,要不然你看不懂~
使用 ansible+jenkins+gitlab 实现自动化发布和手动回滚前端项目 01
https://www.itwordsweb.net/archives/auto_01
使用 ansible+jenkins+gitlab 实现自动化发布和手动回滚前端项目 02
https://www.itwordsweb.net/archives/auto_02
直入主题这里先配置 ansible
既然你要使用 ansible
做发布,那么自然要让 ansible
能 ssh
到 web
服务器了
这里先配置 ansible
,在 ansible
上添加 web
服务器的主机信息,然后生成私钥和公钥,利用 playbook
把公钥传输到 web
服务器
[root@dev-of-runfa-20 ~]# cd /etc/ansible/
[root@dev-of-runfa-20 ansible]# echo '' > hosts
[root@dev-of-runfa-20 ansible]# vim hosts
[web]
# 组名
dev-of-runfa-27 ansible_ssh_host=10.18.193.27 ansible_ssh_pass="itsupport.0"
dev-of-runfa-25 ansible_ssh_host=10.18.193.25 ansible_ssh_pass="itsupport.0"
# 这行分别为,主机名,IP 地址,登录密码
[root@dev-of-runfa-20 ansible]# ssh-keygen
[root@dev-of-runfa-20 ansible]# mkdir -p /etc/ansible/playbooks/system
[root@dev-of-runfa-20 ansible]# cd playbooks/system/
[root@dev-of-runfa-20 system]# vim put_key.yml
---
- hosts: "{{host}}"
gather_facts: False
remote_user: root
tasks:
- name: 在对端创建 .ssh 目录,有则跳过,无则创建
file:
path: /root/.ssh
state: directory
mode: 0700
- name: 把本端存放到 /etc/ansible/roles/ssh/files/authorized_keys 文件的公钥传输到对端 /root/.ssh/authorized_keys
copy:
src: /etc/ansible/roles/ssh/files/authorized_keys
dest: /root/.ssh/authorized_keys
force: yes
mode: 0600
- name: 为安全起见,关闭密码登录功能
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^PasswordAuthentication'
line: 'PasswordAuthentication no'
- name: 设置 DNS 为 no,加速登陆速度
lineinfile:
path: /etc/ssh/sshd_config
state: present
line: 'UseDNS no'
- name: 重启对端 ssh 服务
service:
name: sshd.service
state: restarted
[root@dev-of-runfa-20 system]# mkdir -p /etc/ansible/roles/ssh/files/
[root@dev-of-runfa-20 system]# touch /etc/ansible/roles/ssh/files/authorized_keys
[root@dev-of-runfa-20 system]# cat /root/.ssh/id_rsa.pub >> /etc/ansible/roles/ssh/files/authorized_keys
[root@dev-of-runfa-20 system]# cat /etc/ansible/roles/ssh/files/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3wf+zEHfCQf1U0D9qq2xtjYsYgiuTT3db13Tv1Q9QScfYpJ/43AH/fYuRq5t4lqYfOlwZtkP9cO2wSj0o/RJPj7tDJSdsPs5o6SehySoBW7SSgABwfnX/pPrl6a1UK70nAq8KBUcBtGH5NSREV9uW/fbC4yuVLJw4BQdLM4J4Bclkq6WW7VC42wFJsDO9Y9bCXY33J8pV0j2dV+Kdx7UN+zEH7lCmyLZnHmu447IM1JLymkGZnoBybpES2kdIIQLKq0xiyO18Ge6Oa/L48ambvsSfu499Q3yDVFdD4hfwp6lDwPdIbp3wzL8yQtv/5ShaYqdx5mSSKzZZDYg2UpbP root@dev-of-runfa-20
[root@dev-of-runfa-20 system]# vim /etc/ansible/ansible.cfg
host_key_checking = False
[root@dev-of-runfa-20 system]# ansible-playbook -e 'host=dev-of-runfa-25' put_key.yml
PLAY [dev-of-runfa-25] ***********************************************************************************************************************************************************************************
TASK [在对端创建 .ssh 目录,有则跳过,无则创建] ***************************************************************************************************************************************************************************
ok: [dev-of-runfa-25]
TASK [把本端存放到 /etc/ansible/roles/ssh/files/authorized_keys 文件的公钥传输到对端 /root/.ssh/authorized_keys] *********************************************************************************************************
changed: [dev-of-runfa-25]
TASK [为安全起见,关闭密码登录功能] ************************************************************************************************************************************************************************************
changed: [dev-of-runfa-25]
TASK [设置 DNS 为 no,加速登陆速度] ********************************************************************************************************************************************************************************
ok: [dev-of-runfa-25]
TASK [重启对端 ssh 服务] ***************************************************************************************************************************************************************************************
changed: [dev-of-runfa-25]
PLAY RECAP ***********************************************************************************************************************************************************************************************
dev-of-runfa-25 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@dev-of-runfa-20 system]# ssh [email protected]
Last login: Wed Jun 26 11:13:54 2019 from 10.18.193.20
[root@dev-of-runfa-25 ~]# exit
登出
Connection to 10.18.193.25 closed.
[root@dev-of-runfa-20 system]# ansible-playbook -e 'host=dev-of-runfa-27' put_key.yml
PLAY [dev-of-runfa-27] ***********************************************************************************************************************************************************************************
TASK [在对端创建 .ssh 目录,有则跳过,无则创建] ***************************************************************************************************************************************************************************
ok: [dev-of-runfa-27]
TASK [把本端存放到 /etc/ansible/roles/ssh/files/authorized_keys 文件的公钥传输到对端 /root/.ssh/authorized_keys] *********************************************************************************************************
changed: [dev-of-runfa-27]
TASK [为安全起见,关闭密码登录功能] ************************************************************************************************************************************************************************************
changed: [dev-of-runfa-27]
TASK [设置 DNS 为 no,加速登陆速度] ********************************************************************************************************************************************************************************
ok: [dev-of-runfa-27]
TASK [重启对端 ssh 服务] ***************************************************************************************************************************************************************************************
changed: [dev-of-runfa-27]
PLAY RECAP ***********************************************************************************************************************************************************************************************
dev-of-runfa-27 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@dev-of-runfa-20 system]# ssh [email protected]
Last login: Wed Jun 26 10:47:22 2019 from 10.18.193.20
[root@dev-of-runfa-27 ~]# exit
登出
Connection to 10.18.193.27 closed.
经过上面的一波骚操作,已经实现 ansible
免密 ssh
连接 jenkins
和 web
服务器了
接下来将写一些 playbook
用来跟 jenkins
结合做发布
[root@dev-of-runfa-20 system]# mkdir -p /etc/ansible/playbooks/deploy
[root@dev-of-runfa-20 system]# cd /etc/ansible/playbooks/deploy/
[root@dev-of-runfa-20 deploy]# vim deploy_web.yml
---
- hosts: "{{host}}"
gather_facts: False
remote_user: root
roles:
- common_deploy
[root@dev-of-runfa-20 deploy]# mkdir -p /etc/ansible/roles/common_deploy/tasks
[root@dev-of-runfa-20 deploy]# cd /etc/ansible/roles/common_deploy/tasks/
[root@dev-of-runfa-20 tasks]# vim main.yml
---
- import_tasks: get_package_from_jenkins.yml
- import_tasks: put_package_to_server.yml
[root@dev-of-runfa-20 tasks]# vim get_package_from_jenkins.yml
---
- name: 从 jenkins 拉取包过来
fetch:
src: /data/jenkins_home/workspace/{{project}}/target/{{filename}}
dest: /tmp/{{filename}}
flat: yes
delegate_to: dev-of-runfa-25
[root@dev-of-runfa-20 tasks]# vim put_package_to_server.yml
---
- name: 把从 jenkins 拉取过来的包传输到 web 服务器
copy:
src: /tmp/{{filename}}
dest: /tmp/{{filename}}
mode: 0644
- name: 自动把包解压
unarchive:
src: /tmp/{{filename}}
dest: /data/{{dir}}
remote_src: yes
- name: 执行命令
shell: "{{cmd}}"
配置 jenkins
为了能让 jenkins
调用 ansible
,还得让 jenkins
能通过 ssh
操作 ansible
这里先把公钥放到 ansible
上的 /root/.ssh/authorized_keys
文件
[root@dev-of-runfa-20 ~]# vim /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCbSX9TOg4aWkgrVzPz48oQkYguZXkUlYtjAf8pt7tzkYZLR2VctwCXtOeCNX1Q1KQINeHv3ZOEKvmExnIvlgAPR0nx9EtaZbDI7yd51r0j5ed1BiS2Bb1MI+2uOq6G0UxsvqDC8C5rqPOaTbBDM01Qd+RAj54CTQV7VdgotDVn8KGTpmiR/C5nvrbPGmbJPIwkEM2JsQwGjs9yot8S7DfuFMSRIIYNWLTUibhv2cKXdMrplEiq+JBrGs4jKs6VCqFAJIFu0/xPs7VmZYDWwx3B6HFRDKP34n/HqESt/wM5KZqYzZ/gQrEDRLJ9xuX87PUSDV7Fy3GZmsj2rwIS19x root@dev-of-runfa-25
[root@dev-of-runfa-20 ~]# chmod 700 .ssh/
[root@dev-of-runfa-20 ~]# chmod 600 .ssh/authorized_keys
然后在 jenkins
设置 ansible
主机信息并测试
在 jenkins
的项目配置里面继续下一步
返回到 gitlab
上,再次模拟 push
,看是否能实现 jenkins
通过 ansible
发布
如何回滚
在这之前,已经做好了 jenkins
和 gitlab
结合自动化构建发布,也做好了 jenkins
利用 ansible
做发布
接下来将讲到当发布出错的时候,该如何回滚
首先确认 web
服务器的服务启动了多久,用来做参考
然后配置 jenkins
,实现回滚功能
这个到项目的配置页面设置,记得配置好要点击保存呀
首先手工测试新版本的发布并看下服务启动时间
然后再测试旧版本的回滚并看下服务启动的时间
至此,回滚也搞掂了~
总结
到这里,jenkins+ansible+gitlab
部署一个完整的自动化构建部署前端工程的系统就完成了!