如何防止厨师 - 客户状态的最后一次阻止;不要使用状态文件

时间:2016-05-13 19:46:17

标签: linux github chef chef-recipe

免责声明:对厨师来说很新鲜,我继承了一堆厨师烹饪书。以下方法不是最佳的,但我现在必须使用它。请温柔。 :)另外,当我试着描述我需要的东西时,请耐心等待。

请注意,我们正在使用chef-client 11.16.4。目前,更新到12.x不是一种选择。

TL;博士 有没有办法从当前运行块的状态指定一个保护:

...
only_if { this_block_did_something }
notifies :run, 'bash[deploy-custom-docker-container]', :immediately

行...

在我继承的配方中获取这段代码,需要重构一下......

# The identities of the innocent have been changed for their 
# protection. Please ignore odd things in this example:

application app[:name] do
   path app[:deploy_path]
   enable_submodules true
   repository app[:repository]
   owner OWNER
   group GROUP
   symlinks({
       "file.py" => "path/file.py"
   })
   revision app[:branch]
   deploy_key data_bag_item('deployment_keys', 'keyname')['private_key']
end

link "/path/to/file.py" do
   to "/path/to/settings-%s.py" % [file]
end

# This is where I need some direction...I think.
# note that CMD is a valid constant and the custom docker 
# container does not follow any industry standard docker 
# conventions due to our strange use-case. So I had to resort
# using a bash block to call our custom start/stop/restart script

bash 'deploy-custom-docker-container' do
  code <<-EO
  #{CMD} restart
  EO

  # currently a subscribes but I've tried other methods which 
  # don't achieve what I'm trying to accomplish
  subscribes :run, 'application[%s]' % [app[:name]]
end

只要repo具有要同步的新代码,application app[:name]就会将源代码部署到目标节点上。 bash块重新启动使用代码的非常自定义且非行业标准的docker容器。

在当前形式中,这是不受欢迎的,bash[deploy-custom-docker-container]块总是被执行,而不管application app[:name]是否必须将代码部署到git repo(IE repo是最新的而不是up)迄今为止)在目标节点上。我确定我可以创建一些代码来确定repo是否已更新,触摸状态/锁定文件,然后guard执行bash块,检查该锁定文件是否存在。对我而言,这将是实现我的目标的次优方式。什么是最佳的是使用厨师的更新状态作为设置警卫的方法。那可能吗??请继续阅读...

换句话说,当在Chef-client运行时期间点击application app[:name]并且已更新repo(并因此部署在节点上)时,chef-client会报告部署application app[:name]部署的步骤notifies新代码。如果回购不需要更新,厨师 - 客户很乐意用“(最新)”消息跳过该块。如果需要更新repo,chef-client会显示部署代码所采取的步骤。所以chef-client知道它刚刚运行的代码块的状态。

此外,我对厨师 - 客户在我们的环境中运行的观察结果向我表明,如果我在application app[:name] bash[deploy-custom-docker-container]中放置subscribes块,或者使用bash方法(粘贴在上面);无论application app[:name]的状态如何,application app[:name]块都会运行。我希望如果bash没有要执行的更新,那么application app[:name]块就不会运行。

我担心的是我将不得不使用状态文件来确定application app[:name]块中repo更新的状态。我宁愿从厨师的action区块的角度来保护运行时的状态。

固定代码

正如zts所指出的,我的application app[:name] do ... notifies :run, 'link[%s]' % [filetolink], :immediately end link filetolink do to file notifies :run, 'bash[deploy-custom-docker-container]', :immediately end bash 'deploy-custom-docker-container' do code <<-EO #{CMD} restart EO action :nothing end 是错误的或遗失的。以下代码是我能够提出的解决我的问题的代码。

$numMales = 0;
$numFemales = 0;
foreach($aGente as $k => $v){
    if($v == "m"){
        $numMales++;
    } else if($v == "v") {
        $numFemales++;
    }
}
echo "You have " . $numMales . " males and " . $numFemales . " females."

这对我有用。

1 个答案:

答案 0 :(得分:2)

通知仅在通知资源发生更改时触发(反之,订阅仅在您订阅的资源发生更改时才会触发)。

bash块运行的原因与通知无关,默认情况下,bash块将运行。如果您只希望在收到通知时运行资源,请确保包含action :nothing

即:

bash 'deploy-custom-docker-container' do
  code <<-EO
  #{CMD} restart
  EO

  action :nothing
  subscribes :run, 'application[%s]' % [app[:name]]
end