我正在努力启动一个节点集群。myrepo/cookbooks/mycookbook/.kitchen.yml
我有
driver:
name: vagrant
provisioner:
name: chef_zero
roles_path: '../../roles'
environments_path: '../../environments'
data_bags_path: '../../data_bags'
platforms:
- name: ubuntu-12.04
suites:
- name: node01
driver:
vm_hostname: "node01.localhost"
run_list:
- role[genericnode]
provisioner:
client_rb:
environment: development
我myrepo/cookbooks/mycookbook/recipes/default.rb
有
nodes = []
search(:node, 'role:genericnode').each do |node|
nodes.push("http://#{node['ipaddress']}:8080")
end
node.default['mysetting'] = nodes.join(',')
但是,在我的开发环境中,搜索返回一个空列表。我是否需要除.kitchen.yml
上述设置之外的更多设置才能使用该角色访问网络中节点的 IP 地址genericnode
?
附加信息:
角色如下:
{
"name": "genericnode",
"description": "Generic Node",
"json_class": "Chef::Role",
"default_attributes": {
},
"override_attributes": {
},
"chef_type": "role",
"run_list": [
"recipe[apt::default]", "recipe[mycookbook::default]"
],
"env_run_lists": {
}
}
答案1
这个问题已在堆栈溢出,复制答案以供记录:
为了使搜索功能在 chef_zero 下运行,您需要提供一个节点对象文件夹作为要搜索的数据 JSON。除非当前节点位于服务器上(除非您将它添加到该 nodes/ 文件夹中,否则它不在服务器上),否则搜索将找不到当前节点。
解决此问题的通常方法是同时使用搜索和检查本地值。
ips = []
search(:node, 'roles:genericnode').each do |n|
ips << n['ipaddress']
end
if node['roles'].include?'(genericnode')
ips |= [node['ipaddress']]
end
node.default['mysetting'] = ips.map{|ip| "http://#{ip}:8080"}.join(',')