Ruby 更改chef_环境后重新启动chef运行
我想实现一个配方,将节点分配给外部条件(在本例中是Scalr环境变量APP_ENV)选择的特定chef环境(在编译阶段的早期),并立即(在现有流程树中)重新启动chef run 代码如下:Ruby 更改chef_环境后重新启动chef运行,ruby,chef-infra,Ruby,Chef Infra,我想实现一个配方,将节点分配给外部条件(在本例中是Scalr环境变量APP_ENV)选择的特定chef环境(在编译阶段的早期),并立即(在现有流程树中)重新启动chef run 代码如下: if ENV['APP_ENV'] != node['chef_envronment'] node.normal['chef_envronment'] = ENV['APP_ENV'] node.save Chef::Client.new.run end 无法工作,因为生成的客户端将看到父级,并
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忽略锁文件?所以有几个问题。首先,这并不是说你设置了一个节点的环境,所以这实际上不会做任何事情。第二,调用“代码>节点”。在运行过程中,保存< /COD>通常会导致部分数据在服务器上结束,这取决于您运行该代码的位置。第三,没有具体的方法来重新启动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
这仍然不是一个防弹选项,但至少在所有三个方面都更好。这种方法的问题是,它将中止chef run,并以非零(失败)状态告知我们的业务流程(Scalr),实例在初始化过程中失败。我需要的是优雅地,在同一个“执行官”内,进入新的厨师运行新的环境。也许可以通过操纵者来实现?我会检查的。正如我说的,我们没有这个系统。您可以直接重新执行chef客户端本身,或者使用特定的退出代码来表示需要重新启动