我試圖在更換傀儡服務後面的軟件時避免競爭狀況。如何在替換文件之前讓木偶停止服務?
要做到這一點,木偶需要停止服務,更換的可執行文件,然後開始服務。有沒有辦法讓傀儡這樣做?它的首選做法似乎是替換可執行文件,然後檢查狀態並在必要時再次啓動服務。
(這個例子是人爲真正的競爭條件是隔靴搔癢這個簡單的...)
這裏的木偶清單我使用來模擬這個問題:
$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
M0dlx,謝謝。您的評論將我推向了正確的道路。 如果我要從頭開始,我肯定會使用操作系統打包程序的預安裝功能,而不是強制puppet來處理這個問題。和fpm使得更容易... – bugi 2012-02-22 00:57:09
@ m0dlx,我有一個疑問。如果我的清單類似於File ['X'],File ['Y'],File ['Z'] - > Service ['XYZ'] {subscribe:File ['X','Y']}' ?只有在創建了'file'Z''後,服務纔會被執行/重新啓動,否則每當'file X/Y/Z'被修改時它就會重新啓動。 – harshad 2015-12-07 05:31:30