【问题标题】:Restart chef run after changing chef_environment更改 chef_environment 后重新启动厨师运行
【发布时间】:2017-03-21 04:58:38
【问题描述】:

我想实现一个配方,将节点分配给由外部条件(在本例中为 Scalr 环境变量 APP_ENV)选择的特定厨师环境(在编译阶段早期)并立即(在现有流程树中)重新启动厨师运行

这样的代码:

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 忽略锁定文件?

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    所以有几个问题。首先,这不是您设置节点的环境,因此这实际上不会做任何事情。其次,在运行过程中调用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
    

    这仍然不是一个防弹的选择,但至少在所有三个方面都更好。

    【讨论】:

    • 这种方法的问题是它会以非零(失败)状态中止厨师运行,告诉我们的编排(Scalr)实例在初始化期间失败。我需要的是优雅地在同一个“执行”中进入新的厨师运行新环境。也许它可以通过处理程序来实现?我会检查的。
    • 正如我所说,我们没有这方面的系统。您可以直接重新执行 chef-client 本身或使用特定的退出代码来表示需要重新启动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多