未找到主机的python结构必须手动设置';环境主机字符串';

未找到主机的python结构必须手动设置';环境主机字符串';,python,fabric,env,Python,Fabric,Env,有什么方法可以让它与env.hosts一起工作吗?而不是每当我有多台主机运行时就必须手动循环 我正在尝试使用fabric api,以避免使用非常不方便和笨拙的fabric命令行调用。我在一个模块/类中设置env.hosts变量,然后调用另一个类实例方法来运行fabric命令。在被调用的类实例中,我可以打印出env.hosts列表。然而,当我尝试运行一个命令时,它告诉我它找不到主机 如果我在env.hosts数组中循环并手动为env.hosts数组中的每个主机设置env.host变量,我就可以让r

有什么方法可以让它与env.hosts一起工作吗?而不是每当我有多台主机运行时就必须手动循环

我正在尝试使用fabric api,以避免使用非常不方便和笨拙的fabric命令行调用。我在一个模块/类中设置env.hosts变量,然后调用另一个类实例方法来运行fabric命令。在被调用的类实例中,我可以打印出env.hosts列表。然而,当我尝试运行一个命令时,它告诉我它找不到主机

如果我在env.hosts数组中循环并手动为env.hosts数组中的每个主机设置env.host变量,我就可以让run命令工作。奇怪的是,我还在调用类中设置了env.user变量,并将其拾取

e、 g.这项工作:

    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")
这项研究的结果:

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:
这不管用。。。但是如果你从一个“fab”文件运行它,它确实可以工作。。。对我来说毫无意义

    def upTest(self):
        print('env.hosts = ' + str(env.hosts))
        run("uptime")
这是输出:

No hosts found. Please specify (single) host string for connection: 
我确实尝试过在方法上添加一个@task decorator(并且删除了“self”引用,因为decorator不喜欢这样)。但是没有帮助


有什么方法可以让它与env.hosts一起工作吗?与有多台主机运行时必须手动循环不同?

最后,我使用execute()和exec解决了这个问题。

main.py

#!/usr/bin/env python

from demo import FabricSupport

hosts = ['localhost']

myfab = FabricSupport()
myfab.execute("df",hosts)
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)
python main.py

[localhost] Executing task 'hostname'
[localhost] run: hostname
[localhost] out: heydevops-workspace

我发现最好不要在代码中设置
env.hosts
,而是根据配置文件定义角色,并使用fab工具指定角色。它对我有用

my_roles.json

{
    "web": [ "user@web1.example.com", "user@web2.example.com" ],
    "db": [ "user@db1.example.com", "user@db2.example.com" ]
}
fabfile.py

from fabric.api import env, run, task
import json

def load_roles():
    with open('my_roles.json') as f:
        env.roledefs = json.load(f)

load_roles()

@task
def my_task():
    run("hostname")
CLI

fab-R web我的任务

对于
web1
web2
中的每一个,运行
my_task
的输出如下所示