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()

原文地址:https://www.cnblogs.com/sharesdk/p/10821862.html

时间: 2024-10-11 21:22:41

saltstack window下的发布回滚的相关文章

qt学习2——qt在window下的发布

很多时候,我们在用qt creator编译运行我们所写的程序时,程序能正常启动,但是当我们直接点击debug下面的exe文件时,程序却启动失败,会提示缺少某些dll文件,这是为什么呢? 是这样的,我们所写的qt程序,需要用到很多qt库,但这些库是以动态链接库的形式,加载在程序中的,如果用qt creator,则它会帮助我们将那些所需要的动态链接库链接到程序中去,但如果是我们手动去点击exe文件,则那些dll文件无法加载.如何解决呢? 解决方法有2: 1. 以环境变量的形式,将所需要的dll文件放

Git reset head revert 回滚

Overview 涉及Git一些日常操作 :) 基础知识 <Pro Git>至少了解branch,commit的概念,及基本的原理 Git常用魔法 存档:master代码回滚方法 我是QA,我用Git Git 工作区.暂存区和版本库 Overview 暂存区(stage, index)是 Git 最重要的概念之一 工作区: 你的目录下面的文件们 暂存区: 由.git/index保存引用,.git/object保存对象的区域 版本库: 仓库 Relations Why stage before

回滚与撤销

回滚:即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,滚回到事务开始时的状态. 撤销:恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经做出的任何对数据库的修改,使得该事务好像根本没有启动一样. 根据上述书中的解释可以明白二者主要区别在于事务执行的状态,回滚是在事务未全部完成即在事务中发生的,撤销是在该事务已经执行完成后发生的,不过二者都是为解决事务故障而存在的一种安全机制.

oracle_回滚

为了保证数据库中多个用户间的读一致性和能够回退事务.一.在一个简单的更新语句中,对于回滚段的操作存在多处,在事务开始时,首先需要在回滚表空间获得一个事务槽,分配空间,然后创建前镜像,此后事务的修改才能进行,oracle必须以此来保证事务是可以回滚的.如果用户提交了事务,oracle会在日志文件记录提交,并且写出日志,同时会在回滚段中把事务标记为已提交:如果用户回滚事务,则oracle需要从回滚段中把前镜像数据读取出来修改数据缓冲区,完成回滚,这个过程本身也要产生redo,所以回退这个操作是很昂贵

JDBC PreparedStatement ,CallableStatement,以及事务,回滚举例

程序中用到的类,文件,jar 代码: 1,文件:db.properties文件内容 user=rootpassword=123url=jdbc:mysql:///student_dbdriver=com.mysql.jdbc.Driveraaa 2,类Utils.class import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException

SQL Server事务执行一半出错是否自动回滚整个事务 【转】

http://www.2cto.com/database/201308/234728.html SQL Server事务执行一半出错是否自动回滚整个事务 大家都知道SQL Server事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除. 所以是不是说事务出错一定会回滚整个事物呢? 先看几个个例子: --createtable create table testrollback(idi

Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚

写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用windows的啊: 那全面拥抱linux的一一.net core 时代 ,是如何处理这些个问题的呢? 噔噔蹬蹬~请往下看. 运行环境 centos:7.2 cpu:1核 2G内存 1M带宽 Jenkins ver. 2.150.1 一台安装jenkins的机器. (本文例子不一定要安装jenkins,

gitf远程代码库回滚(webstorm下)

git远程代码库回滚(webstorm下) 1. 场景 添加了一个文件[file-for-test.js]到git的控制下 进行了三次修改,并分别进行了三次commit,最后进行了一次push git log结果如下图: [file-for-test.js]文件的内容如下图: 现在希望,将远程代码库下的[file-for-test.js]文件回滚到[//lyn test1]的版本 2. 操作步骤 2.1. [Version Control]——[Log] 2.2. 右击[//lyn test1]

关于jave在oracle驱动下事务提交与回滚问题

一直以来,都认为Connection如果设置了setAutoCommit(false)后,启动手工事务提交,必须手工进行commit或者rollback才行.今天正好遇到一个问题,结果大跌眼镜. 于是测试了一下,结果如下(请注意在oracle驱动下,其他环境未知): 1.设置了setAutoCommit(false)后执行后续DML的数据更新操作,没有显式手工进行commit或者rollback,最后设置setAutoCommit(true),后关闭连接,默认提交成功. 2.设置了setAuto