2013-12-08 5 views
2

내 fabfile에 일부 패브릭 작업이 있는데 실행 전에 env 변수를 초기화해야합니다. 난 데코레이터를 사용하려고하는데, 작동하지만 패브릭은 항상 "호스트가 없습니다. (단일)을 지정하십시오."라고 말하지만, 내 변수 "env"의 내용을 모두 인쇄하는 것이 좋습니다. 또한 다른 파이썬 스크립트에서 내 작업을 호출합니다.파이썬 패브릭 데코레이터

from fabric.api import * 
from instances import find_instances 

def init_env(func): 
    def wrapper(*args, **kwargs): 
     keysfolder = 'keys/' 
     env.user = 'admin' 
     env.key_filename = '%skey_%s_prod.pem'%(keysfolder, args[0]) 
     env.hosts = find_instances(args[1]) 
     return func(args[0], args[1]) 
    return wrapper 


@init_env 
def restart_apache2(region, groupe): 
    print(env.hosts) 
    run('/etc/init.d/apache2 restart') 
    return True 
fabfile 전화

내 스크립트를

[u'10.10.0.1 ', u'10.10.0.2']

: 다시 시작 아파치에 인쇄

from fabfile import init_env, restart_apache2 

restart_apache2('eu-west-1', 'apache2') 

출력

내 작업 restart_apache2가 env 변수를 사용하지 않는 이유는 무엇입니까?

감사

편집 : fabfile를 호출 내 스크립트에, 내가 fabric.api에서 설정을 사용하고 호스트 IP를 설정하면 그것의 재미

, 그것은 작동합니다. 키와 사용자가 fabric으로 보내지기 때문에 내 데코레이터가 env 변수를 잘 초기화했다는 것을 보여줍니다. 그것은 ... 직물 읽어 아니에요 단지 env.hosts있어

EDIT2 : 그 같은 fabric.api의 설정을 사용하여 내 목표에 도달 할 수

:

@init_env 
def restart_apache2(region, groupe): 
    for i in env.hosts: 
     with settings(host_string = '%[email protected]%s' % (env.user, i)): 
      run('/etc/init.d/apache2 restart') 
    return True 

보너스 질문을, 설정없이 env.hosts를 직접 사용할 수있는 솔루션이 있습니까?

+0

'init_env'에 들여 쓰기 오류가있는 것 같습니다.두 개의 return 문은 한 단계 더 들여 쓰기해야합니다. – millerdev

+0

그것은 나쁜 복사 붙여 넣기, 내 원래 들여 쓰기 좋은 것입니다. 내 게시물을 수정했습니다. – Matt

+0

다른 파이썬 스크립트에서 작업을 호출한다고 언급했습니다. 'fab' 명령이나 다른 방법으로 다른 스크립트를 호출하고 있습니까? 니스 – millerdev

답변

3

저는 여기 조금 추측하고 있지만, 한 번에 두 가지 문제를 해결하려고하기 때문에 문제가 발생했다고 가정합니다.

첫 번째 문제는 여러 호스트 문제와 관련이 있습니다. 패브릭에는 roles의 개념이 포함되어 있습니다.이 개념은 한 번에 명령을 실행할 수있는 기계 그룹입니다. find_instances 함수의 정보를 사용하여이 데이터를 채울 수 있습니다.

from fabric import * 
from something import find_instances 

env.roledefs = { 
    'eu-west-1' : find_instances('eu-west-1'), 
    'eu-west-2' : find_instances('eu-west-2'), 
} 

@task 
def restart_apache2(): 
    run('/etc/init.d/apache2 restart') 

두 번째 문제는 서로 다른 서버 그룹에 대해 서로 다른 키를 사용한다는 것입니다. 이 문제를 해결하는 한 가지 방법은 SSH 구성 파일을 사용하여 키/사용자 계정의 세부 정보를 패브릭 코드와 혼합하지 못하게하는 것입니다.

fab restart_apache2 -R eu-west-1 
: 당신은 당신의 ~/.ssh/config으로 인스턴스 당 항목을 추가 할 수 있습니다, 또는 명령 행에서 local SSH config ( env.use_ssh_configenv.ssh_config_path)

Host instance00 
    User admin 
    IdentityFile keys/key_instance00_prod.pem 

Host instance01 
    User admin 
    IdentityFile keys/key_instance01_prod.pem 

# ... 

을 사용할 수 있습니다, 당신은 다음과 같은 명령을 실행 할 수 있어야한다

또는, 당신은 아직 할 수있는 단일 호스트 : 스크립트에서

fab restart_apache2 -H apache2 

,이 두 사람은에 해당합니다함수 :

from fabric.api import execute 
from fabfile import restart_apache2 

execute(restart_apache2, roles = ['eu-west-1']) 
execute(restart_apache2, hosts = ['apache2']) 
+0

('유럽 연합 (EU)에서 서쪽으로-1', '아파치') fabfile 수입 init_env에서 , restart_apache2을 restart_apache2 : – Matt

관련 문제