没有找到主机的python fabric必须手动设置'env.host_string'

Bil*_*mus 5 python env fabric

有没有办法让这个与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一起使用?相反,每当我有多台主机运行时,必须手动循环?

mcs*_*bow 5

最后,我使用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)