配置文件管理维护到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 ...
随机推荐
- Linux驱动实践:带你一步一步编译内核驱动程序
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- dos的基本命令
打开cmd的方式 开始+系统+命令提示符 Win键+R 输入cmd打开控制台(推荐使用) 在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口 资源管理器的地址栏前面加上cmd + ...
- [loj3032]馕
(直接贪心会导致分子和分母过大) 令$S_{i}=\sum_{j=1}^{L}V_{i,j}$(即其独吞整个馕的快乐度),对第$i$个人求出$n$个位置$x_{1},x_{2},...,x_{n-1} ...
- [bzoj1071]组队
题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$从小到大 ...
- [bzoj1691]挑剔的美食家
考虑将奶牛和牧草放在一起,根据鲜嫩程度排序,那么显然就可以发现一个贪心策略:每一头奶牛一定选择当前剩余的最便宜且符合条件的牧草,然后用一个set维护价格即可 1 #include<bits/st ...
- AOP实现方式二
applicationContext.xml <!--方法二 自定义类--> <bean id="diyPointCut" class="com.sha ...
- 异常处理截止和UML图
0.异常处理机制 0.1.java中异常的作用是:增强程序健壮性. 0.2.java中异常以类和对象的形式存在. 1.java的异常处理机制 1.1.异常在java中以类和对象的形式存在.那么异常的继 ...
- vue属性绑定不能用双括号表达式
- tomcat指定特定版本的jdk
我是通过修改两个文件: setclasspath.bat和catalina.bat文件 linux在文件开头各自加上 export JAVA_HOME=/home/jdk/Java\jdk7\jdk1 ...
- Python——MacBook Pro中安装pip
1.系统已有python2和python3,如何检查MacBook Pro系统是否安装的有pip? 看到terminal的提示没有,有提示pip的,下面的提示,说明pip安装了. 要查看pip3是否安 ...