5

有没有办法让它与 env.hosts 一起工作?而不是每当我有多个主机运行它时必须手动循环?

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

如果我遍历 env.hosts 数组并为 env.hosts 数组中的每个主机手动设置 env.host 变量,我可以让运行命令工作。奇怪的是,我还在调用类中设置了 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")

输出:

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 装饰器(并删除'self'引用,因为装饰器不喜欢那样)。但无济于事。

有没有办法让它与 env.hosts 一起工作?而不是每当我有多个主机运行它时必须手动循环?

4

2 回答 2

5

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

主文件

#!/usr/bin/env python

from demo import FabricSupport

hosts = ['localhost']

myfab = FabricSupport()
myfab.execute("df",hosts)

演示.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)

蟒蛇主.py

[localhost] Executing task 'hostname'
[localhost] run: hostname
[localhost] out: heydevops-workspace
于 2013-04-25T09:50:25.663 回答
0

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

my_roles.json

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

工厂文件.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")

命令行界面

fab -R web my_task

my_task每个运行的输出web1web2在这里

于 2016-07-11T09:26:53.150 回答