2009-12-24 3 views
4

У меня есть следующий fabfile.py:Как сделать выполнение Fabric следовать порядку списка env.hosts?

from fabric.api import env, run 

host1 = '192.168.200.181' 
host2 = '192.168.200.182' 
host3 = '192.168.200.183' 

env.hosts = [host1, host2, host3] 

def df_h(): 
    run("df -h | grep sda3") 

И я получаю следующий результат:

[192.168.200.181] run: df -h | grep sda3 
[192.168.200.181] out: /dev/sda3    365G 180G 185G 50% /usr/local/nwe 
[192.168.200.183] run: df -h | grep sda3 
[192.168.200.183] out: /dev/sda3    365G 41G 324G 12% /usr/local/nwe 
[192.168.200.182] run: df -h | grep sda3 
[192.168.200.182] out: /dev/sda3    365G 87G 279G 24% /usr/local/nwe 

Done. 
Disconnecting from 192.168.200.182... done. 
Disconnecting from 192.168.200.181... done. 
Disconnecting from 192.168.200.183... done. 

Обратите внимание, что порядок выполнения отличается от спецификации env.hosts.

Почему это так? Есть ли способ сделать порядок выполнения таким же, как указано в env.hosts list?

ответ

5

Точная причина, по которой порядок не сохраняется от env.hosts, заключается в том, что могут быть указаны три уровня, которые могут быть указаны хостами для работы - env.hosts, командная строка и каждая функция, которые объединены вместе , В fabric/main.py на line 309 вы можете увидеть, что они используют тип set() для удаления дубликатов в трех возможных списках хостов. Поскольку set() не имеет заказа, хосты будут возвращены в виде списка в «случайном порядке».

Существует довольно веская причина, что это метод. Это очень эффективный механизм удаления дубликатов из списка, а для ткани важно, чтобы заказ не имел значения. Вы просите ткань выполнить серию полностью параллельных, атомных действий на разных хостах. По самой природе параллельных, атомных действий порядок не влияет на способность действий успешно выполняться. Если бы заказ сделал вопрос, тогда потребуется другая стратегия, и ткань больше не будет правильным инструментом для работы.

Сказали, есть ли какая-то особая причина, по которой вам нужны эти операции в порядке? Возможно, если у вас возникнет какая-то проблема, которая является результатом выполнения заказа, мы можем помочь вам в этом.

+0

Спасибо Трэвис, мне нравится ваш ответ. :) Порядок исполнения в моем случае не имеет особого значения. Мне просто интересно об этом поведении. –

+1

Рад, что я мог бы помочь. Один из моих любимых советов - обратить особое внимание на раздел [Manage Output] [1] документации. Как только вы получите серию команд, выходящих на большой парк машин, на выходе может быть сложно проверить. Я смог удалить много шума с этими функциями. [1] http://docs.fabfile.org/0.9.0/usage/output_controls.html –

1

Просто обновите, новейшие Fabric 1.1+ (думаю, даже 1.0) дедупы в порядке, сохраняющем путь сейчас. Так что теперь это не проблема.