python在系统运维中都有哪些应用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tinytub
V2EX    DevOps

python在系统运维中都有哪些应用?

  •  
  •   tinytub 2013 年 7 月 9 日 via iPad 17688 次点击
    这是一个创建于 4620 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自学了一段时间python,感觉可能是我学习的姿势不太对。总是感觉python相比于shell和perl更偏向于web开发。而对linux的运维管理偏弱。
    抛开fabric等这类用python开发的运维工具不谈。自己在日常运维中运用python能做些什么?比shell脚本便捷或效率高的地方又体现在哪里?
    现在只用python写过部分日志分析脚本和从页面中提取uid生成链接然后测试播放等动作的简单脚本。
    其他的就不知道做些什么好了。
    想请v2上的前辈多给些指点,如果能有些具体实例就更好不过了。

    多谢大家
    37 条回复    2017-10-03 16:21:21 +08:00
    likuku
        1
    likuku  
       2013 年 7 月 9 日   4
    shell 语法很怪异,不同shell语法变化差异巨大,另外,不同系统(gnu vs bsd)/发行版默认shell不同。

    还有即便都叫做/bin/sh ,但不同发行版可能是完全不同的实现。

    甚至,还有同一个发行版 的 /bin/sh 在不同的历史时期是完全不同的实现(openbsd就是例子)。

    如此这般,不精分才怪。

    稍微复杂点,带比较/条件/选择/循环,的话,shell/bash 写起来就要死了,各种诡异的写法,和即便是 最基本的 比较 都可能需要用到shell以外的独立程序。

    例子:最近还记得的就是 自己写 python 脚本处理下载的电影字幕文件,因为有的字幕文件格式很怪异,让自己常用的播放器(XMplayer,射手播放器,XMBC) 不能正常显示。折腾过编辑器+正则来搞,很痛苦,总失败,遂写几行 python 解决,连带测试不到15分钟。
    likuku
        2
    likuku  
       2013 年 7 月 9 日
    再嗦下:python 在运维中,的优势:
    很多发行版都默认装了python;
    语法相较各种精分/变态的shell,python就是一次写好,到处运行;
    python 可以很轻易的与shell等linux资源混搭(os.system(),commands.getoutput(),也可以用shell的管道给py程序传输入信息);
    list/set 等很便利的类型,手册完备,学习容易,好记好用(精分的shell会死人的);
    BOYPT
        3
    BOYPT  
       2013 年 7 月 9 日
    普通运维上精通bash效果更加明显,操作效率明显高得多。

    在涉及复杂环境时候python可以作为一个很好的补充。
    bash处理精确字符时候需要sed/awk(虽然适合的时候他们要比别的东西好用多了),比如需要动态生成配置文件,bash做起来就很吃力了。
    glancesx
        4
    glancesx  
       2013 年 7 月 9 日
    往往写一些比较'大型'的工具会体现出来.优势就是库丰富,能做到你想不到,shell做不到的事情.
    tinytub
        5
    tinytub  
    OP
       2013 年 7 月 9 日
    @likuku 多谢解答,由于我这边系统环境比较单一,所以没遇到过shell在不同发行版的区别.正如@yegle 在知乎上所说,没遇到过shell在不同版本的区别,怎么好意思说自己会写脚本(大概是这个意思.). 看来深入学习python还是很有必要的.
    julyclyde
        6
    julyclyde  
       2013 年 7 月 9 日
    /bin/sh 如果你不用bourne shell之外的扩展语法的话还是可以保持通用的
    只不过shell这种语法的表达能力不算特别强而已
    另外在shell里,不同行之间想维护“状态”不太容易,因为其变量能保存的东西也有限。很多时候依赖管道
    tinytub
        7
    tinytub  
    OP
       2013 年 7 月 9 日
    @BOYPT 现在动态生成配置文件倒是直接用puppet的erb模板能够解决,确实很方便,不过实现方法是通过ruby.说到ruby,之所以不想学,是因为被ruby各种模块的小版本不兼容给搞烦了...唉唉,我果然不适合做开发.
    tinytub
        8
    tinytub  
    OP
       2013 年 7 月 9 日
    @julyclyde 记得之前带我入门的师傅说过.shell不过就是堆命令...咳咳.
    slickqt
        9
    slickqt  
       2013 年 7 月 9 日
    换个想法,会有那些应用可以用python来做可能会做得更好,更适合.
    落到实处才更有体会.
    如果你现在的工作不需要python也完成得很好了,其实真没必要非得python来着.
    想想那个当你手上是锤子的故事,只是现在你手上的锤子是python而已.
    tinytub
        10
    tinytub  
    OP
       2013 年 7 月 9 日
    @slickqt 当你握着一把大钉锤时,每个问题看起来都不过是一枚钉子而已。

    刚去搜了一下这句,谢提醒.
    ry_wang
        11
    ry_wang  
       2013 年 7 月 9 日
    其实我最想吐槽的是,为什么要抛开fabric此类运维工具。这些不恰恰是Python在运维领域强大最好的证明么。

    另外shell写出来的是脚本,python写出来的才叫工具。
    tinytub
        12
    tinytub  
    OP
       2013 年 7 月 9 日
    @ry_wang 呃,多谢吐槽.
    我并没有说python在运维领域不强大.只是想更多了解一下python在运维中能做哪些事情,如果要讨论fabric的使用和技巧我会单开个帖子询问.也因为目前部分生产环境中正在使用fabric,所以在这里要抛开fabric不谈,希望这里的前辈能给一些运维基于python其他方向的看法.

    当然上面几位前辈已经给出了不错的见解.同时也谢谢你的回复.
    likuku
        13
    likuku  
       2013 年 7 月 9 日
    关于 shell 和版本的话题,再加点料...很好玩的:

    关于双中括号的问题 - FreeBSD China : https://www.freebsdchina.org/forum/viewtopic.php?t=56452


    loader:

    文章发表于: Mon 2013-01-21 21:54:20 发表主题: 引用并回复

    door10000 写到:
    看来openbsd和freebsd的默认sh都不相同的。。


    欢迎你来地球玩...

    等我开始用 OpenBSD 的时候已经是默认 ksh 了
    原来曾经有过 NetBSD 的 ash
    引用:
    ----------------------------
    revision 1.9
    date: 1997/08/20 23:43:47; author: deraadt; state: dead; lines: +1 -1
    this has not been used for a while
    ----------------------------
    revision 1.8
    date: 1997/01/05 08:17:31; author: deraadt; state: Exp; lines: +2 -2
    HOSTCC; from rahnds
    ----------------------------
    revision 1.7
    date: 1996/10/20 00:54:41; author: millert; state: Exp; lines: +4 -4
    Sync with NetBSD. Adds better POSIX compliance amongst others.
    ----------------------------
    revision 1.6
    date: 1996/10/12 01:12:02; author: deraadt; state: Exp; lines: +2 -2
    use HOSTCC; from dale
    ----------------------------
    revision 1.5
    date: 1996/09/16 10:51:33; author: downsj; state: Exp; lines: +3 -1
    These should always be static.
    ----------------------------
    revision 1.4
    date: 1996/06/23 14:21:05; author: deraadt; state: Exp; lines: +1 -1
    update rcsid
    ----------------------------
    revision 1.3
    date: 1996/03/03 12:32:57; author: niklas; state: Exp; lines: +6 -9
    From NetBSD:
    Fix problems with the way init.o is built:
    * Prevent gratuitous rebuilds when nothing has changed.
    * Make sure it is rebuilt if a .h file is updated.
    ----------------------------
    revision 1.2
    date: 1995/12/14 01:22:27; author: deraadt; state: Exp; lines: +6 -1
    update from netbsd, including:
    Fix PR/1760, where 'cd -' before any other command could cause a reference
    to an uninitialized pointer. Use getcwd() to get the current working directory,
    instead of forking /bin/pwd [per Scott's suggestion]
    ----------------------------
    revision 1.1
    date: 1995/10/18 08:37:21; author: deraadt; state: Exp;
    branches: 1.1.1;
    Initial revision
    ----------------------------
    revision 1.1.1.1
    date: 1995/10/18 08:37:21; author: deraadt; state: Exp; lines: +0 -0
    initial import of NetBSD tree


    Bash这门UNIX下的壳语言 - FreeBSD China : https://www.freebsdchina.org/forum/viewtopic.php?t=58262

    若看完精分/精分加重,那么恭喜了,嗯,不用谢!
    likuku
        14
    likuku  
       2013 年 7 月 9 日
    不好意思,上面的忘记引用重要的一段:

    关于双中括号的问题 - FreeBSD China : https://www.freebsdchina.org/forum/viewtopic.php?t=56452


    「loader

    发表于: Mon 2013-01-21 20:08:27 发表主题:
    一开始我以为
    分不清哪些功能是 bashism 哪些不是的是 Linux 用户
    用了 bashism 功能却从不标明 bash 的是 Linux 用户
    认为用 sh 运行就能符合 POSIX 行为的是 Linux 用户

    直到后来我才知道 Bash 的 POSIX mode 得按照说明来
    http://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html#Bash-POSIX-Mode
    比如里面明确说明 26. Process substitution is not available.
    那么 <() 在 Bash POSIX mode 就不能用了, 而 [[ 这种没提到的就算开了 POSIX 也照样能用

    FreeBSD 里的 /bin/sh 是 ash
    http://www.in-ulm.de/~mascheck/various/ash/

    对照 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
    ash 也另外增加了些东西,不过 BSD 用户当然以 base 里的 ash 为标准,
    凡是 ash 能用而 POSIX 里没定义的是 feature, 凡是 ash 不能处理的肯定是 bashism XD

    另外,前些年有些发行版为了换成 dash (debian ash) 网上有过好多各种械斗
    https://bugs.launchpad.net/ubuntu/+source/dash/+bug/61463
    https://bugs.launchpad.net/ubuntu/+source/dash/+bug/141481
    BOYPT
        15
    BOYPT  
       2013 年 7 月 9 日
    不是有这样一本书么:

    http://book.douban.com/subject/4031965/ 《Python UNIX 和Linux 系统管理指南》

    你看里面的目录,主要还是发挥python的数据解释处理、通信、集成等等的能力。但真正运维操作里面的批处理,简单说批改文件,真心没sed好用;做文件处理,一句tar总比里面import这import那方便吧;查找文件,没find好用吧;搞fabric,加个公钥认证还重载这个那个,我觉得还不如我while cat read然后parallel ssh给远程方便。

    所以我认为Python,主要是在把运维任务模块化包装,以便留下接口供其他系统使用时候,作用很大;但是对于给个人的运维任务来说,了解shell的功能更加重要。
    clino
        16
    clino  
       2013 年 7 月 9 日
    我很讨厌shell/perl这种可读性上比较恶心的东东,所以大部分工具都是用 python 写的,shell大部分只用到直接列出命令这种简单的方式

    另外运维工具推荐ansible,比fabric强大和易于扩展
    cicku
        17
    cicku  
       2013 年 7 月 9 日
    围观各种 py 优越党
    TankyWoo
        18
    TankyWoo  
       2013 年 7 月 9 日
    我给Nagios写的插件都是python写的,shell在代码量过大后,因为一些复杂结构上的问题,肯定会稍显不足,而且你写的代码以后肯定还要有其他人看,除非你们大家都是用shell写的。。。

    perl我就不评论了,不了解
    terry
        19
    terry  
       2013 年 7 月 10 日
    Shell (Bash) 语法比较诡异,一直要翻手册,得考虑兼容性(比如碰到 Linux 上写的脚本到 Solaris 上跑步起来这种问题,头疼死)调试起来够呛。相对于 Python 它离开内核更近(更底层)执行效率高。除非超过100行,否则不考虑用 Python / Ruby 之类的。

    我所接触的 IT Infra 中,用 Python 写脚本来做简单的自动化非常普遍。大部分 *NIX 系统自带 Python 2.x 版本,方便,其代码可读性和可维护性比也 Shell 好。

    目前 DevOps 任务主要是用 Shell + Ruby (加少量遗留下来的 Python 脚本)的组合,用 Ruby (用不到 Rails ...)主要是早期用了 Vagrant + Chef Solo 后来又选择用 Chef 来做自动化和配置管理原因,用它来做 Shell 的补充不错。而且既然学了 Ruby 就不再去深入学习 Python 了,反正同事会互补;-)

    BTW: Python 写的 ops 工具太多了,都很牛!比如 ansible / salt / fabric / sunzi / graphite 等等,不胜枚举。

    @clino Ansible 已经不仅仅是个 parallel execution 框架/工具了,有了自己的 Playbooks 和 Chef 差不多,可以做配置管理了。不过个人感觉暂时还没法和 Chef 比。

    @TankyWoo perl ......
    clino
        20
    clino  
       2013 年 7 月 10 日
    @terry ansible 的 playbooks 我基本没用,我都是直接全 python 写脚本的方式来用的,这样更灵活些,另外自己也扩展了 library里的不少module.目前用起来感觉不错.
    其实对其他的运维工具了解不够多,所以不知道比较起来怎么样.
    terry
        21
    terry  
       2013 年 7 月 10 日
    @clino Ansible 已经算是成熟好用的工具了,成立商业公司之后模块一下子多了起来。但实际应用中会发现直接通过 SSH 操作大量机器是会出现问题的,这时候有中间件(Message Queue)的并行执行工具就要出场了,比如 MCollective 和 Salt 用 ActiveMQ / RabbitMQ 做消息队列来保证一致性和可靠性。

    BTW: Ansible 提供 SSH 和 Paramiko (一个 Python SSH 实现)两种连接方式,不知道后者是否也是基于上面提到的场景的考虑。
    dcoder
        22
    dcoder  
       2013 年 7 月 10 日
    以前被各种shell折腾惨了,现在基本只用Python写*nix上的脚本。

    问个可能很弱的问题,那个维护得很好的 oh-my-zsh 不是支持很多版本的*nix么,
    如果大家都用这个zsh,有希望统一各种不同的shell吗?
    clino
        23
    clino  
       2013 年 7 月 10 日
    @terry "但实际应用中会发现直接通过 SSH 操作大量机器是会出现问题的"
    这个有没有具体的信息?

    "Ansible 提供 SSH 和 Paramiko (一个 Python SSH 实现)两种连接方式,不知道后者是否也是基于上面提到的场景的考虑"
    这个我估计没有吧,因为服务端是一样的 ssh server,协议要一致吧.用ssh有个不好的是前面连接到能执行命令需要一段时间.好处是不用另外部署服务端.
    tinytub
        24
    tinytub  
    OP
       2013 年 7 月 11 日
    @clino ssh在同时连接大量服务器的时候不稳定,有的时候可能会卡断.而且网络条件对ssh也有很大的影响.
    terry
        25
    terry  
       2013 年 7 月 12 日
    @clino 用 Ansible 操作10个服务器就有点慢得受不了了。

    若同时操作100个服务器,Ansible 的并行执行是顺序执行的(不是多线程的),碰到网络问题,目标节点问题都不得不等待 timeout 浪费大量的时间。根本不可靠,甚至没法用。

    所以出现了 MCollective / Salt 这样在中间放中间件(message broker/queue)的工具,来提高效率和可靠性。

    BTW: 对 Ansible 理解有限,有错误请指出。
    clino
        26
    clino  
       2013 年 7 月 12 日
    @terry 我这里已经同时操作 170+ 台服务器了,没有发现你说的 "用 Ansible 操作10个服务器就有点慢得受不了了"

    "若同时操作100个服务器,Ansible 的并行执行是顺序执行的(不是多线程的)"
    多少线程可以配置的吧...

    "目标节点问题都不得不等待 timeout 浪费大量的时间。根本不可靠,甚至没法用"
    实在是没有碰到过这种问题...
    terry
        27
    terry  
       2013 年 7 月 12 日
    @clino SHIT 当时看 Ansible 文档的时候(还是 ansible.cc 这个域名)没有看到有 -f 这个参数。你说的设置多线程是这个 fork 进程方式?
    clino
        28
    clino  
       2013 年 7 月 12 日
    @terry 我没有用playbook,所有的都是在python里给的参数,例如:
    runner = ansible.runner.Runner(
    host_list=hl,
    module_name='command',
    module_args=options.cmd,
    remote_user='root',
    pattern='all',
    forks=len(hl)
    )
    我经常是很暴力的用了forks=len(hl),如果有100个host就直接开了100个线程(进程?)了
    goinaction
        29
    goinaction  
       2013 年 7 月 13 日
    @clino fork应该是开了100个进程
    likuku
        30
    likuku  
       2013 年 7 月 13 日
    @terry
    @clino

    或许网络环境不同,
    上百台机器都在LAN内,批量ssh可能也秒杀。而10台在世界不同时区的机器就可能频断卡顿吧。
    clino
        31
    clino  
       2013 年 7 月 14 日
    @likuku @terry 这倒是有可能,我说的这 170+ 台机器有 3/4 是在异地城市的,不过之间都有专线连接,还算比较稳定,可视为在局域网内
    terry
        32
    terry  
       2013 年 7 月 16 日
    Ansible -f 的并行是用的是操作系统进程实现多线程的,据说效率不是很好的样子...

    没学过 python 但还能看懂一些,源代码里挖到这一块,应该就是了...

    workers = []
    for i in range(self.forks):
    new_stdin = os.fdopen(os.dup(sys.stdin.fileno()))
    prc = multiprocessing.Process(target=_executor_hook,
    args=(job_queue, result_queue, new_stdin))
    prc.start()
    workers.append(prc)

    机器分布在几个大洲这样操作起来够呛...
    clino
        33
    clino  
       2013 年 7 月 16 日
    @terry "Ansible -f 的并行是用的是操作系统进程实现多线程的,据说效率不是很好的样子..."
    不知道你说的效率不好体现在哪里,linux下进程的开销和线程差不了多少

    "机器分布在几个大洲这样操作起来够呛..."
    从论据怎么得出的这个结论,不是很明白啊
    shanks
        34
    shanks  
       2013 年 7 月 17 日
    自从学了bash script之后,一直觉得语法严谨到蛋疼的程度。超过100行就比较难维护了。还老是记不住那些语法细节,不知何故。。。 QAQ
    sykp241095
        35
    sykp241095  
       2013 年 12 月 17 日
    额,ansible 方面的话,推荐自己写的:https://github.com/douban/farmer
    dennyzhang
        36
    dennyzhang  
       2016 年 9 月 14 日
    考虑将 Bash 的运维脚本换成其它。在纠结是选 Python 还是 Golang.
    lmx07
        37
    lmx07  
       2017 年 10 月 3 日
    大家好,在下的拙作《 Python Linux 系统管理与自动化运维》正式发布了,大家可以看一看。

    书籍的完整目录:

    https://github.com/lalor/python_for_linux_system_administration.git

    书籍介绍:本书以 Linux 系统管理为线索,以 Python 语言为载体,从工具、脚本、方法等多个方面讲解了如何在 Linux 系统管理和自动化运维中使用 Python 来解决各种问题,包含大量案例和最佳实践。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5593 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:19 PVG 15:19 LAX 23:19 JFK 02:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86