Ansible实战[三] ——自动化部署实战例子

前言

本文中的脚本例子没实际执行过,是基于成功运行过的脚本提炼修改而成,语法细节上可能会有错漏,主要用于理解过程。
另外,例子中基本只使用到shell模块,有些操作用ansible自带模块效果更佳,在执行过程中ansible也会有相应优化提示,读者可自行优化。

场景

  • 控制终端 10.10.10.10
  • 受控节点

    • group1

      • 11.11.11.11
    • group2

      • 12.12.12.12
      • 13.13.13.13
  • 实现目标
    达到不停服务完成自动化发布的目的。
  • 执行过程

    1. 上传war包到控制终端;
    2. 从控制终端复制war包到group1节点;
    3. 复制group1节点上tomcat原来部署的war包到控制终端备份,并追加时间戳重命名;
    4. 重启tomcat进行部署;
    5. 检测group1节点上的tomcat是否成功启动,如果成功启动则继续往下执行;
    6. 从控制终端复制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_dianjianbao
control_machine_ip: 10.10.10.10

三、编写脚本

注:此处默认主机间可以相互免密登录,具体配置可参考《linux配置ssh免密登录》
脚本代码如下

main.yml

- name: deploy group1
  hosts: group1_dianjianbao
  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_dianjianbao
  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


[[目录]](https://blog.leapmie.com/archives/297/)
[[上一篇] Ansible实战[二] ——playbook初探](https://blog.leapmie.com/archives/306/)


发表评论