首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >配置文件管理维护到gitlab上(下)

配置文件管理维护到gitlab上(下)

原创
作者头像
陈不成i
修改2021-05-31 10:43:10
修改2021-05-31 10:43:10
4610
举报
文章被收录于专栏:ops技术分享ops技术分享

二.脚本

服务端

ecs-file-master.py

要修改脚本,host为服务端ip,git的url为项目地址,要手动建好

  1. #!/usr/bin/python3
  2. #当同一个文件更新2次时,则提交一次到线上
  3. #nohup /usr/bin/python3 -u /root/bin/ecs-file-master.py >> /var/log/ecs-file-master.log 2>&1 &
  4. from socket import *
  5. import sys, time, os, json, struct
  6. #[服务端ip-端口、临时文件位置、git位置、git项目url、push的脚本位置]
  7. host_info = (('172.16.5.4', 7777))
  8. tmp_dir = "/tmp-file"
  9. git_dir = "/ecs-file"
  10. git_url = "http://192.168.1.1/jenkins/ecs-file.git"
  11. push_script = "/root/bin/push.sh"
  12. buffsize = 1024
  13. def create_dir(file_ip, file_name):
  14. #创建目录,然后返回文件名
  15. name_list = file_name.split('/')
  16. if len(name_list) == 2:
  17. dir_post = tmp_dir + "/" + file_ip
  18. file_post = dir_post + "/" + name_list[1]
  19. else:
  20. dir_post = tmp_dir + "/" + file_ip
  21. name_number = len(name_list)
  22. name_number = name_number - 1
  23. i = 1
  24. while i < name_number:
  25. dir_post = dir_post + "/" + name_list[i]
  26. i = i + 1
  27. file_post = dir_post + "/" + name_list[-1]
  28. create_bin = "mkdir -p " + dir_post
  29. os.system(create_bin)
  30. return file_post
  31. def push_gitlab():
  32. #将代码push到gitlab上进行更新
  33. push_bin = push_script + " " + tmp_dir + " " + git_dir + " " + git_url
  34. os.system(push_bin)
  35. def post_sock():
  36. tcp_server = socket(AF_INET, SOCK_STREAM)
  37. tcp_server.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
  38. tcp_server.bind(host_info)
  39. tcp_server.listen(200)
  40. tmp_list = []
  41. while True:
  42. print('服务器启动,监听客户端链接')
  43. conn, addr = tcp_server.accept()
  44. file_ip = addr[0]
  45. head_struct = conn.recv(4) # 接收报头的长度,
  46. if head_struct:
  47. print('已连客户端,等待接收数据')
  48. head_len = struct.unpack('i', head_struct)[0] # 解析出报头的字符串大小
  49. data = conn.recv(head_len) # 接收长度为head_len的报头内容的信息 (包含文件大小,文件名的内容)
  50. head_dir = json.loads(data.decode('utf-8'))
  51. filesize_b = head_dir['filesize_bytes']
  52. file_name = head_dir['filename']
  53. #遇到同个文件更新第二次了2就要先发到gitlab一下
  54. tmp_post = file_ip + file_name
  55. if tmp_post in tmp_list:
  56. push_gitlab()
  57. tmp_list = []
  58. file_post = create_dir(file_ip, file_name)
  59. tmp_list.append(tmp_post)
  60. print(file_post + "进行更新了")
  61. #接受真的文件内容
  62. recv_len = 0
  63. recv_mesg = b''
  64. old = time.time()
  65. f = open(file_post, 'wb')
  66. while recv_len < filesize_b:
  67. percent = recv_len / filesize_b
  68. if filesize_b - recv_len > buffsize:
  69. recv_mesg = conn.recv(buffsize)
  70. f.write(recv_mesg)
  71. recv_len += len(recv_mesg)
  72. else:
  73. recv_mesg = conn.recv(filesize_b - recv_len)
  74. recv_len += len(recv_mesg)
  75. f.write(recv_mesg)
  76. print(recv_len, filesize_b)
  77. now = time.time()
  78. stamp = int(now - old)
  79. print('总共用时%ds' % stamp)
  80. f.close()
  81. conn.close()
  82. tcp_server.closel()
  83. post_sock()

