2012-02-18 2 views
6

꼭두각시 서비스 뒤에있는 소프트웨어를 교체 할 때 경쟁 조건을 피하려고합니다. 파일을 바꾸기 전에 꼭두각시 서비스를 중지 시키려면 어떻게합니까?

꼭두각시가에게 서비스를 중지 필요가 있음을하려면 를 실행 한 후 시작 서비스를 대체합니다. 꼭두각시가 그 일을하도록 이야기 할 방법이 있습니까? 그 일을하는 선호하는 방법은 실행 파일을 대체 한 다음 필요한 경우 상태를 확인하고 다시 시작하는 것 같습니다.

다음
$O = '1' 
$I = '2' 

exec { hi : 
     command => '/bin/echo "$(/bin/date +%s) puppet says hello" >> /tmp/freebird.log' , 
     } 

file { exe : 
     name => "/tmp/freebird" , 
     ensure => present , 
     owner => "root" , 
     group => "root" , 
     mode => "0555" , 
     source => "/root/test-v$I" , 
     } 

file { init : 
     name => '/etc/init.d/freebird' , 
     ensure => present, 
     owner => "root", 
     group => "root", 
     mode => "0555", 
     source => "/root/test.init" , 
     } 

service { freebird : 
     ensure => running, 
     enable => true, 
     hasrestart => true, 
     hasstatus => true, 
     require => [ File[init], File[exe] ], 
     } 

입니다 :

가 여기에이 문제를 시뮬레이션하기 위해 사용하고 인형 매니페스트입니다. (이 예는 인위적인되는 실제 경쟁 조건이 ...이 간단한 어디에도 없습니다) test-v1 파일 test-v2 파일은 v=2과 동일하지만 동일합니다.

#!/bin/bash 
v=1 

while true 
do 
     echo "$(date +%s) $v" >> /tmp/freebird-v.log 
     sleep 1 
done 

그리고있는 init.d 스크립트 : 나는 꼭두각시 서비스 뒤에 소프트웨어를 교체 할 때 경쟁 조건을 피하기 위해 노력하고있어

#!/bin/bash 
# 
# /etc/rc.d/init.d/freebird 

# chkconfig: 2345 90 10 
# description:  freebird 
# Provides:   freebird 
# Required-Start: $syslog $remote_fs 
# Should-Start: 
# Required-Stop:  $syslog $remote_fs 
# Should-Stop: 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: freebird 


# Source function library. 
. /etc/rc.d/init.d/functions 

xme=freebird 
export PATH=/sbin:/bin:/usr/sbin:/usr/bin 

function L() { 
     echo "$(date +%s) $*" 1>&2 
     echo "$(date +%s) $*" >> /tmp/$xme.log 
     } 


case "$1" in 
     (start) L $1 $xme 
       (/tmp/$xme &) 
       ;; 
     (stop) L $1 $xme 
       fuser -k /tmp/$xme 
       ;; 
     (status) L $1 $xme 
       /sbin/fuser /tmp/$xme >/dev/null 2>&1 
       ;; 
     (restart) L $1 $xme 
       $0 stop 
       $0 start 
       ;; 
     (*) 
       echo "Usage: $xme {start|stop|status|restart]" 
       exit 1 
       ;; 
esac 

답변

2

.

이렇게하려면 꼭두각시가 서비스를 중단하고 실행 파일을 교체 한 다음 서비스를 시작해야합니다. 꼭두각시가 그 일을하도록 이야기 할 방법이 있습니까? 그 일을하는 선호하는 방법은 실행 파일을 대체 한 다음 필요한 경우 상태를 확인하고 다시 시작하는 것 같습니다.

퍼핏은 현재 특정 파일을 바꾼 후에 항상 서비스를 다시 시작해야하는 문제가 있습니까?

그렇다면 알림/가입 관계를 사용하여 파일을 교체 한 후에 항상 서비스를 다시 시작해야합니다. 예를 들어 service을 사용하면 가입과 동일한 방식으로 가입 정보를 추가 할 수 있습니다.이 중 하나가 변경되면 다시 시작됩니다.

service { freebird : 
     ensure => running, 
     enable => true, 
     hasrestart => true, 
     hasstatus => true, 
     require => [ File[init], File[exe] ], 
     subscribe => [ File[init], File[exe] ], 
     } 

다른 방법은 퍼핏이 잘 지원하는 OS 패키지 관리를 사용하는 것입니다. 그런 다음 패키지 스크립트에서 다시 시작 (또는 설치 전/후 설치에서 중지/시작)을 실행하고 Puppet을 두어 서비스가 구성되어 실행되고 있는지 확인합니다. Jordan Sissel의 fpm project에서 다양한 패키지 형식을 쉽게 만들 수있는 도구를 살펴보십시오.

+0

M0dlx, 감사합니다. 귀하의 의견은 나를 올바른 방향으로 밀어 넣었습니다. 처음부터이 모든 작업을 수행했다면 필자는 인형을 강제로 처리하지 않고 OS 포장기의 사전 설치 기능을 사용할 것입니다. 그리고 fpm은 훨씬 쉽게 ... – bugi

+0

