如何使puppet在替换文件之前停止服务?
在更换puppet服务后面的软件时,我试图避免竞争条件 为此,puppet需要停止服务,替换可执行文件,然后启动服务。有没有办法说服木偶这样做?它的首选方式似乎是替换可执行文件,然后检查状态,必要时再次启动服务 (这个例子是人为的。真正的竞争条件远没有这么简单…) 下面是我用来模拟这个问题的木偶清单:如何使puppet在替换文件之前停止服务?,puppet,Puppet,在更换puppet服务后面的软件时,我试图避免竞争条件 为此,puppet需要停止服务,替换可执行文件,然后启动服务。有没有办法说服木偶这样做?它的首选方式似乎是替换可执行文件,然后检查状态,必要时再次启动服务 (这个例子是人为的。真正的竞争条件远没有这么简单…) 下面是我用来模拟这个问题的木偶清单: $O='1' $I='2' 执行官{hi: command=>'/bin/echo“$(/bin/date+%s)木偶说你好”>>/tmp/freebird.log', } 文件{exe: nam
$O='1'
$I='2'
执行官{hi:
command=>'/bin/echo“$(/bin/date+%s)木偶说你好”>>/tmp/freebird.log',
}
文件{exe:
name=>“/tmp/freebird”,
确保=>存在,
所有者=>“根”,
组=>“根”,
模式=>“0555”,
source=>“/root/test-v$I”,
}
文件{init:
name=>'/etc/init.d/freebird',
确保=>存在,
所有者=>“根”,
组=>“根”,
模式=>“0555”,
source=>“/root/test.init”,
}
服务{freebird:
确保=>正在运行,
enable=>true,
hasrestart=>true,
hasstatus=>正确,
require=>[File[init],File[exe]],
}
这是test-v1文件。test-v2文件相同,但具有v=2
#/bin/bash
v=1
虽然是真的
做
echo“$(日期+%s)$v”>>/tmp/freebird-v.log
睡眠1
完成
以及init.d脚本:
#/bin/bash
#
#/etc/rc.d/init.d/freebird
#chkconfig:2345 90 10
#描述:自由鸟
#提供:freebird
#必需的开始:$syslog$remote\u fs
#应开始:
#所需停止:$syslog$remote\u fs
#应停止:
#默认开始:2 3 4 5
#默认停止:0 1 6
#简介:自由鸟
#源函数库。
. /etc/rc.d/init.d/functions
xme=自由鸟
导出路径=/sbin:/bin:/usr/sbin:/usr/bin
函数L(){
回显“$(日期+%s)$*”1>&2
echo“$(日期+%s)$*”>>/tmp/$xme.log
}
案件“$1”
(开始)L$1$xme
(/tmp/$xme&)
;;
(停止)L$1$xme
定影器-k/tmp/$xme
;;
(状态)L$1$xme
/sbin/fuser/tmp/$xme>/dev/null 2>&1
;;
(重新启动)L$1$xme
0美元一站
零美元起价
;;
(*)
echo“用法:$xme{start | stop | status | restart]”
出口1
;;
以撒
在更换puppet服务后面的软件时,我试图避免竞争条件
为此,puppet需要停止服务,更换可执行文件,然后启动服务。有没有办法说服puppet这样做?它首选的做法似乎是更换可执行文件,然后检查状态,必要时再次启动服务
因此,Puppet目前所做的工作的问题是,它应该总是在替换某些文件后重新启动服务
如果是这样,您应该使用notify/subscribe关系在文件被替换后始终触发服务重新启动。以您的示例service
,我们可以将订阅添加到组成它的文件上(与您使用配置的方式相同),如果其中任何一个文件发生更改,这将触发重新启动
service { freebird :
ensure => running,
enable => true,
hasrestart => true,
hasstatus => true,
require => [ File[init], File[exe] ],
subscribe => [ File[init], File[exe] ],
}
另一种方法是使用您的操作系统包管理,Puppet对此有很好的支持。然后您将触发重新启动(或在安装前/安装后停止/启动)从软件包脚本中,让Puppet确保服务已配置并运行。查看Jordan Sissel的工具,以轻松构建多种软件包格式。为了清晰和搜索,我将重新表述问题,然后提供解决方案 但是,我建议,如果您可以选择这样做,请使用本机打包系统的预安装功能 问:如何通过puppet模拟rpm的预安装脚本。一个用例是在安装可执行文件之前停止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:
M0dlx,谢谢你。你的评论把我推上了正确的道路。如果我从头开始做这一切,我肯定会使用OS packager的预安装功能,而不是强迫puppet来处理这个问题。fpm让这变得更容易…@M0dlx,我有一个疑问。如果我的清单像
File['X']、File['Y']、File['Z']->Service['XYZ']{subscribe:File['X','Y']}
?只有在创建了文件'Z'
之后,服务才会执行/重新启动,或者它会在文件X/Y/Z
被修改的每一刻重新启动。
$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]