一个批量部署脚本(未完成)

脚本设计

首先安装ansible,并且用group1,group2…对相同模块的服务器进行分组,注意!group1只能是一台服务器,剩下的服务器均摊。

按模块依赖顺序输入,模块名称用逗号分隔。进行for循环,先使用ansible对group1进行部署工作,部署模块并且启动之后,暂停600秒,让开发利用这10分钟检查日志和配置项是否有问题,如果有问题就ctrl+c,在暂停600秒的同时,脚本新开一个进程A,paramiko到第一台服务器里,检查日志是否出现ERROR等关键字样,如果有就输出,600秒结束之后,关闭线程A,继续部署group2,直至名单里所有的模块都部署完毕。

作画的意思如下:
akb48

用python去实现tailf功能

在shell下执行tail -f就是一句话的事,但是用python实现则需要一个脚本了,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
#coding=utf-8
import time

def watch(fn, words):
fp = open(fn, 'r')
while True:
new = fp.readline()

if new:
for word in words:
if word in new:
yield (word, new)
else:
time.sleep(1)

fn = '文件路径'
words = ['关键词']
for hit_word, hit_sentence in watch(fn, words):
print "发现关键词 %r 在日志里: %r" % (hit_word, hit_sentence)

python实现线程通信

假设我们有一个函数叫AAA,希望脚本能开两个线程,线程A是等待5秒,线程B是不断的执行AAA(),直到5秒结束,线程B也停止线程AAA()。那么脚本如下:

按行读取文件取各种集合

python对于两个字典求交集(&),差集(-),全集(|)比较简单,而对于两个文件按行取集合的方法如下:

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
s1 = set(open(r'C:\Users\33664\Desktop\aaa.txt','r').readlines())
s2 = set(open(r'C:\Users\33664\Desktop\bbb.txt','r').readlines())

print ('交集是: %s' % (s1.intersection(s2)))
print ('并集是: %s' % (s1.union(s2)))
print ('差集是: %s'%(s1.difference(s2)))
print ('dif: %s'%(s1.difference(s2).union(s2.difference(s1))))

_的问题

有些python脚本在for循环里会有这样的代码:

1
2
for _ in range(5)
print ("我想放假,我想放假")

这里面的独立_其实没有特殊的意义,仅仅是是用作一个名字,来表示某个变量是临时的或无关紧要的。

不过_还有其他的用途,它可以展示最近的一次表达式的结果,比如:

1
2
3
4
5
6
>>> 20 + 3
23
>>> _
23
>>> print(_)
23

额外补充

1.tailf命令主动停止命令:tail -f 目标日志|sed '/启动成功/Q',此语句会在”启动成功”打印时退出,但log只能打印到”启动成功”的上一行;
2.subprocess.call("命令1"),命令1是按顺序执行的,效果等同于subprocess.Popen("命令1").wait()subprocess.Popen("命令2"),命令2是与前一个命令并发进行的;

参考资料

https://stackoverflow.com/questions/1703640/how-to-implement-a-pythonic-equivalent-of-tail-f
https://python3-cookbook.readthedocs.io/zh_CN/latest/c12/p03_communicating_between_threads.html
https://stackoverflow.com/questions/22698754/subprocess-calls-are-they-done-in-parallel/22698825#22698825
akb48

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------