@ m0dlx, 나는 의심이 하나 있습니다. 내 매니페스트가'File [ 'X'], File [ 'Y'], File [ 'Z'] -> Service [ 'XYZ'] {subscribe : File [ 'X', 'Y']}' ? 'file 'Z''가 생성 된 후에 만 ​​서비스가 실행/재시작 될 것인가''파일 X/Y/Z'가 수정 될 때마다 다시 시작됩니다. – harshad

1

나는 명확성과 검색을 위해 질문을 다시 말한 다음 해결책을 제시 할 것입니다.

그러나 그렇게 할 수있는 옵션이 있다면 네이티브 패키징 시스템의 사전 설치 기능을 사용하는 것이 좋습니다.

Q : 꼭두각시를 통해 rpm의 사전 설치 스크립트를 에뮬레이트하는 방법. 한 가지 유스 케이스는 실행 파일을 설치하기 전에 꼭두각시 서비스를 중지 한 다음 파일을 대체 한 후 다시 시작하는 것입니다. 이는 꼭두각시가 파일을 교체하는 일반적인 순서와 달리 서비스를 다시 시작합니다.

다행히도, 유스 케이스에 이미 symlink mess이 필요합니다.귀하가 원하지 않는 경우 솔루션을 게시하십시오.

fuser /tmp/freebird-v.log /tmp/freebird 
: > /tmp/freebird.log 
echo ==== >> /tmp/freebird.log ; puppet apply --verbose --onetime --no-daemonize test.pp 2>&1 | tee ~/D ; cat /tmp/freebird.log 
ps auxww|grep freebird 
fuser /tmp/freebird-v.log /tmp/freebird 

파일 test.pp :

$tversion = '1' 

exec { hi : 
     command => '/bin/echo "$(/bin/date +%s) puppet says hello" >> /tmp/freebird.log' , 
     } 

file { exe : 
     name => "/tmp/freebird-v$tversion" , 
     ensure => present , 
     owner => "root" , 
     group => "root" , 
     mode => "0555" , 
     content => template("/root/test-template") , 
     } 

file { exe_ln : 
     name => "/tmp/freebird" , 
     ensure => link , 
     owner => "root" , 
     group => "root" , 
     mode => "0555" , 
     target => "/tmp/freebird-v$tversion" , 
     } 

file { init : 
     name => '/etc/init.d/freebird' , 
     ensure => present, 
     owner => "root", 
     group => "root", 
     mode => "0555", 
     source => "/root/test.init" , 
     } 

exec { freebird_stop_if_incoherent : 
     command => '/sbin/service freebird stop' , 
     refreshonly => false , # required for when entering at exe_ln 
     onlyif => "/sbin/service freebird status && ! test /tmp/freebird -ef '/tmp/freebird-v$tversion'" , # short-circuits the refreshonly for most cases 
     } 

service { freebird : 
     ensure => running, 
     enable => true, 
     hasrestart => true, 
     hasstatus => true, 
     } 

File[exe_ln]   <~ Exec[freebird_stop_if_incoherent] 
Service[freebird]  <- File[exe_ln] 

은 그때 내 터미널에이를 붙여 test.pp에 $tversion을 편집, 아래의 파일로 구성된 테스트를 실행하려면

파일 시험 템플릿 :

#!/bin/bash 
v=<%= tversion %> 

while true 
do 
     echo "$(date +%s) $v" >> /tmp/freebird-v.log 
     sleep 1 
done 

파일 test.init :

#!/bin/bash 
# 
# /etc/rc.d/init.d/freebird 

# chkconfig: 2345 90 10 
# description:  freebird 
# Provides:   freebird 
# Required-Start: $syslog $remote_fs 
# Should-Start: 
# Required-Stop:  $syslog $remote_fs 
# Should-Stop: 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: freebird 


# Source function library. 
. /etc/rc.d/init.d/functions 

xme=freebird 
export PATH=/sbin:/bin:/usr/sbin:/usr/bin 

function L() { 
     local pid=$$ 
     local ppid=$(ps l $pid |awk '{print $4}' |tail -1) 
     local extra="-- $(ps $ppid|tail -1|sed 's,^[^/]*/,/, ; s,/[0-9][^/]*/,/,')" 
     echo "$(date +%s) $pid $ppid $* $extra" 1>&2 
     echo "$(date +%s) $pid $ppid $* $extra" >>/tmp/$xme.log 2>&1 
     } 


case "$1" in 
     (start) L $1 $xme 
       fuser /tmp/$xme >/dev/null 2>&1 || (/tmp/$xme &) 
       ;; 
     (stop) L $1 $xme 
       fuser /tmp/$xme 2>&1 
       fuser -k /tmp/$xme 1>&2 ||true 
       fuser /tmp/$xme 2>&1 
       true 
       ;; 
     (status) L $1 $xme 
       /sbin/fuser /tmp/$xme >/dev/null 2>&1 
       ;; 
     (restart) L $1 $xme 
       fuser -k /tmp/$xme 1>&2 ||true 
       (/tmp/$xme &) 
       ;; 
     (*) 
       echo "Usage: $xme {start|stop|status|restart]" 
       exit 1 
       ;; 
esac 
관련 문제