1. 发布流程: - 代码发布: - git - saltstack: state推送文件 - saltstack: state执行命令 - 静态文件发布 - git - saltstack: state推送文件 - SQL发布 - git - saltstack: state推送文件 - saltstack: state执行命令 注意: 1. 保留三个版本 2. SQL发布:数据量比较大时,编写上线SQL时,只对更改的表做操作;+ 回滚的脚本; 2. 发布salt相关命令: 代码: 目录:/srv/salt/code_deply/ a. 创建 init.sls # 1. 同步文件 sync_file: file.recurse: - name: /data/new_files/{{pillar['file_name']}} # 同步到所有minion - source: salt://s7code/files/{{pillar['file_name']}} # 新拉下来的代码 - user: root - makedirs: True - file_mode: 644 - dir_mode: 755 sync_reboot_file: file.manage: - name: /data/backup/reboot_{{pillar['file_name']}}.py # 同步到所有minion - source: salt://s7code/files/reboot_{{pillar['file_name']}}.py # 新拉下来的代码 - user: root - makedirs: True - file_mode: 644 sync_backup_file: file.manage: - name: /data/backup/backup_{{pillar['file_name']}}.py # 同步到所有minion - source: salt://s7code/files/backup_{{pillar['file_name']}}.py # 新拉下来的代码 - user: root - makedirs: True - file_mode: 644 # 2. 备份 backup_online: cmd.run: - name: mv /data/{{pillar['file_name']}} /data/backup/{{pillar['file_name']}}-4 - require: - file: sync_file # 3. 新上线代码 apply_file: cmd.run: - name: mv /data/new_files/{{pillar['file_name']}} /data/{{pillar['file_name']}} - require: - cmd: backup_online # 4. 重启程序 reboot_app: file.run: - name: /usr/bin/python /xx/xx/xxpython脚本.py {{pillar['file_name']}} (将现在运行的进程杀掉,重启) # 5. 备份名称重命名 rename_backup_file: cmd.run: - name: /usr/bin/python /data/backup/backup_rename.py {{pillar['file_name']}}(找到/data/backup目录下的所有文件夹,) ########################## 或 #################################### # 1. 同步文件 sync_file: file.recurse: - name: /data/new_files/video # 同步到所有minion - source: salt://s7code/files/video # 新拉下来的代码 - user: root - makedirs: True - file_mode: 644 - dir_mode: 755 sync_reboot_backup_file: file.manage: - name: /data/backup/reboot_backup.py - source: salt://s7code/files/reboot_backup.py - user: root - makedirs: True - file_mode: 644 # 2. 备份 backup_online: cmd.run: - name: /usr/bin/python /data/backup/reboot_backup.py 执行: salt "c1.com" state.sls code_deply 问题: salt "c1.com" state.sls code_deply pillar='{"file_name":"video"}' salt "c1.com" state.sls code_deply pillar='{"file_name":"api"}' salt "c1.com" state.sls code_deply pillar='{"file_name":"vue"}' salt "c1.com" state.sls code_deply pillar='{"file_name":"..."}' vue: 目录:/srv/salt/vue_deply/ ... 执行: salt "c1.com" state.sls code_deply sql: 目录:/srv/salt/sql_deply/ ... 执行: salt "c1.com" state.sls code_deply
1. linux: salt部署命令 master: - selinux关闭 - 防火墙关闭 - srv/salt/s7code/ - init.sls sync_file: file.recurse: - name: /data/new/{{pillar['appname']}} # 同步到每个客户端的 - source: salt://s7code/files/{{pillar['appname']}} # master上的代码 - user: root - makedirs: True - file_mode: 644 - dir_mode: 755 sync_online_script: file.managed: - name: /data/script/code_publisher.py - source: salt://s7code/files/code_publisher.py - user: root - makedirs: True - file_mode: 644 run_online_script: cmd.run: - name: /usr/bin/python /data/script/code_publisher.py {{pillar['appname']}} xxxxxxxx: cmd.run: - name: nohup /usr/bin/python run.py >/dev/null 2>&1 & - cwd: /data/{{pillar['appname']}} - files - luffy - run.py import flask ... - code_publiser.py #!/usr/bin/env python # -*- coding:utf-8 -*- """ 1. salt state进行文件同步 2. 线上代码移动到 程序-4 名称 3. 新代码移动到线上目录 4. 杀掉原进程&重新启动应用程序 5. 修改文件名 """ import os import sys import signal import shutil from subprocess import check_output, CalledProcessError def online_to_backup4(app_name): """ 线上代码移动到备份4 :return: """ # 检查是否存在线上代码(新服务器没有) online_path = '/data/%s' % app_name if not os.path.exists(online_path): return # 创建备份目录 backup_path = "/data/backup/%s/" % app_name if not os.path.exists(backup_path): os.makedirs(backup_path) # 线上代码移动到备份4 shutil.move('/data/%s' % app_name, '/data/backup/%s/%s-4' % (app_name, app_name,)) def new_to_online(app_name): """ 新代码移动到线上 :return: """ # 检查是否有线上目录,没有则创建 online_path = "/data" if not os.path.exists(online_path): os.makedirs(online_path) # 新代码移动到线上 os.rename('/data/new/%s' % app_name, '/data/%s' % (app_name,)) # shutil.move(('/data/new/%s' % app_name, '/data/%s' % (app_name,)) def rename_backup_name(app_name): """ 备份文件命名:备份-1、备份-2、备份-3 :param app_name: :return: """ base_path = "/data/backup/%s" % app_name for i in range(1, 5): # 1/2/3/4 folder_name = "%s-%d" % (app_name, i,) folder_path = os.path.join(base_path, folder_name) if not os.path.exists(folder_path): continue if i == 1: # 删除 xx-1 shutil.rmtree(folder_path) continue # 2/3 都减1 new_folder_name = "%s-%d" % (app_name, i - 1,) new_folder_path = os.path.join(base_path, new_folder_name) shutil.move(folder_path, new_folder_path) def get_pid_list(name): """ 获取指定进程PID :param name: :return: """ try: output = check_output("pgrep -f '%s'" % (name), shell=True) except CalledProcessError as ex: output = None if not output: return [] return map(int, output.split()) def kill_9(name): """ 杀死指定进程 :param name: :return: """ for pid in get_pid_list(name): try: os.kill(pid, signal.SIGKILL) except OSError as e: pass def run(): # luffy app_name = sys.argv[1] # 拷贝 online_to_backup4(app_name) new_to_online(app_name) # 删除第一备份 rename_backup_name(app_name) # 杀进程 kill_9('/usr/bin/python run.py') if __name__ == '__main__': run() salt '*' state.sls s7code pillar='{"appname": "luffy"}' minion - ..... /data/new/ /data/luffy /data/backup/luffy/luffy-l /data/backup/luffy/luffy-2 /data/backup/luffy/luffy-3 master上执行: salt '*' state.sls s7code pillar='{"appname": "luffy"}' salt '*' state.sls s7code pillar='{"appname": "luffy"}' salt '*' state.sls s7code pillar='{"appname": "luffy"}' salt '*' state.sls s7code pillar='{"appname": "luffy"}'