免责声明:对厨师来说很新鲜,我继承了一堆厨师烹饪书。以下方法不是最佳的,但我现在必须使用它。请温柔。 :)另外,当我试着描述我需要的东西时,请耐心等待。
请注意,我们正在使用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."
这对我有用。
答案 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