我会打电话给我的自我入门厨师,目前想问一下存储信息以供厨师使用的最佳实践是什么(不敏感)。
我会举例:
1)为了使一个配方正确运行,我必须了解有关环境以及环境中有哪些机器的信息。所以我确实创建了json并将其放入菜谱/文件。
#cookbook/files
{
"UAT1" : [
"hostname1",
"hostname2",
],
"DEV2" : [
"hostname3",
"hostname4",
"hostname5"
]
}
然后在食谱中,我在节点上创建此json,并在厨师运行时从中读取,以查看是否可以在json中找到此主机名,如果可以,请设置稍后在模板中使用的属性。
cookbook_file 'hostnames.json' do
path '/hostnames.json'
source 'hostnames.json'
owner USER
group GROUP
end.run_action(:create)
json = File.read('/hostnames.json')
hostname_list = JSON.parse(json)
hostname_list.each do |env, hostnames|
hostnames.each do |host|
node.default['environment'] = env if hostname == host
end
end
问题:
a)我可以在不实际创建食谱的情况下从食谱中读取文件吗?因为我现在的操作方式感觉不对。
b)还有其他/首选的信息存储方式吗?我曾经使用过数据袋,但我认为情况并非如此?
我知道问题很广泛,所以tldr是,您存储在厨师运行中需要使用的信息的方式是什么?
[file
或template
资源用于管理目标计算机上的文件,而不存储用于厨师客户机运行的某些元信息。
此类信息可从3个地方获取:搜索,属性和数据包。
实际上,您需要在引导程序中指定节点的环境。因此,当您引导hostname1时,将另一个参数添加到knife command:
knife bootstrap [...] --environment UAT1
这将在节点上设置node['chef_environment']
值。
如果某个节点实际上需要属于某个环境的节点列表,则可以使用search找到
# recipe
uat1_nodes = search(:node, 'chef_environment:UAT1')
这是首选方法。如果它不适合您,那么存储此信息的地方就是一个数据袋。这样,您就可以获取数据,而无需像铃鼓跳舞:
# data bag item
{
"id": "myhosts",
"UAT1" : [
"hostname1",
"hostname2",
],
"DEV2" : [
"hostname3",
"hostname4",
"hostname5"
]
}
# recipe
hostname_list = data_bag_item('<data_bag_name>', 'myhosts')
hostname_list.each do |env, hostnames|
hostnames.each do |host|
node.default['environment'] = env if hostname == host
end
end