配置文件管理维护到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 ...
随机推荐
- selenium基本使用,及cannot find chrome binary解决方案
什么是selenium? Selenium是一个用于Web应用程序测试的工具. Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样. 支持通过各种driver(FirfoxDriver ...
- 菜鸡的Java笔记 数字操作类
数字操作类 Math 类的使用 Random 类的使用 BigInteger 和 BigDecimal 类的使用 Math 是一 ...
- 菜鸡的Java笔记 - java 多对多映射
要求: 1.将数据还原为简单java类 2.数据的输出: 可以根据一个用户输出它对应的角色以及每个角色对应的权限,以及包含的具体的权限详情: 一个权限可以输出具 ...
- MySQL 1064 错误
ERROR 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL s ...
- Git操作: git commit代码后,如何撤回且保留commit的代码
git commit代码后,但是没有push之前,如果发现提交的代码有一个部分是有问题的,或者commit message写的太随便了想改一下,以下命令会帮到你 git reset HEAD^ 敲击该 ...
- DataGrid首次进入页面时,不加载任何数据[转]
首次不加载数据问题,必须搞明白如何才能不加载数据.根据Easu UI的官方API: http://www.jeasyui.com/documentation/ 仔细观察DataGrid的事件当中有一个 ...
- 洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)
题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...
- 生成&添加 SSH公钥
生成&添加 SSH公钥 生成 打开 Terminal(终端) 生成命令 ssh-keygen -t ed25519 -C "your_email@example.com" ...
- Matlab矢量图图例函数quiverkey
Matlab自带函数中不包含构造 quiver 函数注释过程,本文参照 matplotlib 中 quiverkey 函数,构造类似函数为 Matlab 中 quiver 矢量场进行标注. quive ...
- [linux] 常用命令及参数-2
sort 1 sort是把结果输出到标准输出,因此需要输出重定向将结果写入文件 2 sort seq.txt > file.txt 3 sort -u seq.txt 输出去重重复后的行 4 s ...