![在运行时更改 Chef-solo 脚本中的节点值](https://linux22.com/image/1375098/%E5%9C%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9B%B4%E6%94%B9%20Chef-solo%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9%E5%80%BC.png)
我正在尝试使用 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")))