python 远程执行代码 paramiko fabric
python模块:
paramiko
fabric
1. paramiko
installtion:
yum -y install python-devel
pip install paramiko
problem:
1.1 error: command ‘gcc’ failed with exit status 1
这是缺少python-devel软件包,安装即可
1.2 导入paramiko时报错: error: ‘module’ object has no attribute ‘HAVE_DECL_MPZ_POWM_SEC’
编辑 /usr/lib/python2.7/site-packages/Crypto/Util/number.py
把if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
注释了
#if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
use:
1.3 执行命令并将结果输出
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("某IP地址",22,"用户名", "口令")
stdin, stdout, stderr = ssh.exec_command("你的命令")
print stdout.readlines()
ssh.close()
1.4 下载远程文件
import paramiko
t = paramiko.Transport((“主机”,”端口”))
t.connect(username = “用户名”, password = “口令”)
sftp = paramiko.SFTPClient.from_transport(t)
remotepath=’/var/log/system.log’
localpath=’/tmp/system.log’
sftp.get(remotepath, localpath)
t.close()
1.5 上传文件
import paramiko
t = paramiko.Transport((“主机”,”端口”))
t.connect(username = “用户名”, password = “口令”)
sftp = paramiko.SFTPClient.from_transport(t)
remotepath=’/var/log/system.log’
localpath=’/tmp/system.log’
sftp.put(localpath,remotepath)
t.close()
2. fabric
web:http://docs.fabfile.org/en/1.8/
installation:
yum install python-devel
pip install fabric
code: named fabfile.py
from fabric.api import *
env.username = ‘root‘
env.password = ‘123‘
env.hosts = [‘localhost‘,‘127.0.0.1‘]
def host_type():
run(‘uname -s‘)
def check_ver():
run("""LAST_VER=`curl -s http://deploymaster/deploy/lastver`;
LAST_WP=/var/www/releases/wordpress-${LAST_VER};
test -d ${LAST_WP};
""")
run:
fab host_type
result:
[root@localhost ~]# fab host_type
[localhost] Executing task ‘host_type‘
[localhost] run: uname -s
[localhost] out: Linux
[localhost] out:
[127.0.0.1] Executing task ‘host_type‘
[127.0.0.1] run: uname -s
[127.0.0.1] out: Linux
[127.0.0.1] out:
Done.
Disconnecting from 127.0.0.1... done.
Disconnecting from localhost... done.
fabric应用:
1、fab -H X.X.X.X host_type
2、fab host_type check_ver
3、role: 当client较多时可以定义角色,然后按角色进行操作。
#!/usr/bin/pyhton
from fabric.api import *
env.user = ‘root‘
env.password = ‘vagrant‘
env.roledefs = {
‘web‘: [‘X.X.X.X‘],
‘dns‘: [‘Y.Y.Y.Y‘]
}
def test():
run(‘uname -a‘)
run:
fab -R web test
result:
[X.X.X.X] Executing task ‘test‘
[X.X.X.X] run: uname -a
[X.X.X.X] out: Linux salt-master 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[X.X.X.X] out:
[Y.Y.Y.Y] Executing task ‘test‘
[Y.Y.Y.Y] run: uname -a
[Y.Y.Y.Y] out: Linux salt-minion-3 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[Y.Y.Y.Y] out:
Done.
Disconnecting from Y.Y.Y.Y... done.
Disconnecting from X.X.X.X... done.
#从结果可以看到,fab只执行了属于web组的client。
4、extend属性
from fabric.api import env, run
env.hosts.extend([‘host3‘, ‘host4‘])
def test():
run(‘uname -r‘)
When this fabfile is run as fab -H host1,host2 mytask, env.hosts will then contain [‘host1‘, ‘host2‘, ‘host3‘, ‘host4‘] at the time that mytask is executed.
5、fabfile中没有定义client,可以在命令行中指定
fab mytask:hosts=‘X.X.X.X‘
6、使用task方式:
from fabric.api import hosts, run
my_hosts = (‘X.X.X.X‘, ‘Y.Y.Y.Y‘)
@hosts(my_hosts)
def test():
run(‘uname -r‘)
run:
fab test
resule: 从结果中可以看到,fab只执行了task定义的test部分
[X.X.X.X] Executing task ‘test‘
[X.X.X.X] run: uname -a
[X.X.X.X] out: Linux salt-master 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[X.X.X.X] out:
[Y.Y.Y.Y] Executing task ‘test‘
[Y.Y.Y.Y] run: uname -a
[Y.Y.Y.Y] out: Linux salt-minion-1 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[172.23.177.46] out:
Done.
Disconnecting from X.X.X.X... done.
Disconnecting from Y.Y.Y.Y... done.
7、综合应用:
from fabric.api import env, hosts, roles, run
env.roledefs = {‘role1‘: [‘b‘, ‘c‘]}
@hosts(‘a‘, ‘b‘)
@roles(‘role1‘)
def test():
run(‘uname -r‘)
8、遇到主机不可达的情况,可以使用--skip-bad-hosts参数,这样就会跳过不存在或有问题的client,而执行其他的client,从返回结果中可以排除那些是有问题的client,进而在进行处理
fab --skip-bad-hosts test
node:
my_hosts = (‘X.X.X.X‘)
@hosts(my_hosts)
def test():
run(‘uname -a‘)
本文出自 “muzinan的技术博客” 博客,请务必保留此出处http://muzinan110.blog.51cto.com/684213/1439966
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。