有没有办法在傀儡执行改变之前运行命令?

我想在执行任何types的更改之前让puppet运行特定的命令。 我知道主puppet.conf中的prerun_command选项,但这不是我正在寻找的。 我希望命令只在某些事情即将改变时运行,而不是在每个木偶上运行。

这是场景。 假设我在负载平衡器后面有一堆Web服务器。 然后我想傀儡更新网站文件。 但为了防止某些文件已被更新,但其他文件没有,而混合版本导致问题,我想把服务器从负载平衡器池中。
我可以编写一个脚本,在运行时告诉负载平衡器从池中删除该框。 然后傀儡可以做改变,并使用postrun_command一旦完成后把箱子放回池中。 但我需要一种方法来运行该脚本从池中删除服务器。

我能想到的唯一的解决办法是在文件夹上保留2份文件。 一个临时副本,当木偶更新时,使用通知操作来触发删除脚本,然后从分段复制到活动位置。 但是我希望有一些更具通用性的东西,可以对任何正在执行的更改(升级软件包,重新启动服务,创build用户等)起作用。

木偶的主要目的是configurationpipe理 。 也就是说,它会强制你声明的configuration。 你需要什么(基于你在问题中概述的场景)是命令和控制 。 @Mike指出,织物是一种select。 我个人喜欢Marionette Collective,因为它是一个木偶实验室的产品,并与木偶内部(事实等)很好。

这是我的2分钱..你可以在傀儡这样做,但我一直发现部署webapps是非常混乱的木偶。 当然,它会起作用,但当你需要快速恢复的时候会发生什么。 不会与傀儡发生。

我会研究像布料的部署工具

http://docs.fabfile.org/en/1.4.3/index.html

它将允许您在所有的web节点上运行命令来处理部署。 因此,在部署之前,您可以停止networking服务器,然后在部署结束后重新启动它。

编辑

这是一个简单的例子,你可以在傀儡中做什么

所以你有一个文件,但需要执行一个命令之前的文件被更改?

 file { "/path/to/file": ensure => file, require => Exec['command to run'], } 

因此,在需要更改文件之前,将会运行一个命令。

玩了几种不同的方法后,包装脚本是我的最终解决scheme。

发生运行时,脚本被调用而不是puppet agent

  1. 它设置init.pp查找的FACTER_ envvariables。 如果init.pp没有findvariables,它fail()并带有错误信息。
  2. 脚本首先运行puppet agent --noop --onetime --no-daemonize --verbose --color=false | grep -q ' (noop)$' puppet agent --noop --onetime --no-daemonize --verbose --color=false | grep -q ' (noop)$' (它比这更智能一些,因为它也检查puppet agent运行的错误代码,也不能使用--detailed-exitcodes因为错误6322) 。
  3. 如果上面的内容与(noop)$相匹配,它就会从负载平衡器中删除服务器,并且再次运行puppet,而不使用--noop--detailed-exitcodes --noop
  4. 如果运行以02退出,脚本将运行一些额外的检查以确保所有服务都正常运行,然后将该框放回负载平衡器中。