Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 更改chef_环境后重新启动chef运行_Ruby_Chef Infra - Fatal编程技术网

Ruby 更改chef_环境后重新启动chef运行

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 无法工作,因为生成的客户端将看到父级,并

我想实现一个配方,将节点分配给外部条件(在本例中是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

无法工作,因为生成的客户端将看到父级,并将等待它退出。。有什么想法吗?也许有办法强制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客户端本身,或者使用特定的退出代码来表示需要重新启动