как изменить список хостов в задачах с помощью fabric2?

#python #fabric

#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, и нужно использовать объект подключения, но я не вижу, где я могу изменить текущую SerialGroup, чтобы добавить несколько хостов «на лету».

Как я могу перенести этот код на fabric2??

Ответ №1:

После отладки я обнаружил, что все объекты «вызова» для каждого хоста уже созданы до их выполнения: нет смысла изменять список хостов внутри задач, игры уже установлены. Тем не менее, я нашел обходной путь, можно сделать что-то вроде этого :

 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 -
 

Таким образом, теперь можно выполнить одно из следующих действий :

 fab integ doit
fab integ prod doit
fab -H 3.4.5.6 doit