有没有办法让这个与env.hosts一起使用?相反,每当我有多台主机运行时,必须手动循环?
我正在尝试使用fabric api,而不必使用非常不方便和kludgey fabric命令行调用.我在一个模块/类中设置env.hosts变量,然后调用另一个类实例方法来运行fabric命令.在被调用的类实例中,我可以打印出env.hosts列表.然而,当我尝试运行命令时,它告诉我它无法找到主机.
如果我遍历env.hosts数组并为env.hosts数组中的每个主机手动设置env.host变量,我可以使用run命令.奇怪的是,我还设置调用类的env.user变量,它被拾起.
例如,这工作:
def upTest(self):
print('env.hosts = ' + str(env.hosts))
for host in env.hosts:
env.host_string = host
print('env.host_string = ' + env.host_string)
run("uptime")
Run Code Online (Sandbox Code Playgroud)
输出来自:
env.hosts = ['ec2-....amazonaws.com']
env.host_string = ec2-....amazonaws.com
[ec2-....amazonaws.com] run: uptime
[ec2-....amazonaws.com] out: 18:21:15 up 2 days, 2:13, 1 user, load average: 0.00, 0.01, 0.05
[ec2-....amazonaws.com] out:
Run Code Online (Sandbox Code Playgroud)
这不起作用......但是如果你从"fab"文件中运行它确实有效......对我来说毫无意义.
def upTest(self):
print('env.hosts = ' + str(env.hosts))
run("uptime")
Run Code Online (Sandbox Code Playgroud)
这是输出:
No hosts found. Please specify (single) host string for connection:
Run Code Online (Sandbox Code Playgroud)
我确实尝试在方法上放置一个@task装饰器(并删除'self'引用,因为装饰器不喜欢它).但没有帮助.
有没有办法让这个与env.hosts一起使用?相反,每当我有多台主机运行时,必须手动循环?
最后,我使用execute()和exec修复了这个问题.
main.py
#!/usr/bin/env python
from demo import FabricSupport
hosts = ['localhost']
myfab = FabricSupport()
myfab.execute("df",hosts)
Run Code Online (Sandbox Code Playgroud)
demo.py
#!/usr/bin/env python
from fabric.api import env, run, execute
class FabricSupport:
def __init__(self):
pass
def hostname(self):
run("hostname")
def df(self):
run("df -h")
def execute(self,task,hosts):
get_task = "task = self.%s" % task
exec get_task
execute(task,hosts=hosts)
Run Code Online (Sandbox Code Playgroud)
python main.py
[localhost] Executing task 'hostname'
[localhost] run: hostname
[localhost] out: heydevops-workspace
Run Code Online (Sandbox Code Playgroud)