2009-12-24 4 views
4

나는 다음과 같은 fabfile.py 있습니다패브릭을 실행하는 방법은 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") 

을 그리고 나는 다음과 같은 출력을 얻을 : 실행 순서가 env.hosts 사양 다르다는 것을

[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 목록에 지정된 것과 동일하게 만드는 방법이 있습니까?

답변

5

주문이 env.hosts에서 보존되지 않는 정확한 이유는 작동시킬 호스트 인 env.hosts, 명령 줄 및 기능별로 세 가지 "레벨"이 함께 병합된다는 것입니다 . fabric/main.pyline 309 인 경우 set() 유형을 사용하여 가능한 세 가지 호스트 목록에서 중복을 제거하는 것을 볼 수 있습니다. set()에는 주문이 없으므로 호스트가 "임의"순서로 목록으로 반환됩니다.

이 방법은 꽤 좋은 이유가 있습니다. 목록에서 중복을 제거하는 데 매우 효율적인 메커니즘이며, 패브릭의 경우 순서가 중요하지 않은 것이 중요합니다. 패브릭에 다양한 호스트에서 일련의 완전히 평행 한 기본 작업을 수행하도록 요청합니다. 평행, 원자 적 행동의 본성에 의해 질서는 행동이 성공적으로 수행 될 수있는 능력에 영향을 미치지 않습니다. 주문이 일 경우 다른 전략이 필요하며 fabric은 더 이상 해당 작업에 적합한 도구가 아닙니다.

그렇다면 이러한 작업이 순서대로 수행되어야하는 특별한 이유가 있습니까? 아마도 실행 명령의 결과로 발생하는 일종의 문제가 발생하면이를 해결하는 데 도움을 줄 수 있습니다.

+0

감사합니다. 트래비스, 나는 당신의 대답을 좋아합니다. :) 내 경우에는 실행 순서가 중요하지 않습니다. 나는이 행동에 대해서 궁금해. –

+1

내가 도울 수있어서 기뻐. 내가 가장 좋아하는 팁 중 하나는 문서의 [Managing Output] [1] 섹션에 특별한주의를 기울이는 것입니다. 일단 일련의 명령을 큰 규모의 기계로 보내면 결과물을 확인하기가 어려울 수 있습니다. 나는 그러한 특징들로 많은 잡음을 제거 할 수 있었다. [1] http://docs.fabfile.org/0.9.0/usage/output_controls.html –

1

업데이트하려면 최신 패브릭 1.1+ (1.0도 생각해보십시오)이 순서 보존 방식으로 중복 제거됩니다. 이제는 별다른 문제가 아닙니다.

관련 문제