3

我想让一个任务根据我当前所在的网络使用一组不同的主机(角色)。如果我在我的服务器的同一个网络中,我不需要通过网关。

这是我的 fabfile.py 中的一个片段:

env.use_ssh_config = True
env.roledefs = {
    'rack_machines': ['rack4', 'rack5', 'rack6', 'rack7'],
    'external_rack_machines': ['erack4', 'erack5', 'erack6', 'erack7']
    }

@roles('rack_machines')
def host_type():
    run('uname -s')

因此,对于我的任务host_type(),我希望它的角色是,rack_machines如果我与 , 等在同一个网络中rack4rack5否则,我希望它的角色是external_rack_machines,因此通过网关访问这些相同的机器。

也许有一种方法可以单独使用 ssh 配置。ssh_config这也是我的文件的一个片段:

Host erack4
HostName company-gw.foo.bar.com
Port 2261
User my_user

Host rack4
HostName 10.43.21.61
Port 22
User my_user
4

1 回答 1

1

导入模块后会考虑角色定义。因此,您可以fabfile在导入时执行一些代码,检测网络并设置适当roledefs的 .

实现目标的第二种方法是使用“flag-task”。这是一项除了设置适当的角色定义之外什么都不做的任务。IE:

hosts = {
    "rack": ["rack1", "rack2"],
    "external_rack": ["external_rack1", "external_rack2"]
}

env.roledefs = {"rack_machines": hosts["rack"]}

@task
def set_hosts(hostset="rack"):
    if hostset in hosts:
        env.roledefs["rack_machines"] = hosts[hostset]
    else:
        print "Invalid hostset"

@roles("rack_machines")
def business():
    pass

并以这种方式调用:fab set_hosts:external_rack business

于 2012-11-02T19:55:51.413 回答