Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使puppet在替换文件之前停止服务?_Puppet - Fatal编程技术网

如何使puppet在替换文件之前停止服务?

如何使puppet在替换文件之前停止服务?,puppet,Puppet,在更换puppet服务后面的软件时,我试图避免竞争条件 为此,puppet需要停止服务,替换可执行文件,然后启动服务。有没有办法说服木偶这样做?它的首选方式似乎是替换可执行文件,然后检查状态,必要时再次启动服务 (这个例子是人为的。真正的竞争条件远没有这么简单…) 下面是我用来模拟这个问题的木偶清单: $O='1' $I='2' 执行官{hi: command=>'/bin/echo“$(/bin/date+%s)木偶说你好”>>/tmp/freebird.log', } 文件{exe: nam

在更换puppet服务后面的软件时,我试图避免竞争条件

为此,puppet需要停止服务,替换可执行文件,然后启动服务。有没有办法说服木偶这样做?它的首选方式似乎是替换可执行文件,然后检查状态,必要时再次启动服务

(这个例子是人为的。真正的竞争条件远没有这么简单…)

下面是我用来模拟这个问题的木偶清单:

$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]