配置文件管理维护到gitlab上
一.简介
在日常维护服务器中,会修改配置文件或者相应脚本,在修改前要对文件进行按照日期备份,这样会很麻烦,频繁修改的时候也会懒得去备份多个。
维护脚本分为服务端和客户端,服务端监听端口,接收客户端的采集信息,当有变动时就将变更提交到gitlab的项目中,在上面存储,这样方便在gitlab上查看变动信息。
文件内容用机器的IP地址区分,具体路径和文件路径一致

保存配置文件真的很舒服

使用:
1.在某台机器启动服务端,服务端将监听7777端口
nohup /usr/bin/python3 -u /root/bin/ecs-file-master.py >> /var/log/ecs-file-master.log 2>&1 &
2.在其它机器将客户端脚本复制到/usr/local/bin/下,并添加执行权限
3.在客户端需要将文件加入管理的时候file-slave /etc/xxx或相对路径file-slave xxx,将文件加入到管理,加入一次即可
4.在客户端编写定时任务,添加定时检测本地文件是否有变化
* * * * * /usr/bin/python -u /usr/local/bin/file-slave --check >> /var/log/file-slave.log 2>&1
当然手动执行也可以,就是每次变动完得手动一下
file-slave --check
5.客户端配置文件在/tmp/ecs-file.cfg,为脚本自动添加
二.脚本
服务端
ecs-file-master.py
要修改脚本,host为服务端ip,git的url为项目地址,要手动建好
#!/usr/bin/python3
#当同一个文件更新2次时,则提交一次到线上
#nohup /usr/bin/python3 -u /root/bin/ecs-file-master.py >> /var/log/ecs-file-master.log 2>&1 &
from socket import *
import sys, time, os, json, struct
#[服务端ip-端口、临时文件位置、git位置、git项目url、push的脚本位置]
host_info = (('172.16.5.4', 7777))
tmp_dir = "/tmp-file"
git_dir = "/ecs-file"
git_url = "http://192.168.1.1/jenkins/ecs-file.git"
push_script = "/root/bin/push.sh"
buffsize = 1024
def create_dir(file_ip, file_name):
#创建目录,然后返回文件名
name_list = file_name.split('/')
if len(name_list) == 2:
dir_post = tmp_dir + "/" + file_ip
file_post = dir_post + "/" + name_list[1]
else:
dir_post = tmp_dir + "/" + file_ip
name_number = len(name_list)
name_number = name_number - 1
i = 1
while i < name_number:
dir_post = dir_post + "/" + name_list[i]
i = i + 1
file_post = dir_post + "/" + name_list[-1]
create_bin = "mkdir -p " + dir_post
os.system(create_bin)
return file_post
def push_gitlab():
#将代码push到gitlab上进行更新
push_bin = push_script + " " + tmp_dir + " " + git_dir + " " + git_url
os.system(push_bin)
def post_sock():
tcp_server = socket(AF_INET, SOCK_STREAM)
tcp_server.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
tcp_server.bind(host_info)
tcp_server.listen(200)
tmp_list = []
while True:
print('服务器启动,监听客户端链接')
conn, addr = tcp_server.accept()
file_ip = addr[0]
head_struct = conn.recv(4) # 接收报头的长度,
if head_struct:
print('已连客户端,等待接收数据')
head_len = struct.unpack('i', head_struct)[0] # 解析出报头的字符串大小
data = conn.recv(head_len) # 接收长度为head_len的报头内容的信息 (包含文件大小,文件名的内容)
head_dir = json.loads(data.decode('utf-8'))
filesize_b = head_dir['filesize_bytes']
file_name = head_dir['filename']
#遇到同个文件更新第二次了2就要先发到gitlab一下
tmp_post = file_ip + file_name
if tmp_post in tmp_list:
push_gitlab()
tmp_list = []
file_post = create_dir(file_ip, file_name)
tmp_list.append(tmp_post)
print(file_post + "进行更新了")
#接受真的文件内容
recv_len = 0
recv_mesg = b''
old = time.time()
f = open(file_post, 'wb')
while recv_len < filesize_b:
percent = recv_len / filesize_b
if filesize_b - recv_len > buffsize:
recv_mesg = conn.recv(buffsize)
f.write(recv_mesg)
recv_len += len(recv_mesg)
else:
recv_mesg = conn.recv(filesize_b - recv_len)
recv_len += len(recv_mesg)
f.write(recv_mesg)
print(recv_len, filesize_b)
now = time.time()
stamp = int(now - old)
print('总共用时%ds' % stamp)
f.close()
conn.close()
tcp_server.closel()
post_sock()
/root/bin/push.sh
#!/bin/bash
tmp_dir=${1}
git_dir=${2}
git_url=${3}
if [[ -d ${git_dir} ]];then
rm -rf ${git_dir}
fi
cd /
git clone ${git_url}
\cp -rf ${tmp_dir}/* ${git_dir}/
#更新代码
cd ${git_dir}
git add .
git commit -m "pyscript update"
git push origin master
#清理
cd /root
rm -rf ${tmp_dir}
rm -rf ${git_dir}
客户端
file-slave
要修改host为服务端地址
#!/usr/bin/python
#coding=utf-8
from socket import *
import json, commands, string, os
import sys, struct
#[masterip-端口、配置文件位置]
host_info = (('172.16.5.4', 7777))
cfg_wei = "/tmp/ecs-file.cfg"
def md5_file(file_name):
#根据传入的文件名,显示md5值
import hashlib
with open(file_name, 'r') as fp:
data = fp.read()
md5_number = hashlib.md5(data).hexdigest()
return md5_number
def write_cfg(file_dict):
#将字典写入到配置文件里
with open(cfg_wei, 'w') as fp:
fp.write(str(file_dict))
def read_cfg():
#读取配置文件内容
with open(cfg_wei, 'r') as fp:
data = fp.read()
file_dict = eval(data)
return file_dict
def add_file(file_name):
#添加新文件使用
import os
if os.path.exists(file_name) != True:
print("文件路径不存在")
sys.exit(1)
if os.path.exists(cfg_wei) == True:
file_dict = read_cfg()
if file_name in file_dict.keys():
print("已经加入到管理")
else:
md5_number = md5_file(file_name)
file_dict[file_name] = md5_number
write_cfg(file_dict)
print(file_name + "加入到管理成功")
post_data(file_name)
else:
md5_number = md5_file(file_name)
file_dict = {file_name : md5_number}
write_cfg(file_dict)
print(file_name + "加入到管理成功")
post_data(file_name)
def check_file():
#根据配置文件,重新筛查一遍md5值是否一样
import os
fk = 0
if os.path.exists(cfg_wei) == True:
file_dict = read_cfg()
for file_name in file_dict.keys():
if os.path.exists(file_name) != True:
del file_dict[file_name]
fk = 1
print( file_name + "文件不存在了,将清理本地记录,后续使用请重新加入管理")
break
md5_number = md5_file(file_name)
if md5_number != file_dict[file_name]: #不对等就传文件到服务端
file_dict[file_name] = md5_number
post_data(file_name)
fk = 1
print(file_name + "有变动,进行更新")
if fk == 1:
write_cfg(file_dict)
else:
print("配置文件不存在,退出检测")
def post_data(file_name):
tcp_client = socket(AF_INET, SOCK_STREAM)
buffsize = 1024
tcp_client.connect_ex(host_info)
filesize_bytes = os.path.getsize(file_name) # 得到文件的大小,字节
dirc = {
'filename': file_name,
'filesize_bytes': filesize_bytes,
}
head_info = json.dumps(dirc) # 将字典转换成字符串
head_info_len = struct.pack('i', len(head_info)) # 将字符串的长度打包
tcp_client.send(head_info_len) # 发送head_info的长度
tcp_client.send(head_info.encode('utf-8'))
# 发送真是信息
with open(file_name, 'rb') as f:
data = f.read()
tcp_client.sendall(data)
print('发送成功')
if len(sys.argv) != 2:
print("使用: --check | /etc/passwd")
sys.exit(1)
if sys.argv[1] == "--check":
check_file()
else:
file_name = sys.argv[1]
tmp_list = file_name.split('/')
pwd_dir = os.getcwd()
if len(tmp_list) == 1:
if pwd_dir == "/":
file_name = pwd_dir + file_name
else:
file_name = pwd_dir + "/" + file_name
add_file(file_name)
配置文件管理维护到gitlab上的更多相关文章
- 【GitLab】gitlab上配置webhook后,点击测试报错:Requests to the local network are not allowed
gitlab上配置webhook后,点击测试报错: Requests to the local network are not allowed 操作如下: 报错: 错误原因: gitlab 10.6 ...
- Linux安装LAMP开发环境及配置文件管理
Linux主要分为两大系发行版,分别是RedHat和Debian,lamp环境的安装和配置也会有所不同,所以分别以CentOS 7.1和Ubuntu 14.04做为主机(L) Linux下安装软件,最 ...
- Python-day3作业-haproxy配置文件管理脚本
#!/usr/bin/env python import os,sys,time,re,prettytable,json from collections import defaultdict,Ord ...
- 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向
先来点与标题不相关的: CLR支持两种程序集:弱命名程序集和强命名程序集. 两者的区别在于强命名程序集使用发布者的公钥和私钥进行签名.由于程序集被唯一性地标识,所以当应用程序绑定到强命名程序集时,CL ...
- 使用git命令将本地项目上传到Gitlab上
1.首先需要安装本地需要安装git 2.在gitlab上创建项目, 如下图, 点击右上角加号到项目创建页面, 填写项目名称, 选择项目访问权限, private为授权的组员才能访问. 3.打开项目源代 ...
- GIT的使用(Gitlab上传本地仓库代码,Webstorm修改更新)
准备:GIT的安装,Gitlab账户登陆,webstorm的安装 1.首先,你得先会在Gitlab中创建一个团体,在团体中创建一个项目,先建组,再建项目,网上哪里都有教程,随便找了个网址: https ...
- 如何将新建的项目完整的提交到gitlab上?
描述: 使用idea开发工具新建了一个项目工程,此时此刻工程没有任何的版本控制,代码存放在本地磁盘中,如果需要直接将项目工程代码提交到gitlab上,该如何操作呢? 因为当前没有版本控制,不能像正常的 ...
- jenkins如何获取gitlab上的代码
如何安装jenkins和gitlab我就不重复了,请自行搜索我的博客 那么,jenkins如何获取gitlab上的代码呢? 具体配置步骤如下 1.在gitlab上配置个人访问令牌.注意事项:姓名那里需 ...
- Linux DNS 服务器安装、配置和维护
每个 IP 地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开.有了主机名,就不要死记硬背每台 IP 设备的 IP 地址,只要记住相对直观有意义的主机名就行了.这就是 DNS ...
随机推荐
- vue + cesium开发(3) cesium1.87更新问题
官方在2021年11月1号更新日志中记录了他们把zip.js升级到了2.3.12以适应webpack4中的关于import.meta不兼容的语法问题,但是经过实测,1.87版本依然没有解决这个问题,所 ...
- 如何设计一个高内聚低耦合的模块——MegEngine 中自定义 Op 系统的实践经验
作者:褚超群 | 旷视科技 MegEngine 架构师 背景介绍 在算法研究的过程中,算法同学们可能经常会尝试定义各种新的神经网络层(neural network layer),比如 Layer No ...
- Centos上安装MongoDB4.X
一.下载并解压MongoDB 1.下载MongoDB 取件码w2px 2.通过ftp软件上传的服务器上,我的位置:/root/softwares 3.解压并放在opt文件夹下:tar zxvf mon ...
- python实现圆检测
目录: (一)霍夫圆检测原理 (二)代码实现 (一)霍夫圆检测原理 (二)代码实现 1 #霍夫圆检测 2 import cv2 as cv 3 import numpy as np 4 5 def d ...
- [luogu7468]愤怒的小N
定义$count(x)$为$x$二进制下1的个数,答案即$\sum_{0\le x<n,count(x)\equiv 1(mod\ 2)}f(x)$ 考虑预处理出$S_{k,i,p}=\sum_ ...
- [atARC112E]Rvom and Rsrev
毒瘤分类讨论题 (注:以下情况都有"之前的情况都不满足的"前提条件,并用斜体表示一些说明) Case0:若$|s|\le 2$,直接输出即可,因此假设$|s|>3$ 首先,我 ...
- [luogu6860]象棋与马
根据扩欧$(a,b)=1$必须要满足,同时,若$a+b$为偶数则格子的"奇偶性"不变,因此$a+b$必须为奇数 反过来,容易证明满足$(a,b)=1$且$a+b$为奇数则一定可行( ...
- SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做的设计(1)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们在这一节首先分析下 Spring Cloud Gateway 一些其他可能丢失链路信息 ...
- 聊聊并发(六)——CAS算法
一.原子类 1.CAS算法 强烈建议读者看这篇之前,先看这篇 初识JUC 的前两节,对原子性,原子变量,内存可见性有一个初步认识. CAS(Compare and Swap)是一种硬件对并发的支持,针 ...
- 如何用three.js搭建处理3D园区、3D楼层、3D机房管线(机房升级版)-第九课(二)
接着上一篇文章,<如何用webgl(three.js)搭建处理3D园区.3D楼层.3D机房管线问题(机房升级版)-第九课(一)> 继续讲解关于三维数据中心管线可视化的解决方案. 上一篇我们 ...