2014-08-29 1 views
1

Boxen/Puppet을 사용하여 Mac 개발 랩톱의 빌드를 자동화합니다. 한 단계는 rabbitmq을 설치하고, 가상 호스트를 선언하고, 사용자를 추가하는 것입니다.꼭두각시 : 필요한 경우에만 exec를 생성 할 수 있습니다.

그러나 우리는 항상 boxen을 두 번 실행해야하므로 vhosts 선언 및 새로운 사용자 추가를 준비하는 데 rabbitmq에 약간의 시간이 걸립니다.

은 여기 내 논리

rabbitmq는 다음 명령을 rabbitmqadmin list vhost 을 실행하여 준비가되어 있는지 확인입니다 그러나 우리는 rabbitmq를 설치하고 위의 명령은 우리가 토끼가 연결을 허용 알고 다음 일을하면 내가 require => Service['dev.rabbitmq'] 을 추가 실행이 필요합니다.

여기 모두를 정리해 보겠습니다.

exec { "Wait for rabbitmq": 
    command => "rabbitmqadmin list vhosts", 
    tries => 2, 
    try_sleep => 30, 
    require => Service['dev.rabbitmq'] 
    } 
    dev::rabbitmq::vhost { '/clearvh': 
    require => Exec['Wait for rabbitmq'] 
    } 
    dev::rabbitmq::user { 'clear': password => 'password' } 
    dev::rabbitmq::permission { [ 'guest', 'clear' ]: vhost => '/clearvh' } 
} 
잘 작동

하지만 Exec {"Wait for rabbit"}dev::rabbit::vhost이없는 경우에도, 때마다 호출지고 있습니다. 그것은 dev::rabbitmq::vhost에 의해서만 호출되는 것이 좋습니다.

그럴 수 있습니까?

감사

+1

단지 'refreshonly => true'로 시도해보고 서비스를 요구하는 대신'구독 '할 수 있습니다. 하지만 재시도 의미가 현재 수행중인 실제 동기화와 달리'새로 고침 '작업에 적용되는지 여부는 확실하지 않습니다. 그렇지 않은 경우 내부적으로 fail/sleep/retry 루프를 수행하는 래퍼 스크립트를 실행하여이 문제를 해결할 수 있습니다. –

+0

'refreshonly' /'subscribe'는 또한 꼭두각시가 서비스를 (다시) 시작할 필요가 없다면'Exec'가 실행되지 않는다는 장점이 있습니다. 그러나 Puppet이 'Exec'새로 고침을 다시 시도할지 여부를 알지 못합니다. 나는 그것이 할 것 같아요,하지만 난 모르겠다. 대신 셸 공급자와 exec "sleep 30; rabbitmqadmin list vhosts"를 사용할 수 있습니까? –

답변

0

당신은 exec 잘못된 방법에 대한 것이다. exec의 실행을 중지하려면 조건이 있어야합니다. 당신이 어떤 이유로 또는 다른 출마 아닌 임원에게하지 않는 한

exec { "Wait for rabbitmq": 
    command => "rabbitmqadmin list vhosts", 
    tries => 2, 
    try_sleep => 30, 
    unless => 'some command which returns "0" that tells you rabbitmq is already ready for vhosts', 
    require => Service['dev.rabbitmq'] 

}

항상 실행됩니다.

Puppet Type Reference for the exec resource을보고 unlessonlyif을 찾으십시오.

그리고 내가 처음에 간과 한이 질문의 제목은. requirerequire에 전달 된 리소스를 호출 리소스보다 먼저 적용해야한다는 것을 의미합니다. 이 경우

Service['dev.rabbitmq']

Exec['Wait for rabbitmq'] 전에 적용됩니다 그래서.

requireexec 리소스가 실행되지 않을 것을 보장하지 않습니다.

+0

내가 한 일을 잊어 버리자. 유령을 선언하기 전에 rabbitmq가 (연결을 수락하는) 준비가되었는지 확인하려면 어떻게해야할까요?'onlyif'는 내가 원한 것이 아니며, 실패하면 내 가상 호스트 선언을 그냥 건너 뛰기 때문에. –

+0

당신은 간부를 지킬 수 있습니다. exec에'tries' 및'try_sleep' 매개 변수를 사용하십시오. 나는 그것으로 나의 대답을 갱신 할 것이다. 아직도 찾고있는 것이 아니라면 우리는 더 깊이 탐구 할 수 있습니다. – ptierno

+0

ㅎ. 그것을 무시하십시오. 내가 이미'시도하고'try_sleep'을 이미 가지고 있다는 것을 깨닫지 못했습니다. – ptierno