Python自动化运维2
时间:2022-07-28
本文章向大家介绍Python自动化运维2,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[TOC]
配置文件
yaml 配置
描述:yaml配置文件与xml配置文件以及json配置文件的共同之处是在于方便理解与使用,是配置文件更加的简洁通俗易懂;
ruamel.yaml 模块
官网链接: https://pypi.org/project/ruamel.yaml/
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : YamlDemo.py
# @CreateTime : 2019/7/24 11:07
# @Author : WeiyiGeek
# @Function : Yaml语言解析
# @Software: PyCharm
# pip install ruamel.yaml
import sys
import ruamel.yaml
def main():
#(1)读取Yaml配置文件信息
yaml = ruamel.yaml.YAML()
with open('demo.yaml','r',encoding='utf-8') as conf:
try:
config = yaml.load(conf)
except ruamel.yaml.YAMLError as e:
print("解析错误:",e)
#(2)打印出yaml的配置文件信息 常量scales
for i in config:
print(i, " : ", config[i])
#对象Object
for i in config['obj']:
print(i, config['obj'][i])
#数组Array
print(config['array'][0]['key1'], config['array'][1]['key2'], config['array'][2]['key3'])
#(3)修改与添加
config['NAME'] = "WeiyiGeek"
config['add'] = "WeiyiGeek"
config['obj']['age'] = "888"
config['obj']['love'][1] = "烹饪"
#(4)写入存档
with open("update.yml",'w+',encoding='utf-8') as con:
ruamel.yaml.dump(config, con, allow_unicode=True, Dumper=ruamel.yaml.RoundTripDumper) #加上Dumper原来是什么样式就是什么样式
ruamel.yaml.dump(config, sys.stdout, Dumper=ruamel.yaml.RoundTripDumper) #修改后输出到终端
if __name__ == '__main__':
main()
运行结果:
#打印结果
PI : 3.1415926
NAME : “This is a String”
INT : 1024
obj : ordereddict([('name', 'WeiyiGeeK'), ('age', 18), ('love', ['Computer', 'Cook', 'car'])])
array : [ordereddict([('key1', 'I')]), ordereddict([('key2', 'Love')]), ordereddict([('key3', 'Study')])]
name WeiyiGeeK
age 18
love ['Computer', 'Cook', 'car']
I Love Stud
#yaml写入文件结果
#常量
PI: 3.1415926
NAME: WeiyiGeek
INT: 1024
#对象(集合)
obj:
name: WeiyiGeeK
age: '888'
love: !!obj
- Computer
- "u70F9u996A"
- car
#数组
array:
- key1: I
- key2: Love
- key3: Study
add: WeiyiGeek
参考
ini 配置
文件备份
描述:采用filecmp模块对进行确认备份目录与源目录文件是否保持一致,并且同步源目录文件到目标目录之中:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : verity.py
# @CreateTime : 2019/7/26 14:23
# @Author : WeiyiGeek
# @Function : 同步校验源文件/目标文件
# @Software: PyCharm
import os,sys
import filecmp
import shutil
holderlist = []
destination = []
def compareme(src, dest):
dircomp = filecmp.dircmp(src, dest);
onlyfile = dircomp.left_only #源文件新目录或者文件
difffile = dircomp.diff_files #源目录中发生变化的文件(不匹配的文件)
dirpath = os.path.abspath(src)
#将发生变量的文件路径写入到,采用lamba表达式
[holderlist.append(os.path.abspath(os.path.join(src, x))) for x in onlyfile] #将源文件中创建的文件绝对路径存入数组中
[holderlist.append(os.path.abspath(os.path.join(src, x))) for x in difffile] #将源文件中的发生改变的文件/目录绝对路径存入数组中
#src / desc 两边都存在的文件(继续递归对比)
if len(dircomp.common_dirs):
for item in dircomp.common_dirs:
compareme(os.path.abspath(os.path.join(src, item)), os.path.abspath(os.path.join(dest, item)))
return holderlist
def main():
global destination,
holderlist
if len (sys.argv) > 2:
src = sys.argv[1]
dest = sys.argv[2]
else:
print("""
Usage: verity.py srcDirectory destDirectory
""")
sys.exit(1)
source_files = compareme(src, dest) #比较源目录与备份
dir1 = os.path.abspath(src)
dir2 = os.path.abspath(dest)
createdir = False
#变量返回差异性文件 (替换路径后重新放入destination数组中为后面的zip做准备)
for item in source_files:
#获取源文件中的目录
destination_dir = item.replace(dir1,dir2)
destination.append(destination_dir)
#创建目录(再目录不存在的情况下)
if os.path.isdir(item):
if not os.path.exists(destination_dir):
os.makedirs(destination_dir)
createdir = True
#如果创建目录,重新遍历新创建的目录
if createdir:
destination = [] #防止重复
srcfile = compareme(dir1,dir2)
holderlist = srcfile
for item in srcfile:
destination.append(item.replace(dir1,dir2))
[ print(x) for x in destination]
print("update item")
copy_pair = zip(source_files, destination) #源/备份目录文件清单拆分成元组
for item in copy_pair: #判断文件复制操作
if os.path.isfile(item[0]):
shutil.copyfile(item[0],item[1])
print(item)
if __name__ == '__main__':
main()
WeiyiGeek.filecmp文件目录校验
- 项目工具类
- AJAX常见面试题
- 干货 | Tomcat类加载机制触发的Too many open files问题分析
- 并行查询缓慢的问题分析(r5笔记第86天)
- Swagger文档转Word 文档
- AJAX应用【股票案例、验证码校验】
- IT中的闰秒问题(r5笔记第85天)
- 浅谈exp/imp(下) (r5笔记第84天)
- 多线程编程学习五(线程池的创建)
- 再学习之Spring(面向切面编程).
- Hybris CronJob
- tomcat源码编译和环境搭建(r5笔记第83天)
- NumPy 将停止支持 Python 2,这里有一份给数据科学家的 Python 3 使用指导
- Apache solr(一).
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法集锦(3)|采用医疗数据预测糖尿病的算法
- 谁说Cat不能做链路跟踪的,给我站出来
- Libra:一种Python工具,可以用几行代码自动实现机器学习过程
- 国内首个“新基建”安全大赛启动了!
- Kubernetes 中 Informer 的使用
- 嵌入式开发中常见3个的C语言技巧
- 恕我直言,我也是才知道ElasticSearch条件更新是这么玩的
- 有了MinIO,你还会用FastDFS么?
- STP 实验
- 算法集锦(6) |基于GPU框架的tensorflow数据增强算法
- 交换机端口安全实验
- 算法集锦(7)| 实用代码 | Google Colab使用及配置技巧
- 浏览器标签页分屏_不同浏览器同一个tab里面怎么实现分屏?#技能get#
- 微信小程序开发实战(16):交互组件
- Linux常用命令