我想实现一个配方,将节点分配给由外部条件选择的特定厨师环境(编译初期)(在本例中为Scalr环境变量APP_ENV),并立即(在现有流程树中)重新启动Chef运行
这样的代码:
if ENV['APP_ENV'] != node['chef_envronment']
node.normal['chef_envronment'] = ENV['APP_ENV']
node.save
Chef::Client.new.run
end
不会工作,因为产生的客户会看到父母,并会等到它退出..任何想法?也许有办法强制Chef :: Client.new.run忽略锁定文件?
答案 0 :(得分:0)
所以有几个问题。首先,这不是你设置一个节点的环境,所以这实际上什么也做不了。其次,在运行过程中调用node.save
通常会导致部分数据在服务器上的错误,这取决于您运行此代码的位置。第三,没有特定的方法来重启Chef运行。您必须退出并让守护进程模式chef-client
或其他某个间隔运行重新启动它。
if ENV['APP_ENV'] != node.chef_environment
n = Chef::Node.load(node.name)
n.chef_environment = ENV['APP_ENV']
n.save
raise "forcing run to fail to pick up new environment"
end
这仍然不是一个防弹选项,但至少在这三个方面都更好。