Posted in: Aws云上云维
编写模块简化 subprocess与paramiko
使用Python来编写运维脚本时,相信大家都使用过subprocess与paramiko这两个模块。
其中,subprocess主要用于本地,而paramiko则是用于远程登录执行以及通过sftp传输文件。
而在使用过fabric这个模块之后,我非常喜欢它通过属性的方式来存储返回状态(failed,succeeded)和输出(stdout,stderr)。
但是通过非命令行方式调用fabric稍微有点麻烦,实现之后,代码看上去也不够简洁。
参考脚本:https://github.com/mcsrainbow/python-demos/blob/master/demos/xenserver.py
因此,我便参考了fabric源码中的operations.py文件,利用类似的方法将subprocess与paramiko简单的包装了一 下,完成了一个新的模块operations.py,实现了local,remote,get,put四个方法,使用起来感觉很贴心。
其中,对于remote,get,put三个方法,推荐用新的函数先包装一下远程服务器的登录参数,来简化后面的重复调用。
脚本链接:https://github.com/mcsrainbow/python-demos/blob/master/demos/operations.py
相关示例:
>>> from operations import local,remote,get,put >>> out = local('uname -r') >>> print out 2.6.32 >>> print out.stdout 2.6.32 >>> print out.failed False >>> print out.succeeded True >>> out = remote('hostname --fqdn', hostname='heylinux.com', username='jobs', pkey='/path/to/rsa', port=8022) >>> print out heylinux.com >>> print out.failed False >>> print out.succeeded True >>> out = get('/tmp/remote.txt', '/tmp/local.txt', hostname='heylinux.com', username='jobs', pkey='/path/to/dsa', pkey_type='dsa', port=8022) >>> print out.failed True >>> print out.succeeded False >>> print out.stderr No such file or directory >>> out = put('/tmp/local.txt', '/tmp/remote.txt', hostname='heylinux.com', username='jobs', password='apple') >>> print out.failed False >>> print out.succeeded True