‘壹’ 纯干货!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构建一个可扩展的运维自动化平台
Django- 一个开放源代码的 Web 应用框架,由 Python 写成,采用了 MVC 的软件设计模式;
rpyc- 一个 Python 实现的 RPC 和分布式计算的工具。支持同步和异步操作、回调等;
saltstack 、 ansible 、 func - 基本 Python 开发的自动化配置管理与流程控制组件;
Mysql- 是一个非常流行的关系型数据库管理系统。
二、平台架构设计
1、 OMServer 架构图
大家对这个架构应该不会感到陌生,三层结构也是目前主流的运营平台架构。
2、 架构说明
OMServer 平台为三层架构,分别为 WEB 交互层、分布式计算层、集群管理服务层。
1) 、第一层:即为 WEB 交互层,典型的 B/S 架构,以供管理员操作的交互平台,也是 OMServer 的核心,基于 Django 开发;
2) 、第二层:分布式计算层,提供与主控端的连接通道,采用的是 rpyc 传输协议,协议操作流程:前端模块参数 -> 加密传输 -> 任务执行 -> 返回结果集 -> 解密输出。
3) 、第三层:集群管理服务层,整合 Python 主流的远程操作组件(支持 Saltstack 、 Anaible、 Func ),对被控端(业务服务器集群)进行管理,其中主控端可以根据不同 IDC 环境,采用多地多点的管理方式,可提升冗余度及执行效率。主控端操作模块以不同 Python 文件加以区分,便于维护,可灵活定制操作逻辑及横向扩展等特点。
‘叁’ 为什么运维用python
基于Python本身的优点:简单,易学,速度快,免费、开源,高层语言,可移植性,解释性,可扩展性,可嵌入性,丰富的库,独特的语法。Python已经成为现在编程的必备语言。作为“胶水语言”它能够把其他语言制作的各种模块轻松联结在一起。
比起C和Java,Python的魅力更为突显,因为完成同一项任务,C语言需要1000行代码,Java只需要100行代码,而Python可能只需要20行就轻松搞定。
相关推荐:《Python入门教程》
Python在系统运维上的优势在于其强大的开发多能力和完整的工业链,它的开发能力远强于各种Shell和Perl,的确通过Shell脚本来实现自动化运维!借助自动化运维来实现大规模集群维护的想法是对的,但由于Shell本身的可编程能力较弱,对很多日常维护中需要的特性支持不够,也没有现成的库可以借鉴,各种功能都需要从头写起,所以说Shell脚本力量不够。
而现Python是更好的选择,Python除了易读易写更兼具面向对象和函数式风格,已经成为IT运维、科学计算、数据处理等领域的主要编译语言。通过系统化的将各种管理工具结合,对各类工具进行二次开发,形成统一的服务器管理系统。
和Python类似的Ruby也很适合编写系统管理软件,但是在相关库和工具上比Python差远了。
让系统易运维管理是一个工程,Python在服务器管理工具上非常丰富:配置管理(Saltstack)、批量执行( Fabric, saltstack)、监控(Zenoss, nagios 插件)、虚拟化管理( Python-libvirt)、进程管理 (Supervisor)、云计算(Openstack)等,大部分系统C库都有Python绑定。
作为一门编程语言,Python几乎可以用在任何领域和场合,自身带有无限可能,担任任何角色。
从国内的豆瓣、搜狐、金山、腾讯、盛大、网易、网络、阿里、淘宝、热酷、薯仔、新浪、到国外的谷歌、NASA、YouTube、Facebook等互联网巨头公司都用Python完成各项任务。
随着云计算技术的发展与成熟,低端运维人员的市场越来越小,甚至是没有市场,因为中小型公司不需要运维,而大公司的门槛高,低端运维没有核心竞争力,会工程开发能力的运维才是大企业喜闻乐见的。
掌握Linux技能是一个运维人员的基本,要胜任大公司以企业及的运维工作光会Linux还远远不够。Linux+Python是运维的最佳搭配。
‘肆’ 如何用python做一个设备运维软件
Python开发的jumpserver跳板机
使用python语言编写的调度和监控工作流的平台内部用来创建、监控和调整数据管道。任何工作流都可以在这个使用Python来编写的平台上运行。
企业主要用于解决:通俗点说就是规范运维的操作,加入审批,一步一步操作的概念。
是一种允许工作流开发人员轻松创建、维护和周期性地调度运行工作流(即有向无环图或成为DAGs)的工具。这些工作流包括了如数据存储、增长分析、Email发送、A/B测试等等这些跨越多部门的用例。
这个平台拥有和 Hive、Presto、MySQL、HDFS、Postgres和S3交互的能力,并且提供了钩子使得系统拥有很好地扩展性。除了一个命令行界面,该工具还提供了一个基于Web的用户界面让您可以可视化管道的依赖关系、监控进度、触发任务等。
来个小总结