示例:

  1、程序集主目录:service下

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  2、sls 目录: service_sls 下

目录结构示例:
/home --service --servername --service_sls --server1.sls

ServerName 服务 sls 示例:

1、发布 servername.sls

{% set time = salt['cmd.run']('D:\script\getinfo.py gettime') %}
{% set service_name = 'ServerName' %}

# 发布目录 Services_dir: file.directory:
- name: D:\Services - unless: - test -d D:\Services
# 备份目录 backup_dir: file.directory:
- name: D:\Services\backup - unless: - test -d D:\Services\back - require: - file: Services_dir
# 缓存目录 temp_dir: file.directory:
- name: D:\Services\temp - unless: - test -d D:\Services\temp # 备份目录 backup_service_dir: file.directory: - name: D:\Services\backup\{{service_name}} - require: - file: backup_dir
# 缓存目录 temp_service_dir: file.directory:
- name: D:\Services\temp\{{service_name}} - require: - file: temp_dir backup_time_dir: file.directory: - name: D:\Services\backup\{{service_name}}\{{time}} - require: - file: backup_service_dir deploy_time_dir: file.directory: - name: D:\Services\temp\{{service_name}}\{{time}} - require: - file: temp_service_dir backup_service: cmd.run: - name: xcopy /s D:\{{service_name}}\*.* D:\Services\backup\{{service_name}}\{{time}}\{{service_name}}\ - require: - file: backup_time_dir deploy_service_to_temp: file.recurse: - name: D:\Services\temp\{{service_name}}\{{time}}\{{service_name}} - source: - salt://{{service_name}}/files/{{service_name}} - require: - cmd: backup_service - file: deploy_time_dir deploy_service_to_public: cmd.run: - name: D:\script\dircopy.py D:\Services\temp\{{service_name}}\{{time}}\{{service_name}}\ D:\{{service_name}} - require: - file: deploy_service_to_temp

 发布 指令 : 

salt -L '172.16.3.33-35' state.sls service_sls.servername

2、回滚备份 backup.sls

{% set time = salt['cmd.run']('D:\script\getinfo.py gettime') %}
{% set service_name = 'ServerName' %}
{% set lastbackup = salt['cmd.run']('D:\script\getinfo.py getbackup "D:\\Services\\backup\\ServerName"') %}

service_backup:
  cmd.run:
    - name: D:\script\dircopy.py D:\Services\backup\{{service_name}}\{{lastbackup}}\{{service_name}}\ D:\{{service_name}}\

 回滚 指令 :

salt -L '172.16.3.33-35' state.sls service_sls.backup

3、涉及的脚本放置在客户端机器  D:\script 目录下:

getinfo.py

#coding=utf-8
import os
import time
import sys

def getTime(*vars):
    date = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
    return date

def getLastBackup(*vars):
    if not os.path.exists(vars[0]):
        print '%r: 备份路径不存在' % vars[0]
        sys.exit(1)
    try:
        os.chdir(vars[0])
    except OSError, e:
        print e
        sys.exit(1)
    else:
        lastbackup = sorted(os.listdir(os.curdir)).pop()
        return lastbackup

def usage():
    print 'Usage: python getinfo.py [ gettime | getbackup <service>]'

funcdict = {'gettime': getTime, 'getbackup': getLastBackup}

def main():
    if len(sys.argv) < 2:
        usage()
        sys.exit(1)

    option = sys.argv[1:]
    if option[0] in funcdict.keys():
        print funcdict[option[0]](*option[1:])
    else:
        usage()

if __name__ == '__main__':
    main()

dircopy.py

#coding=utf-8
import shutil
import os
import sys

def dircopy(pathsrc, pathdst):
    os.path.walk(pathsrc, visit, '')

def visit(arg, dirname, names):
    dir = dirname.replace(sys.argv[1], '')
    # print '当前目录: ', dirname
    # print '当前相对目录:', dir
    # print '当前目录下的文件:', names
    # print 'PathDst', PathDst
    # print '+'
    # print dir
    dirnamedst = os.path.join(sys.argv[2], dir)
    # print '目标目录:', dirnamedst
    if not os.path.exists(dirnamedst):
        os.mkdir(dirnamedst)
        # print '创建目标目录成功'
    for file in names:
        # print '判断文件:', file
        if os.path.isdir(os.path.join(dirname, file)) and not os.path.exists(os.path.join(dirnamedst, file)):
            os.mkdir(os.path.join(dirnamedst, file))
            # print '创建目录:', os.path.join(dirnamedst, file)
        elif os.path.isfile(os.path.join(dirname, file)):
            shutil.copy2(os.path.join(dirname, file), os.path.join(dirnamedst, file))
            # print '拷贝文件:', os.path.join(dirname, file)
    # print '-'*50
    # print '开始下一次遍历'
    # print

def main():
    if len(sys.argv) != 3:
        print 'Usage: dircopy.py src dst'
        sys.exit(1)
    else:
        if not sys.argv[1].endswith(os.path.sep):
            sys.argv[1] = sys.argv[1] + os.path.sep
        if not sys.argv[2].endswith(os.path.sep):
            sys.argv[2] = sys.argv[2] + os.path.sep
        dircopy(sys.argv[1], sys.argv[2])

if __name__ == '__main__':
    main()

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