Sto cercando di evitare una condizione di gara quando si sostituisce il software dietro un servizio fantoccio.Come posso fare in modo che puppet interrompa un servizio prima di sostituire un file?
Per fare questo, fantoccio ha bisogno di fermare il servizio, sostituire l'eseguibile, quindi inizio il servizio. C'è un modo per parlare di burattini per farlo? Il suo modo preferito di fare le cose sembra essere quello di sostituire l'eseguibile, quindi controllare lo stato e riavviare il servizio se necessario.
(. Questo esempio è artificiosa la condizione di competizione vera e propria non è neanche lontanamente questo semplice ...)
Ecco il burattino manifesto che sto usando per simulare questo problema:
$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] ],
}
Ecco il test-v1 file. Il file test-v2 è lo stesso ma con v=2
.
#!/bin/bash
v=1
while true
do
echo "$(date +%s) $v" >> /tmp/freebird-v.log
sleep 1
done
e lo script 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, grazie. Il tuo commento mi ha spinto sulla strada giusta. Se dovessi fare tutto da zero, utilizzerei sicuramente la funzione di pre-installazione del pacchetto del sistema operativo invece di forzare puppet a gestirlo. E fpm lo rende molto più facile ... – bugi
@ m0dlx, ho un dubbio. Cosa succede se il mio manifest è come 'File ['X'], File ['Y'], File ['Z'] -> Servizio ['XYZ'] {sottoscrivi: File ['X', 'Y']}' ? Il servizio verrà eseguito/riavviato solo dopo che il file 'Z' 'è stato creato o verrà riavviato @ ogni momento' il file X/Y/Z' è stato modificato. – harshad