2012-05-01 3 views
8

мне интересно, если кто-нибудь имеет опыт развертывания на нескольких серверах за балансировки нагрузки на EC2 с fabricРазвертывание на нескольких серверах EC2 с Fabric

Я использовал ткань на некоторое время теперь, и не имеют никаких проблем с ним, или развертывание на нескольких серверах, но то, что я хотел бы сделать в этом сценарии, (скажем, у меня есть десять экземпляров), отменяет регистрацию половины (5) ящиков из моего балансировщика нагрузки, разворачивает мой код и запускает дым тест, и если все выглядит хорошо, зарегистрируйте их с помощью балансировщика нагрузки и отмените регистрацию оставшихся 5 экземпляров и разверните их, а затем зарегистрируйте их обратно в балансировщик нагрузки.

У меня нет проблем с выполнением каких-либо отдельных задач (де-регистрация, запуск тестов, развертывание и т. Д.), Я просто не знаю, как организовать мои хосты простым способом, чтобы я мог развернуть первую половину, затем вторая половина. Ткань кажется настроенной для выполнения одних и тех же задач на всех хостах (задача 1 на хосте 1, задача 1 на хосте 2, задача 2 на хосте 1, задача 2 на хосте 2 и т. Д.)

Моя первая мысль было создать задачу для обработки первой части де-регистрации, развертывания и тестирования, а затем установить env.hosts для второй половины серверов, но я чувствовал, что это кажется немного хоккеем.

Кто-нибудь смоделировал что-то похожее на это с Ткань раньше?

+0

Из моего ограниченного EXPE с Fabric, это похоже на то, что вы хотели бы сделать. Единственный способ, которым я мог бы подумать, это было хоккеем, если вы хотите сделать какой-то случайный выбор из 5 ящиков. –

+0

В качестве альтернативы, 'ansible' делает что-то подобное из коробки. Стоит посмотреть: http://docs.ansible.com/guide_rolling_upgrade.html#the-rolling-upgrade –

ответ

5

Вы можете упростить это путем определения ролей (используется для агрегирования хостов) и выполнения задач на одной роли, а затем выполнения тестов и развертывания на второй роли.

Пример roledefs:

env.roledefs = { 
    'first_half': ['host1', 'host2'], 
    'second_half': ['host3', 'host4'], 
} 

def deploy_server(): 
    ... 
    # deploy one host from current role here 

def deploy(): 
    # first role: 
    env.roles = ['first_half'] 
    execute('deploy_server') 
    test() # here test deployed servers 
    # second role: 
    env.roles = ['second_half'] 
    execute('deploy_server') 

Другие ссылки:

+0

просто из любопытства, почему вы используете 'execute' vs call' deploy_server' напрямую – MattoTodd

+0

Кроме того, вы используете неправильный вариант. Вы даете ему задачу как переданную функцию, а не строку с ее именем. Это и выполнение могут выполнять роли: execute (deploy_server, role = ['first_half']) – Morgan

+1

@Morgan: Неверно. Пожалуйста, взгляните на ссылку документации, которую я первоначально включил в ответ. 'execute' принимает как вызываемые, так и имена задач (string). Однако вы правы в способности устанавливать роли, которые должны выполняться (см. Также в документах). – Tadeck

0

Ткань не настроена для выполнения одних и тех же задач на всех хостах.

Помимо того, что вы можете явно задать хосты для конкретной задачи с параметром -H командной строки, вы можете использовать this шаблон и this нового шаблона, чтобы делать то, что вы хотите.

Update: Here это показывает, как вы можете использовать roles

+0

, так как по умолчанию используется env.hosts, как указать конкретную роль в одной из ваших задач? – MattoTodd

+0

Я обновил свой ответ. – rantanplan

+0

danke schon !!!! – MattoTodd

-1

Вместо того, чтобы вмешиваться env.hosts, вы могли бы передать список (или любой итерацию) к декоратора хозяев. Что-то вроде:

def deploy(half_my_hosts): 
    @hosts(half_my_hosts) 
    def mytask(): 
     # ... 
    mytask() 

Тогда вы могли бы разделить ваши env.hosts в любом случае вы хотите, и передать его для развертывания()

+0

теперь выполняется() для подзадач и имеет параметр hosts. – Morgan

+0

А, спасибо, приятно знать. Это, безусловно, более чистое решение. – spinlok

3

Вы хотите использовать функцию execute(). Это позволит вам сделать что-то вроде этого:

def update(): 
    deallocate() 
    push_code() 
    smoke_test() #could fail fast 
    reallocate() 

def deploy(): 
    execute(update, hosts=first_five) 
    execute(update, hosts=last_five) 

Вы также мог бы сделать каждый из DEALLOCATE, push_code и smoke_test, задачи Execute() вызов в развертывании, а затем вы бы запустить все освобождает затем запустите все кодовые нажатия и т. д.

Затем выполните проверку, а затем выполните действия, выполняемые другими задачами.

1

Я успешно сочетал Ткань с boto. Я заполняю список хостов, используя boto. Вы можете использовать декоратор @parallel, чтобы ограничить количество хостов для выполнения за один раз. Команда выглядит следующим образом:

fab running deploy

Код выглядит так;

@task 
@runs_once 
def running(): 
    ec2conn = ec2.connect_to_region(region) 
    reservations = ec2conn.get_all_instances(filters={'instance-state-name': 'running'}) 
    instances = list(chain.from_iterable(map(lambda r: r.instances, reservations))) 
    env.hosts = list(chain.from_iterable(map(lambda i: i.public_dns_name, instances))) 

@task 
@parallel(pool_size=5) 
def deploy(): 
    # do stuff on n<=5 hosts in parallel 

Если вам нужно обработать подразделение узлов, я бы предложил использовать теги.

+0

случайное примечание: вы должны быть осторожны, чтобы не использовать один и тот же объект соединения ec2 в параллельных задачах, поскольку boto не является потокобезопасным (это своего рода эпистемологический вопрос, является ли любая библиотека python «потокобезопасной», но что я означает, что boto, как известно, ломается, когда используется таким образом) – jberryman

0

Или вы могли бы просто написать метод, который устанавливает некоторые переменные, например:

def live(): 
    global PATH, ENV_PATH 
    env.hosts = ["22.2.222.2"] 
    env.user = 'test' 
    PATH = '/path/to/project' 
    # optional, is using virtualenv 
    ENV_PATH = '/path/to/virtualenv' 
    # overwri 

тэ независимо variabled вам нужно изменить на текущей машине

и перед выполнением команды развертывания выполните команду:

fab live deploy 

Детали: http://simionbaws.ro/programming/deploy-with-fabric-on-multiple-servers/

 Смежные вопросы

  • Нет связанных вопросов^_^