安装fabric
pip install fabric
ln -s /usr/local/python2.7/bin/fab /usr/bin/fab #创建软连接(创建fab为环境变量,如果python安装目录没有自定义,就无需此次操作)
测试
本地:rs1
远程 :
rs2,ip:192.168.11.190;
rs3,ip:192.168.11.20;
rs4,ip:192.168.11.6
一、基本用法(fab -l 查看可用的命令)
1.vim fabfile.py
def hello():
print("Hello fab!")
[root@rs1 tmp]# fab hello
Hello fab!Done.
2.文件名不为fabfile.py时需进行指定
mv fabfile.py test.py
[root@rs1 tmp]# fab hello
Fatal error: Couldn't find any fabfiles!Remember that -f can be used to specify fabfile path, and use -h for help.
Aborting.
[root@rs1 tmp]# fab -f test.py hello
Hello fab!Done.
[root@rs1 tmp]# fab hello -f test.py
Hello fab!Done.
3.参数传递
def hello(name):
print 'Hello %s!'%name
[root@rs1 tmp]# fab hello:name=hy
Hello hy!Done.
[root@rs1 tmp]# fab hello:hy
Hello hy!Done.
二、本地操作 local
vim fabfile.py
from fabric.api import local
def test():
local('uname -a')
fab test
[localhost] local: uname -a
Linux rs1 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
Done.
三、远程操作 run
1.要执行的命令在脚本里
vim fabfile.py
from fabric.api import run
def test():
run('uname -a')
fab test -H [email protected]
[[email protected]] Executing task 'test'[[email protected]] run: uname -a
[[email protected]] Login password for 'root':
[[email protected]] out: Linux rs2 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
[[email protected]] out:
Done.
Disconnecting from 192.168.11.190... done.
2.自己传要执行哪些命令
from fabric.api import run
def test(command):
run(command)
fab test:'uname -a' -H [email protected]
[[email protected]] Executing task 'remote_run'[[email protected]] run: uname -a
[[email protected]] Login password for 'root':
[[email protected]] out: Linux rs2 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
[[email protected]] out:
Done.
Disconnecting from 192.168.11.190... done.
3.执行时省略-H。host放在脚本里
from fabric.api import (run, env, roles, hosts)
@hosts('[email protected]')
def test(command):
run(command)
fab test:'uname -a'
[[email protected]] Executing task 'test'[[email protected]] run: uname -a
[[email protected]] Login password for 'root':
[[email protected]] out: Linux rs2 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
[[email protected]] out:
Done.
Disconnecting from 192.168.11.190... done.
4.host、密码放在脚本里,执行时不用指定
from fabric.api import (run, env, roles, hosts)
env.hosts=['[email protected]']
env.password='toor'def test(command):
run(command)
fab test:'uname -a'
[[email protected]] Executing task 'test'[[email protected]] run: uname -a
[[email protected]] out: Linux rs2 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
[[email protected]] out:
Done.
Disconnecting from 192.168.11.190... done.
5.多台服务器
同种操作
fab test:'uname -a
from fabric.api import *env.hosts=['[email protected]','[email protected]']
env.passwords={'[email protected]:22':'toor','[email protected]:22':"121"}
def test(command):
run(command)
View Code
多种操作
1
2
3
4
5
|
[root@rs1 tmp]
# fab -l
Available commands:
test
test1
|
#coding:utf-8from fabric.api import *env.roledefs = {'servergroup1':['[email protected]:22','[email protected]:22'],'servergroup2':['[email protected]:22']
}
env.passwords={'[email protected]:22':'toor','[email protected]:22':'1314','[email protected]:22':'121',
}
@roles('servergroup1')
def test(command):
run(command)
print 'servergroup1执行完毕,请指示'@roles('servergroup2')
def test1(command):
run(command)
print 'servergroup2执行完毕,请指示'
fab test:'uname -a'
[[email protected]:22] Executing task 'test'[[email protected]:22] run: uname -a
[[email protected]:22] out: Linux rs2 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
[[email protected]:22] out:
servergroup1执行完毕,请指示
[[email protected]:22] Executing task 'test'[[email protected]:22] run: uname -a
[[email protected]:22] out: Linux rs3 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[[email protected]:22] out:
servergroup1执行完毕,请指示
Done.
Disconnecting from 192.168.11.190... done.
Disconnecting from 192.168.11.6... done.
fab test1:'uname -a'
[[email protected]:22] Executing task 'test1'[[email protected]:22] run: uname -a
[[email protected]:22] out: Linux rs3 2.6.32-504.el6.i686 #1 SMP Wed Oct 15 03:02:07 UTC 2014 i686 i686 i386 GNU/Linux
[[email protected]:22] out:
servergroup2执行完毕,请指示
Done.
Disconnecting from 192.168.11.20... done.
6.有一个需求,把本地文件压缩并打包,再上传到多台服务器,解压缩
touch rs1.txt
from fabric.api import *env.roledefs = {
'servergroup1':['[email protected]:22','[email protected]:22'],'servergroup2':['[email protected]:22']
}
env.passwords={'[email protected]:22':'toor','[email protected]:22':'1314','[email protected]:22':'121',
}
@roles('servergroup1')
def tar_and_put(project_file): """对本地项目打包压缩、上传,在远程解压"""
tar_file = project_file + '.tar.gz'
local('tar -zcvf %s %s' % (tar_file,project_file))
put(tar_file,'/tmp')
with cd('/tmp'):
run('tar zxvf %s' % tar_file)
print 'servergroup1执行完毕,请指示'
1
2
3
4
|
[root@rs1 tmp]
# fab -l
Available commands:
tar_and_put 对本地项目打包压缩、上传,在远程解压
|
fab tar_and_put:'rs1.txt'
[[email protected]:22] Executing task 'tar_and_put'[localhost] local: tar -zcvf rs1.txt.tar.gz rs1.txt
rs1.txt
[[email protected]:22] put: rs1.txt.tar.gz -> /tmp/rs1.txt.tar.gz
[[email protected]:22] run: tar zxvf rs1.txt.tar.gz
[[email protected]:22] out: rs1.txt
[[email protected]:22] out:
servergroup1执行完毕,请指示
[[email protected]:22] Executing task 'tar_and_put'[localhost] local: tar -zcvf rs1.txt.tar.gz rs1.txt
rs1.txt
[[email protected]:22] put: rs1.txt.tar.gz -> /tmp/rs1.txt.tar.gz
[[email protected]:22] run: tar zxvf rs1.txt.tar.gz
[[email protected]:22] out: rs1.txt
[[email protected]:22] out:
servergroup1执行完毕,请指示
Done.
Disconnecting from 192.168.11.190... done.
Disconnecting from 192.168.11.6... done.
1
2
|
[root@rs2 tmp]
# ls
1.py
rs1.txt rs1.txt.tar.gz
|
1
2
|
[root@rs4 tmp]
# ls
mongodb
-
27017.sock
passwd rs1.txt rs1.txt.tar.gz yum.log
|