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
4

2 に答える 2

2

puppet Serviceの背後にあるソフトウェアを交換するときに、競合状態を回避しようとしています。

そのためには、puppetはサービスを停止し、実行可能ファイルを置き換えてから、サービスを開始する必要があります。人形にそれをするように話す方法はありますか?実行可能ファイルを置き換えてから、ステータスを確認し、必要に応じてサービスを再開することをお勧めします。

では、Puppetが現在行っていることの問題は、特定のファイルを置き換えた後、常にサービスを再起動する必要があるということですか?

その場合は、通知/サブスクライブの関係を使用して、ファイルが置き換えられた後、常にサービスの再起動をトリガーする必要があります。例をとると、serviceそれを構成するファイルにサブスクリプションを追加できます(構成の場合と同じ方法で)。これにより、いずれかが変更された場合に再起動がトリガーされます。

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

もう1つの方法は、Puppetが適切にサポートしているOSパッケージ管理を使用することです。次に、パッケージスクリプトから再起動(またはインストール前/インストール後の停止/開始)をトリガーし、サービスが構成されて実行されていることを確認するためにPuppetを残します。多くのパッケージ形式を簡単に構築するためのツールについては、JordanSisselのfpmプロジェクトをご覧ください。

于 2012-02-18T07:54:25.497 に答える
1

わかりやすく検索するために質問を言い換えてから、解決策を提供します。

ただし、そうするオプションがある場合は、ネイティブパッケージシステムのプレインストール機能を使用することをお勧めします。

Q:puppetを介してrpmのプレインストールスクリプトをエミュレートする方法。ユースケースの1つは、実行可能ファイルをインストールする前にpuppetサービスを停止し、ファイルを置き換えた後に再度起動することです。これは、ファイルを置き換えてからサービスを再起動するというpuppetの通常の順序とは対照的です。

幸いなことに、私のユースケースではすでにシンボリックリンクの混乱が必要です。そうでない場合は、解決策を投稿してください。

以下のファイルで構成されるテストを実行するには、 test.pp$tversionで編集してから、これをターミナルに貼り付けます。

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]

ファイルテストテンプレート

#!/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
于 2012-02-22T00:56:28.243 に答える