1

我正在尝试使用刀独奏设置几个服务器,并且我需要在配方中使用基本搜索,以便我可以知道哪些服务器正在实施特定角色。这似乎是使用搜索的最基本目的。

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

这不起作用...

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

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

我测试搜索具有“test_role”角色的节点的基本方法: site-cookbooks/nodesearch/recipes/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 配方)时,我期待search(:node, "role:test_role")搜索找到 node2,但它什么也没返回。我已经尝试将节点定义移动到 data_bags 目录,因为文档(在某些地方)似乎暗示这是必要的,而且我已经尝试了各种带有 solo.rb 设置的恶作剧等。我相信我已经设置了 chef-solo - 根据文档说明进行搜索,我没有收到任何错误指示。没有想法。

但这有效...

我所做的唯一有效的事情:重写搜索配方:

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

对此:

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

第二种形式实际上得到了我想要的结果。这是一个可以接受的解决方法,但它似乎有点像黑客,这让我想知道......要么我一定做错了什么,要么刀单和厨师独奏搜索的所有文档都是错误的(哪个似乎不太可能!)

谁能帮助解释为什么我无法使用search(:node, "role:test_role")获得任何搜索结果 ?

(出于许多仔细考虑的原因,我们明确选择使用厨师服务器解决方案。)

4

2 回答 2

0

Chef Solo 不支持搜索:

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

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

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

于 2014-01-14T20:28:53.447 回答
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 测试注意到了这一点。角色搜索测试只在alphaandbeta节点上运行,而不是在without_json_class节点上运行,我发现了不同之处,就是后一个类在Hash 这里断言到 a而不是 a Chef::Node

于 2014-02-11T17:52:45.043 回答