我想让一个任务使用一组不同的主机(角色),具体取决于我当前所在的网络。如果我在我的服务器的同一网络中,我不需要通过网关
这是我的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
,rack4
等处于同一网络,我希望其角色为rack5
。否则,我希望它的角色为external_rack_machines
,因此通过网关访问这些相同的机器。
也许有一种方法可以单独使用ssh config。这是我的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
答案 0 :(得分:1)
导入模块后会考虑角色定义。因此,您可以在导入时执行的fabfile
中放置一些代码,检测网络并设置适当的roledefs
。
实现目标的第二种方法是使用“flag-task”。这是一项除了设置适当的roledef之外什么都不做的任务。即:
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