前言
本文中的脚本例子没实际执行过,是基于成功运行过的脚本提炼修改而成,语法细节上可能会有错漏,主要用于理解过程。
另外,例子中基本只使用到shell模块,有些操作用ansible自带模块效果更佳,在执行过程中ansible也会有相应优化提示,读者可自行优化。
场景
- 控制终端 10.10.10.10
- 受控节点
- group1
- 11.11.11.11
- group2
- 12.12.12.12
- 13.13.13.13
- group1
- 实现目标
达到不停服务完成自动化发布的目的。 - 执行过程
- 上传war包到控制终端;
- 从控制终端复制war包到group1节点;
- 复制group1节点上tomcat原来部署的war包到控制终端备份,并追加时间戳重命名;
- 重启tomcat进行部署;
- 检测group1节点上的tomcat是否成功启动,如果成功启动则继续往下执行;
- 从控制终端复制war包到group2所有节点,然后重启tomcat进行部署。
操作流程
一、配置主机
hosts清单如下
[group1]
11.11.11.11
[group2]
12.12.12.12
13.13.13.13
[myproject:children]
group1
group2
二、配置变量
vim /etc/ansible/group_vars/myproject
ansible_ssh_user: deploy
new_war_location: /var/deploydata/deploy/ROOT.war
backup_location: /var/deploydata/deploy/backupwar
tomcat_home: /home/deploy/tomcat/apache-tomcat-7.0.73_9898_d
control_machine_ip: 10.10.10.10
三、编写脚本
注:此处默认主机间可以相互免密登录,具体配置可参考《linux配置ssh免密登录》
脚本代码如下
main.yml
- name: deploy group1
hosts: group1_d
tasks:
# 备份旧war包
- name: backup war
shell: scp {{ tomcat_home }}/webapps/ROOT.war root@{{ control_machine_ip }}:{{ backup_location }}/ROOT$(date +"%Y%m%d%H%M%S").war
# 忽略tomcat从未部署过war包会提示ROOT.war不存在的错误
ignore_errors: yes
- name: del old war
shell: rm -f {{ tomcat_home }}/ROOT.war
ignore_errors: yes
- include: tomcat_deploy.yml
# 暂停40s等待tomcat的启动过程
- name: sleep 40s
shell: sleep 40s
- name: deploy group2
hosts: group2_d
tasks:
# 检测group1主机的tomcat状态
# (curl命令会持续监听待检测服务直到其作出响应或超时,所以虽然上边定义只暂停40s,
# 但是实际情况tomcat的启动过程稍微大于40s是允许的)
- name: tomcat status
shell: curl http://10.46.66.94:9898 &>/dev/null && echo YES || echo NO
# 此处忽略错误是因为无论成功与否都要把输出结果注入到register的变量中
ignore_errors: True
# 把上一条命令的执行结果赋值给is_tomcat_success
register: is_tomcat_success
- include: tomcat_deploy.yml
# 此处可理解为当is_tomcat_success.stdout 为yes时,则执行include tomcat_deploy.yml
# (命令执行结果是一个map形式,其中包含stdout代表标准输出,所以此处是is_tomcat_success.stdout获取变量值)
# (如果需要查看变量的具体结果,可以使用debug模块查看指定变量
- name: Show debug info
debug: var=is_tomcat_success verbosity=0)
when: is_tomcat_success.stdout == "YES"
tomcat_deploy.yml
- name: stop tomcat
action: shell {{ tomcat_home }}/bin/shutdown.sh
# 忽略原本并没有tomcat运行的错误提示
ignore_errors: yes
- name: del ROOT dir
shell: rm -rf {{ tomcat_home }}/webapps/ROOT
ignore_errors: yes
- name: del old war
shell: rm -f {{ tomcat_home }}/webapps/ROOT.war
ignore_errors: yes
- name: copy war
shell: scp root@{{ control_machine_ip }}:{{ new_war_location }} {{ tomcat_home }}/webapps/ROOT.war
- name: start tomcat
shell: chdir={{ tomcat_home }}/bin nohup ./startup.sh &
四、执行脚本
ansible-playbook main.yml
[目录]
[上一篇] Ansible实战[二] ——playbook初探