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

2013-07-09 01:06:12 +08:00
 tinytub
自学了一段时间python,感觉可能是我学习的姿势不太对。总是感觉python相比于shell和perl更偏向于web开发。而对linux的运维管理偏弱。
抛开fabric等这类用python开发的运维工具不谈。自己在日常运维中运用python能做些什么?比shell脚本便捷或效率高的地方又体现在哪里?
现在只用python写过部分日志分析脚本和从页面中提取uid生成链接然后测试播放等动作的简单脚本。
其他的就不知道做些什么好了。
想请v2上的前辈多给些指点,如果能有些具体实例就更好不过了。

多谢大家
16645 次点击
所在节点    DevOps
37 条回复
likuku
2013-07-09 01:14:25 +08:00
shell 语法很怪异,不同shell语法变化差异巨大,另外,不同系统(gnu vs bsd)/发行版默认shell不同。

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

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

如此这般,不精分才怪。

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

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

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

刚去搜了一下这句,谢提醒.
ry_wang
2013-07-09 11:18:12 +08:00
其实我最想吐槽的是,为什么要抛开fabric此类运维工具。这些不恰恰是Python在运维领域强大最好的证明么。

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

当然上面几位前辈已经给出了不错的见解.同时也谢谢你的回复.
likuku
2013-07-09 13:34:47 +08:00
关于 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
2013-07-09 13:38:10 +08:00
不好意思,上面的忘记引用重要的一段:

关于双中括号的问题 - 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
2013-07-09 13:48:34 +08:00
不是有这样一本书么:

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

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

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

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

perl我就不评论了,不了解
terry
2013-07-10 09:19:38 +08:00
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
2013-07-10 10:22:10 +08:00
@terry ansible 的 playbooks 我基本没用,我都是直接全 python 写脚本的方式来用的,这样更灵活些,另外自己也扩展了 library里的不少module.目前用起来感觉不错.
其实对其他的运维工具了解不够多,所以不知道比较起来怎么样.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/75193

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX