saltstack window下的发布回滚

Posted sharesdk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了saltstack window下的发布回滚相关的知识,希望对你有一定的参考价值。

示例:

  1、程序集主目录:service下

  2、sls 目录: service_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.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.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()

 

以上是关于saltstack window下的发布回滚的主要内容,如果未能解决你的问题,请参考以下文章

SaltStack

二 saltstack常用模块和 jinja模版

黑客利用SaltStack新漏洞入侵LineageOS;Windows10计划推迟两周发布更新

Windows下SVN回滚到旧版本(TortoiseSVN)

saltstack minion windows服务无法启动

saltstack操作windows的可视化界面