我正在尝试使用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”)获取任何搜索结果 ??
(我们已经明确选择了不来使用厨师服务器解决方案,这是出于一些经过仔细考虑的原因。)
答案 0 :(得分:0)
Chef Solo不支持搜索:
chef-solo是chef-client的开源版本,允许使用带有节点的cookbook而无需访问服务器。 chef-solo在本地运行,并要求cookbook(及其任何依赖项)与节点位于同一物理磁盘上。 chef-solo是chef-client的功能有限版本,不支持以下内容:
- 节点数据存储
- 搜索索引< -
- 集中分发食谱
- 与基础架构组件交互并集成基础架构组件的集中式API
- 身份验证或授权
- 持久属性
答案 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的测试,我注意到了这一点。角色搜索测试仅在alpha
和beta
节点上运行,而不在without_json_class
节点上运行,我发现了差异,即后一个类声明为{{1} } here而不是Hash
。