2013-04-05 5 views
4

env.hosts와 작동하게하는 방법이 있습니까? 수동으로 루프를 돌릴 때마다 여러 개의 호스트를 실행해야 할 때마다 반대가됩니까? 파이썬 패브릭을 찾을 수 없습니다. 'env.host_string'을 수동으로 설정해야합니다.

나는 매우 불편하고 kludgey 패브릭 명령 행 호출을 사용 할 필요가 없게하는, 직물 API를 사용하는 것을 시도하고있다. 하나의 모듈/클래스에 env.hosts 변수를 설정 한 다음 다른 클래스 인스턴스 메소드를 호출하여 패브릭 명령을 실행합니다. 호출 된 클래스 인스턴스에서 env.hosts 목록을 출력 할 수 있습니다. 그러나 명령을 실행하려고하면 호스트를 찾을 수 없다고 알려줍니다. I 상기 env.hosts 배열을 반복하고 수동이 env.hosts 배열의 각 호스트에 대한 env.host 변수를 설정하면

, 나는 실행 명령이 작동 할 수 있습니다. 이상하게도 나는 호출 클래스에서 env.user 변수를 설정했고 입니다.

이에서

def upTest(self): 
     print('env.hosts = ' + str(env.hosts)) 
     for host in env.hosts: 
      env.host_string = host 
      print('env.host_string = ' + env.host_string) 
      run("uptime") 

출력 :이 작품

env.hosts = ['ec2-....amazonaws.com'] 
env.host_string = ec2-....amazonaws.com 
[ec2-....amazonaws.com] run: uptime 
[ec2-....amazonaws.com] out: 18:21:15 up 2 days, 2:13, 1 user, load average: 0.00, 0.01, 0.05 
[ec2-....amazonaws.com] out: 

이 작동하지 않습니다 ...하지만 당신이 "공장"파일을 실행하면 작동합니까 ... 어떤 의미로하지 않습니다 나를.

No hosts found. Please specify (single) host string for connection: 

나는 방법상의 @task의 장식을 넣어 (그리고 장식은 그렇게하지 않았다 때문에 '자기'참조를 제거) 시도했다 :

def upTest(self): 
     print('env.hosts = ' + str(env.hosts)) 
     run("uptime") 

이 출력됩니다. 그러나 아무 도움도.

env.hosts와 작동하게하는 방법이 있습니까? 수동으로 루프를 돌릴 때마다 여러 개의 호스트를 실행해야 할 때마다 반대가됩니까?

답변

5

마지막으로 실행하여() 및 간부에 의해이 문제를 해결.

main.py

#!/usr/bin/env python 

from demo import FabricSupport 

hosts = ['localhost'] 

myfab = FabricSupport() 
myfab.execute("df",hosts) 

demo.py

#!/usr/bin/env python 

from fabric.api import env, run, execute 

class FabricSupport: 
    def __init__(self): 
     pass 

    def hostname(self): 
     run("hostname") 

    def df(self): 
     run("df -h") 

    def execute(self,task,hosts): 
     get_task = "task = self.%s" % task 
     exec get_task 
     execute(task,hosts=hosts) 

나는 그것이 코드에서 env.hosts을 설정하지 않는 것이 좋습니다 것으로 나타났습니다

[localhost] Executing task 'hostname' 
[localhost] run: hostname 
[localhost] out: heydevops-workspace 
0

파이썬 main.py하지만, 대신 구성 파일을 기반으로 역할을 정의하고 fab 도구를 사용하여 역할을 지정하십시오. 그것은 web1my_task을 실행 CLI

fab -R web my_task

출력

my_roles.json

나를 위해

{ 
    "web": [ "[email protected]", "[email protected]" ], 
    "db": [ "[email protected]", "[email protected]" ] 
} 

fabfile.py

from fabric.api import env, run, task 
import json 

def load_roles(): 
    with open('my_roles.json') as f: 
     env.roledefs = json.load(f) 

load_roles() 

@task 
def my_task(): 
    run("hostname") 

을 근무하고 web2 그가입니다 다시