在运行时更改 Chef-solo 脚本中的节点值

在运行时更改 Chef-solo 脚本中的节点值

我正在尝试使用 Chef-solo 在 Vagrant VM 内部部署一些软件,以及能够重新使用相同的配方部署到在 EC2 上运行的 Centos 盒子上。

我更愿意在机器上生成 root MySQL 密码,而不是将其包含在启动脚本中。但是如何在运行时在 Chef 中设置节点值?

例如在下面的菜谱中,脚本 buildInfo.php 会将一些 JSON 数据写入文件中/etc/chef/serverInfo.json,然后我希望 Chef 读取和使用这些数据。

execute 'build_info' do
    cwd node[:source_folder] + "/tools"
    command  "php buildInfo.php /etc/chef/serverInfo.json"
    node.override.merge!(JSON.parse(File.read("/etc/chef/serverInfo.json")))
    command  "echo 'password is " + node["MYSQL_PASSWORD"] + "' > /tmp/chefvartest.txt"
end

然而,似乎任何通过node.override.等改变值的命令都是在 Chef-solo 启动并解析配方时完成的,而不是在实际运行配方时完成的。

如何像node["MYSQL_PASSWORD"]在一个配方中一样设置节点变量的值,以便稍后在单独的配方中使用?

答案1

实际上,我找到了一种方法,即在运行完食谱中的几项内容后运行第二个 Chef 聚合。我很惊讶看到其他人也需要这个。

这是我对重新融合黑客的描述

以下是我认为您完成此操作所需的内容,请也查看博客文章。

#some parts of your recipe can go up here

#Initialize a new chef client object
client = Chef::Client.new
client.run_ohai #you probably only need this if you need to get new data
client.load_node
client.build_node

#Intialize a new run context to evaluate later
run_context = if client.events.nil?
  Chef::RunContext.new(client.node, {})
else
  Chef::RunContext.new(client.node, {}, client.events)
end

#Initialize a chef resource that downloads the remote file
r = Chef::Resource::Execute.new("build_info", run_context)
r.cwd node[:source_folder] + "/tools"
r.command "php buildInfo.php /etc/chef/serverInfo.json"
r.run_action(:run)

#Converge and run the new resources
runner = Chef::Runner.new(run_context)
runner.converge

#Since the file is now created from the above hack, Chef will be able to read it
node.override.merge!(JSON.parse(File.read("/etc/chef/serverInfo.json")))

相关内容