如何通过刀 - 独奏和厨师 - 独奏 - 搜索找到节点,即搜索(:node,“role:some_role”)?

时间:2014-01-14 15:36:53

标签: chef chef-solo knife-solo

我正在尝试使用knife-solo设置几个服务器,我需要在配方中使用基本搜索,以便我知道哪些服务器正在实现特定角色。这似乎是使用搜索的最基本目的。

我正在使用chef-solo-search,但是我无法按照角色找到节点(似乎是)在文档中描述;我完全难过了。我可以破解解决方案,但似乎我做错了什么。我构建了一个简化示例来演示我的问题。

这不起作用......

我创建了一个虚拟角色 roles / test_role.json

{
   "name": "test_role",
   "default_attributes": {},
   "json_class": "Chef::Role",
   "run_list": [],
   "description": "",
   "override_attributes": {}
}

我测试搜索具有“test_role”角色的节点的基本方法: 的站点食谱/ nodesearch /食谱/ default.rb

# required for search with knife-solo
include_recipe "chef-solo-search"

# this is now the test code for chef-solo-search shows to search for nodes that implement a role.
# see https://github.com/edelight/chef-solo-search/blob/master/tests/test_search.rb ~ line 208
nodes = search(:node, "role:test_role")

# This creates a line for each node found in the search...
search_content = nodes.map {|node| "id: #{node['id']}  run_list: #{node['run_list']}\n"}.join

# And writes it to a file
file "/var/test_role_nodes.txt" do
  content search_content
  action :create
end

我创建了两个节点:

节点/ node1.json

{
  "id": "node1",
  "run_list": ["recipe[nodesearch]"]
}

节点/ node2.json

{
  "id": "node2",
  "run_list": ["role[test_role]"]
}

当我“烹饪”node1(运行nodesearch配方)时,我希望搜索(:node,“role:test_role”)搜索找到node2,但它什么都不返回。我已经尝试将节点定义移动到data_bags目录 因为文件(在某些地方)似乎暗示这是必要的,我尝试了各种各样的 shenanigans有solo.rb设置等。我相信我已根据文档说明设置了chef-solo-search,并且我没有收到任何错误以表明其他情况。出于想法。

但这有效......

我做 的唯一工作是:从以下位置重写搜索配方:

nodes = search(:node, "role:test_role")

到此:

nodes = search(:node, "run_list:*role\\[test_role\\]*")

第二种形式实际上得到了我想要的结果。这是一个可接受的解决方法,但它似乎有点像黑客,它让我感到疑惑... 或者我必须做一些非常错误的事情,或者所有的刀 - 独奏和厨师 - 独奏 - 搜索的文档都是 错了(这似乎不太可能!)

任何人都可以帮助解释为什么我无法使用搜索(:node,“role:test_role”)获取任何搜索结果 ??

(我们已经明确选择了来使用厨师服务器解决方案,这是出于一些经过仔细考虑的原因。)

2 个答案:

答案 0 :(得分:0)

Chef Solo不支持搜索:

  

chef-solo是chef-client的开源版本,允许使用带有节点的cookbook而无需访问服务器。 chef-solo在本地运行,并要求cookbook(及其任何依赖项)与节点位于同一物理磁盘上。 chef-solo是chef-client的功能有限版本,不支持以下内容:

     
      
  • 节点数据存储
  •   
  • 搜索索引< -
  •   
  • 集中分发食谱
  •   
  • 与基础架构组件交互并集成基础架构组件的集中式API
  •   
  • 身份验证或授权
  •   
  • 持久属性
  •   

来源:http://docs.opscode.com/chef_solo.html

答案 1 :(得分:0)

它不起作用,因为您需要在节点的json文件中为chef-solo-search指定它,以将其视为真正的节点对象而不是普通的Hash

"json_class": "Chef::Node"

此后可以通过角色进行搜索。所以基本上你的例子node2应该是这样的:

{
  "id": "node2",
  "run_list": ["role[test_role]"]
  "json_class": "Chef::Node"
}

通过检查你在第一个答案的最后一个评论中链接的chef-solo-search的测试,我注意到了这一点。角色搜索测试仅在alphabeta节点上运行,而不在without_json_class节点上运行,我发现了差异,即后一个类声明为{{1} } here而不是Hash