什么是 Fabric
Fabric
是一款可以实现远程执行命令和完成操作的库,相比 Pramiko
,Fabric
更加简洁,高效和易用。它提供了很多开箱即用的功能,可以帮助开发者快速实现自动化任务。
常用的方法
什么是 local 方法
local
方法可以实现在本地执行命令,和 Python
的 os.system()
作用一样。整体感觉功能强大,使用简单。
Demo-1
此 demo
实现在本地主机上执行命令查看 hostname
。
from fabric.api import *
env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']
def exec_local():
local('hostname')
if __name__ == '__main__':
import os,sys
cmd='fab -f {} exec_local'.format(sys.argv[0])
os.system(cmd)
执行结果:
代码语言:javascript复制PS C:> python test.py
[10.x.x.1] Executing task 'exec_local'
[localhost] local: hostname
Lenovo-PC-I7-64G
[10.x.x.2] Executing task 'exec_local'
[localhost] local: hostname
Lenovo-PC-I7-64G
Done.
单次执行
以上,我们可以看到 hostname
的命令执行了两次,因为我们的主机有 2
个。那如果我们想要某个命令只在第一台主机上执行,怎么做呢?Fabric
为我们提供了 runs_once
装饰器来帮我们解决这个问题。
Demo-2
代码:
代码语言:javascript复制from fabric.api import *
env.user='root'
env.password='Panyun@123'
env.hosts=['10.135.3.3','10.135.3.22']
@runs_once
def exec_local():
local('hostname')
if __name__ == '__main__':
import os,sys
cmd='fab -f {} exec_local'.format(sys.argv[0])
os.system(cmd)
执行结果:
代码语言:javascript复制PS C:> python test.py
[10.x.x.1] Executing task 'exec_local'
[localhost] local: hostname
Lenovo-PC-I7-64G
Done.
什么是 run 方法
run
方法可以实现在远端主机执行命令,可以和 paramiko
的 exec_command
实现同样的功能。
Demo-1
此 demo
实现在远端主机执行 hostname
命令。
from fabric.api import *
env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']
def exec_local():
local('hostname')
if __name__ == '__main__':
import os,sys
cmd='fab -f {} exec_local'.format(sys.argv[0])
os.system(cmd)
执行结果:
代码语言:javascript复制PS C:> python test.py
[10.x.x.1] Executing task 'exec_local'
[10.x.x.1] run: hostname
[10.x.x.1] out: ubuntu
[10.x.x.1] out:
[10.x.x.2] Executing task 'exec_local'
[10.x.x.2] run: hostname
[10.x.x.2] out: centos
[10.x.x.2] out:
Done.
Disconnecting from 10.x.x.1... done.
Disconnecting from 10.x.x.2... done.
什么是 put 方法
put
方法可以实现将本地文件上传的远端的功能。
Demo-1
此 demo
实现将本地主机的文件上传到远端主机。
from fabric.api import *
env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']
def put_file():
put('empty.ok','/home/ok.empty')
if __name__ == '__main__':
import os,sys
cmd='fab -f {} put_file'.format(sys.argv[0])
os.system(cmd)
执行结果:
代码语言:javascript复制PS C:> python test.py
[10.x.x.1] Executing task 'put_file'
[10.x.x.1] put: empty.ok -> /home/ok.empty
[10.x.x.2] Executing task 'put_file'
[10.x.x.2] put: empty.ok -> /home/ok.empty
Done.
Disconnecting from 10.x.x.1... done.
Disconnecting from 10.x.x.2... done.
查看上传到远端主机的文件:
什么是 prompt 方法
prompt
方法可以获取用户输入,从而实现动态参数注入、交互式输入等功能。
Demo-1
此 demo
实现在远端主机执行 echo
命令,根据用户输入而输出。
from fabric.api import *
env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']
def exec_local():
local('hostname')
def echo_some():
msg=prompt('Please input msg:')
run('hostname && echo {}'.format(msg))
if __name__ == '__main__':
import os,sys
cmd='fab -f {} echo_some'.format(sys.argv[0])
os.system(cmd)
执行结果:
代码语言:javascript复制PS C:> python test.py
[10.x.x.1] Executing task 'echo_some'
Please input msg: phyger
[10.x.x.1] run: hostname && echo phyger
[10.x.x.1] out: ubuntu
[10.x.x.1] out: phyger
[10.x.x.1] out:
[10.x.x.2] Executing task 'echo_some'
Please input msg: niubi
[10.x.x.2] run: hostname && echo niubi
[10.x.x.2] out: centos
[10.x.x.2] out: niubi
[10.x.x.2] out:
Done.
Disconnecting from 10.x.x.1... done.
Disconnecting from 10.x.x.2... done.
更多内容请移步Fabric官网。
https://fabric-chs.readthedocs.io/zh_CN/chs/