내 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를 직접 사용할 수있는 솔루션이 있습니까?
'init_env'에 들여 쓰기 오류가있는 것 같습니다.두 개의 return 문은 한 단계 더 들여 쓰기해야합니다. – millerdev
그것은 나쁜 복사 붙여 넣기, 내 원래 들여 쓰기 좋은 것입니다. 내 게시물을 수정했습니다. – Matt
다른 파이썬 스크립트에서 작업을 호출한다고 언급했습니다. 'fab' 명령이나 다른 방법으로 다른 스크립트를 호출하고 있습니까? 니스 – millerdev