使用 ansible+jenkins+gitlab 实现自动化发布和手动回滚前端项目 03

承接上文

上文讲到,jenkins 如何利用 gitlab 钩子实现从 gitlab 拉取代码自动化构建发布,本文将会讲到,如何把 ansible 引入到 jenkins,并且利用 jenkins 的 ${BUILD_NUMBER} 变量来实现回滚
请把本文结合前文看,要不然你看不懂~


直入主题这里先配置 ansible

既然你要使用 ansible 做发布,那么自然要让 ansible 能 ssh 到 web 服务器了
这里先配置 ansible,在 ansible 上添加 web 服务器的主机信息,然后生成私钥和公钥,利用 playbook 把公钥传输到 web 服务器

[[email protected] ~]# cd /etc/ansible/
[[email protected] ansible]# echo '' > hosts 
[[email protected] 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 地址,登录密码
[[email protected] ansible]# ssh-keygen 
[[email protected] ansible]# mkdir -p /etc/ansible/playbooks/system
[[email protected] ansible]# cd playbooks/system/
[[email protected] 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
[[email protected] system]# mkdir -p /etc/ansible/roles/ssh/files/
[[email protected] system]# touch /etc/ansible/roles/ssh/files/authorized_keys
[[email protected] system]# cat /root/.ssh/id_rsa.pub >> /etc/ansible/roles/ssh/files/authorized_keys 
[[email protected] system]# cat /etc/ansible/roles/ssh/files/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3wf+zEHfCQf1U0D9qq2xtjYsYgiuTT3db13Tv1Q9QScfYpJ/43AH/fYuRq5t4lqYfOlwZtkP9cO2wSj0o/RJPj7tDJSdsPs5o6SehySoBW7SSgABwfnX/pPrl6a1UK70nAq8KBUcBtGH5NSREV9uW/fbC4yuVLJw4BQdLM4J4Bclkq6WW7VC42wFJsDO9Y9bCXY33J8pV0j2dV+Kdx7UN+zEH7lCmyLZnHmu447IM1JLymkGZnoBybpES2kdIIQLKq0xiyO18Ge6Oa/L48ambvsSfu499Q3yDVFdD4hfwp6lDwPdIbp3wzL8yQtv/5ShaYqdx5mSSKzZZDYg2UpbP [email protected]
[[email protected] system]# vim /etc/ansible/ansible.cfg
host_key_checking = False
[[email protected] 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   

[[email protected] system]# ssh [email protected]
Last login: Wed Jun 26 11:13:54 2019 from 10.18.193.20
[[email protected] ~]# exit 
登出
Connection to 10.18.193.25 closed.
[[email protected] 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
[[email protected] system]# ssh [email protected]
Last login: Wed Jun 26 10:47:22 2019 from 10.18.193.20
[[email protected] ~]# exit 
登出
Connection to 10.18.193.27 closed.

经过上面的一波骚操作,已经实现 ansible 免密 ssh 连接 jenkins 和 web 服务器了
接下来将写一些 playbook 用来跟 jenkins 结合做发布

[[email protected] system]# mkdir -p /etc/ansible/playbooks/deploy
[[email protected] system]# cd /etc/ansible/playbooks/deploy/
[[email protected] deploy]# vim deploy_web.yml
---
  - hosts: "{{host}}"
    gather_facts: False
    remote_user: root
    roles:
      - common_deploy
[[email protected] deploy]# mkdir -p /etc/ansible/roles/common_deploy/tasks
[[email protected] deploy]# cd /etc/ansible/roles/common_deploy/tasks/
[[email protected] tasks]# vim main.yml
---
  - import_tasks: get_package_from_jenkins.yml
  - import_tasks: put_package_to_server.yml
[[email protected] 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
[[email protected] 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 文件

[[email protected] ~]# vim /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCbSX9TOg4aWkgrVzPz48oQkYguZXkUlYtjAf8pt7tzkYZLR2VctwCXtOeCNX1Q1KQINeHv3ZOEKvmExnIvlgAPR0nx9EtaZbDI7yd51r0j5ed1BiS2Bb1MI+2uOq6G0UxsvqDC8C5rqPOaTbBDM01Qd+RAj54CTQV7VdgotDVn8KGTpmiR/C5nvrbPGmbJPIwkEM2JsQwGjs9yot8S7DfuFMSRIIYNWLTUibhv2cKXdMrplEiq+JBrGs4jKs6VCqFAJIFu0/xPs7VmZYDWwx3B6HFRDKP34n/HqESt/wM5KZqYzZ/gQrEDRLJ9xuX87PUSDV7Fy3GZmsj2rwIS19x [email protected]
[[email protected] ~]# chmod 700 .ssh/
[[email protected] ~]# chmod 600 .ssh/authorized_keys

然后在 jenkins 设置 ansible 主机信息并测试

61484-h4r2anznkn7.png

64887-ofnt24dk7r.png

在 jenkins 的项目配置里面继续下一步

57212-vdlq3wh3yuh.png

89303-fmoukefg8xl.png

返回到 gitlab 上,再次模拟 push,看是否能实现 jenkins 通过 ansible 发布

18692-ss2k7gwi78k.png

26455-kxkbltw5spl.png

62940-1oi4zjfwbax.png


如何回滚

在这之前,已经做好了 jenkins 和 gitlab 结合自动化构建发布,也做好了 jenkins 利用 ansible 做发布
接下来将讲到当发布出错的时候,该如何回滚
首先确认 web 服务器的服务启动了多久,用来做参考

75648-xqygqee4osg.png

然后配置 jenkins,实现回滚功能
这个到项目的配置页面设置,记得配置好要点击保存呀

89172-1k3mrtchg4n.png

92561-snilowp8ib.png

26467-nxcur6zgbzd.png

82291-cwd6r9ntauq.png

首先手工测试新版本的发布并看下服务启动时间

33467-a75voy2j7tv.png

90738-a4kc299tj2r.png

76831-4iotjpde0e5.png

然后再测试旧版本的回滚并看下服务启动的时间

20369-u5ru6dnv0dc.png

77219-e4gv357galn.png

52487-t1znb09zwlr.png

至此,回滚也搞掂了~


总结

到这里,jenkins+ansible+gitlab 部署一个完整的自动化构建部署前端工程的系统就完成了!


linuxansiblejenkinsgitlab手动回滚自动化发布

我来吐槽

*

*