+86 13541016684Mon. - Fri. 10:00-22:00

编写模块简化 subprocess与paramiko

编写模块简化 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