#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