如何使用fabric2修改任务中的主机列表?

时间:2019-04-17 07:25:39

标签: python fabric

对于fabric 1.x,我有一个类似的fabfile:

from fabric.api import env

def prod():
    env.hosts += ['1.2.3.4']

def integ():
    env.hosts += ['2.3.4.5']

def doit():
    env.user = 'root'
    - do some stuff here -

通过这种方式,我可以指定目标:执行doit()进行集成,我可以做到:

fab integ doit

对于集成和生产,我可以做到:

fab integ prod doit

使用fabric2,我看不到更多的api,而必须使用Connection对象,但是,我看不到可以在哪里更改当前的SerialGroup来动态添加一些主机。

如何将此代码移植到fabric2?

1 个答案:

答案 0 :(得分:0)

调试之后,我发现对每个主机的所有“调用”对象在执行之前都已创建:不能在任务中修改主机列表,游戏已经设置好了。 不过,我找到了一种解决方法,可以执行以下操作:

rewrite-uri

通过这种方式,现在可以执行以下操作之一:

from fabric import task, SerialGroup
hosts_to_process = []

@task
def prod(c):
    global hosts_to_process
    hosts_to_process += ['1.2.3.4']

@task
def integ(c):
    global hosts_to_process
    hosts_to_process += ['2.3.4.5']

@task
def doit(c):
    if not hasattr(c,'host'):
        group = SerialGroup(*hosts_to_process)
        for c in group:
            doit(c)
    else:
        env.user = 'root'
        - do some stuff here -