❶ 纯干货!python 在运维中的应用 (一):批量 ssh/sftp
日常工作中需要大量、频繁地使用ssh到服务器查看、拉取相关的信息或者对服务器进行变更。目前公司大量使用的shell,但是随着逻辑的复杂化、脚本管理的精细化,shell已经不满足日常需求,于是我尝试整合工作中的需求,制作适合的工具。 由于管理制度的缺陷,我以工作流程为核心思考适合自己的运维方式,提升工作效率,把时间留给更有价值的事情。 完整代码在最后,请大家参考。
生产:4000+物理服务器,近 3000 台虚拟机。
开发环境:python3.6、redhat7.9,除了paramiko为第三方模块需要自己安装,其他的直接import即可。
批量执行操作是一把双刃剑。批量执行操作可以提升工作效率,但是随之而来的风险不可忽略。
风险案例如下:
挂载很多数据盘,通常先格式化硬盘,再挂载数据盘,最后再写入将开机挂载信息写入/etc/fstab文件。在批量lsblk检查硬盘信息的时候发现有的系统盘在/sda有的在/sdm,如果不事先检查机器相关配置是否一致直接按照工作经验去执行批量操作,会很容易造成个人难以承受的灾难。
在执行批量操作时按照惯例:格式化硬盘->挂载->开机挂载的顺序去执行,假设有的机器因为某些故障导致格式化硬盘没法正确执行。在处理这类问题的时候通常会先提取出失败的ip,并再按照惯例执行操作。运维人员会很容易忽略开机挂载的信息已经写过了,导致复写(这都是血和泪的教训)。
所以,为了避免故障,提升工作效率,我认为应当建立团队在工作上的共识,应当遵守以下原则:
当然,代码的规范也应当重视起来,不仅是为了便于审计,同时也需要便于溯源。我认为应当注意以下几点:
1、ssh no existing session,sftp超时时间设置:
在代码无错的情况下大量ip出现No existing session,排查后定位在代码的写法上,下面是一个正确的示例。由于最开始没考虑到ssh连接的几种情况导致了重写好几遍。另外sftp的实例貌似不能直接设置连接超时时间,所以我采用了先建立ssh连接再打开sftp的方法。
2、sftp中的get()和put()方法仅能传文件,不支持直接传目录:
不能直接传目录,那换个思路,遍历路径中的目录和文件,先创建目录再传文件就能达到一样的效果了。在paramiko的sftp中sftp.listdir_attr()方法可以获取远程路径中的文件、目录信息。那么我们可以写一个递归来遍历远程路径中的所有文件和目录(传入一个列表是为了接收递归返回的值)。
python自带的os模块中的os.walk()方法可以遍历到本地路径中的目录和文件。
3、多线程多个ip使用sftp.get()方法时无法并发。
改成多进程即可。
4、多个ip需要执行相同命令或不同的命令。
由于是日常使用的场景不会很复杂,所以借鉴了ansible的playbook,读取提前准备好的配置文件即可,然后再整合到之前定义的ssh函数中。
同时,我们还衍生出一个需求,既然都要读取配置,那同样也可以提前把ip地址准备在文件里。正好也能读取我们返回的执行程序的结果。
参数说明:
密码认证:
公钥认证:
可以配合 grep,awk 等命令精准过滤。
个人认为 Python 在初中级运维工作中的性质更像是工具,以提升工作效率、减少管理成本为主。可以从当前繁琐的工作中解脱出来,去 探索 更有价值的事情。python 本质上并不会减少故障的产生,所以在不同的阶段合理利用自身掌握的知识解决当前最重要的痛点,千万不要本末倒置。
❷ 关于python 画图的问题,我有一串码完全看不懂,麻烦大家帮我看一下。
首先,确定三角形的位置需要三个点。代码里给出的myPoints = [[-100,-50],[0,100],[100,-50]]就是这三个点的位置,你可以在坐标轴里画一个x,y轴,找一下就知道了。如果只是想让三角形倒过来,就重新给它三个点[[-100,100],[100,100],[0,-50]]。
其次,三角形的边长,就是两个点之间的直线距离。从代码里可以看到,(-100,-50),(100,-50)这两个点是在同一条横向的线上,它们的距离是200.所以想把三角形的尺寸扩大两倍,就需要把边长扩大,给出新的点[[-200,200],[200,200],[0,-100]]
综上,修改main函数中的myPoints,即可达到你的需求:倒置三角形,尺寸扩大两倍
def main():
myTurtle = turtle.Turtle()
myWin = turtle.Screen()
myPoints = [[-200,200],[200,200],[0,-100]]
sierpinski(myPoints,3,myTurtle)
myWin.exitonclick()
再解释几个问题:
myTurtle.up() 和myTurtle.down()
可以把myTurtle看做是画笔,myTurtle.up()就表示把画笔从画布上抬起,也就是不跟画布接触。myTurtle.down()也就可以看成是画笔跟画布接触。
sierpinski是定义的一个递归画三角形的方法,degree可以理解成递归的深度,也就是说在一个三角形内可以再画几个小三角形(不包括中间的三角形)。代码里degree 是3,你可以运行一下代码,看看效果。
希望能帮到你,有疑问请追问!
❸ python如何用for语句编写倒置的直角三角形程序,要求*号顺序是7.5.3.1
利用Python的for循环,我们可以轻松地创建一个倒置的直角三角形,其中*号的顺序为7、5、3、1。首先,我们需要设定一个范围,从7开始,每次递减2,直到0。通过使用print函数和乘法运算符,我们可以实现所需的效果。具体代码如下:
for x in range(7, 0, -2):
print('*' * x)
这段代码将依次打印出以下内容:
*********
*****
***
*
代码中的range(7, 0, -2)表示从7开始,每次递减2,直到0(不包括0)。在for循环内部,print('*' * x)会将x个星号打印出来。通过调整range的参数,可以改变星号的数量和排列方式,从而实现不同的图形效果。
例如,如果我们将range的范围改为range(10, 0, -2),则会得到一个更大的倒置直角三角形,星号的顺序变为10、8、6、4、2:
**********
********
******
****
**
当然,我们也可以根据需要调整range的起始值、结束值和步长,以创造出更多有趣的图形。这不仅有助于理解for循环的工作原理,还可以提高编程技能,培养创造力。
通过实践和探索,我们可以发现Python语言的强大之处。使用简单的for循环和字符串操作,就能轻松地实现复杂的图形绘制。这对于初学者来说是一个很好的起点,同时也为进阶学习打下了坚实的基础。
❹ 利用python输出倒置排列的九九乘法表
通过使用Python,我们可以生成一个倒置排列的九九乘法表,具体代码如下:
for ii in range(9, 0, -1):
for jj in range(9, 0, -1):
if jj <= ii:
print('{0}*{1}={2}'.format(ii, jj, str((ii * jj)).rjust(2, ' ')), '', end='')
print('')
运行这段代码,我们得到的结果是:
9*9=819*8=729*7=639*6=549*5=459*4=369*3=279*2=189*1=9 8*8=648*7=568*6=488*5=408*4=328*3=248*2=168*1=8 7*7=497*6=427*5=357*4=287*3=217*2=147*1=7 6*6=366*5=306*4=246*3=186*2=126*1=6 5*5=255*4=205*3=155*2=105*1=5 4*4=164*3=124*2=84*1=4 3*3=93*2=63*1=3 2*2=42*1=2 1*1=1
这样,我们就可以得到一个从9乘9到1乘1的倒序排列的乘法表,每个乘法表达式右侧补足两位数,使得每行的格式统一。
通过这样的方式,我们可以利用Python轻松生成各种形式的乘法表,不仅限于倒置排列,还可以生成正序排列或其他特殊排列的乘法表。
此外,这种方式也可以根据需要调整乘法表的大小,只需修改range函数中的参数即可。
总之,利用Python生成乘法表是一种非常灵活且高效的方法,可以满足各种不同的需求。