厨师,在哪里存储食谱/角色的“支持”数据?

问题描述 投票:0回答:1

我会打电话给我的自我入门厨师,目前想问一下存储信息以供厨师使用的最佳实践是什么(不敏感)。

我会举例:

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是,您存储在厨师运行中需要使用的信息的方式是什么?

chef
1个回答
0
投票

[filetemplate资源用于管理目标计算机上的文件,而不存储用于厨师客户机运行的某些元信息。

此类信息可从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
© www.soinside.com 2019 - 2024. All rights reserved.