/root/bin/push.sh

  1. #!/bin/bash
  2. tmp_dir=${1}
  3. git_dir=${2}
  4. git_url=${3}
  5. if [[ -d ${git_dir} ]];then
  6. rm -rf ${git_dir}
  7. fi
  8. cd /
  9. git clone ${git_url}
  10. \cp -rf ${tmp_dir}/* ${git_dir}/
  11. #更新代码
  12. cd ${git_dir}
  13. git add .
  14. git commit -m "pyscript update"
  15. git push origin master
  16. #清理
  17. cd /root
  18. rm -rf ${tmp_dir}
  19. rm -rf ${git_dir}

客户端

file-slave

要修改host为服务端地址

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from socket import *
  4. import json, commands, string, os
  5. import sys, struct
  6. #[masterip-端口、配置文件位置]
  7. host_info = (('172.16.5.4', 7777))
  8. cfg_wei = "/tmp/ecs-file.cfg"
  9. def md5_file(file_name):
  10. #根据传入的文件名,显示md5值
  11. import hashlib
  12. with open(file_name, 'r') as fp:
  13. data = fp.read()
  14. md5_number = hashlib.md5(data).hexdigest()
  15. return md5_number
  16. def write_cfg(file_dict):
  17. #将字典写入到配置文件里
  18. with open(cfg_wei, 'w') as fp:
  19. fp.write(str(file_dict))
  20. def read_cfg():
  21. #读取配置文件内容
  22. with open(cfg_wei, 'r') as fp:
  23. data = fp.read()
  24. file_dict = eval(data)
  25. return file_dict
  26. def add_file(file_name):
  27. #添加新文件使用
  28. import os
  29. if os.path.exists(file_name) != True:
  30. print("文件路径不存在")
  31. sys.exit(1)
  32. if os.path.exists(cfg_wei) == True:
  33. file_dict = read_cfg()
  34. if file_name in file_dict.keys():
  35. print("已经加入到管理")
  36. else:
  37. md5_number = md5_file(file_name)
  38. file_dict[file_name] = md5_number
  39. write_cfg(file_dict)
  40. print(file_name + "加入到管理成功")
  41. post_data(file_name)
  42. else:
  43. md5_number = md5_file(file_name)
  44. file_dict = {file_name : md5_number}
  45. write_cfg(file_dict)
  46. print(file_name + "加入到管理成功")
  47. post_data(file_name)
  48. def check_file():
  49. #根据配置文件,重新筛查一遍md5值是否一样
  50. import os
  51. fk = 0
  52. if os.path.exists(cfg_wei) == True:
  53. file_dict = read_cfg()
  54. for file_name in file_dict.keys():
  55. if os.path.exists(file_name) != True:
  56. del file_dict[file_name]
  57. fk = 1
  58. print( file_name + "文件不存在了,将清理本地记录,后续使用请重新加入管理")
  59. break
  60. md5_number = md5_file(file_name)
  61. if md5_number != file_dict[file_name]: #不对等就传文件到服务端
  62. file_dict[file_name] = md5_number
  63. post_data(file_name)
  64. fk = 1
  65. print(file_name + "有变动,进行更新")
  66. if fk == 1:
  67. write_cfg(file_dict)
  68. else:
  69. print("配置文件不存在,退出检测")
  70. def post_data(file_name):
  71. tcp_client = socket(AF_INET, SOCK_STREAM)
  72. buffsize = 1024
  73. tcp_client.connect_ex(host_info)
  74. filesize_bytes = os.path.getsize(file_name) # 得到文件的大小,字节
  75. dirc = {
  76. 'filename': file_name,
  77. 'filesize_bytes': filesize_bytes,
  78. }
  79. head_info = json.dumps(dirc) # 将字典转换成字符串
  80. head_info_len = struct.pack('i', len(head_info)) # 将字符串的长度打包
  81. tcp_client.send(head_info_len) # 发送head_info的长度
  82. tcp_client.send(head_info.encode('utf-8'))
  83. # 发送真是信息
  84. with open(file_name, 'rb') as f:
  85. data = f.read()
  86. tcp_client.sendall(data)
  87. print('发送成功')
  88. if len(sys.argv) != 2:
  89. print("使用: --check | /etc/passwd")
  90. sys.exit(1)
  91. if sys.argv[1] == "--check":
  92. check_file()
  93. else:
  94. file_name = sys.argv[1]
  95. tmp_list = file_name.split('/')
  96. pwd_dir = os.getcwd()
  97. if len(tmp_list) == 1:
  98. if pwd_dir == "/":
  99. file_name = pwd_dir + file_name
  100. else:
  101. file_name = pwd_dir + "/" + file_name
  102. add_file(file_name)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二.脚本
    • 服务端
    • 客户端
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档