Я пытаюсь настроить пару серверов с помощью ножа-соло, и мне нужно использовать базовый поиск в рецепте, чтобы я мог знать, какие серверы реализуют определенную роль. Кажется, это самая основная цель использования поиска.
Я использую chef-solo-search, однако я не могу найти узлы по роли, как (кажется) описано в документах; Я совершенно озадачен. Я могу взломать решение, но, похоже, я делаю что-то не так. Я построил упрощенный пример, чтобы продемонстрировать свою проблему.
Это не работает...
Я создал фиктивную роль roles/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 -search в соответствии с документированными инструкциями, и я не получаю никаких ошибок, указывающих на обратное. Из идей.
Но это работает...
Единственное, что я действительно сделал, это переписал рецепт поиска из:
nodes = search(:node, "role:test_role")
к этому:
nodes = search(:node, "run_list:*role\\[test_role\\]*")
Вторая форма на самом деле дает мне желаемые результаты. Это приемлемый обходной путь, но он кажется чем-то вроде хака, и это заставляет меня задуматься... либо я делаю что-то ужасно неправильно, либо все документы для "нож-соло" и "повар-соло-поиск" неверны (что кажется маловероятным!)
Кто-нибудь может помочь объяснить, почему я не могу получить результаты поиска с помощью search(:node, "role:test_role")??
(Мы явно решили не использовать серверное решение шеф-повара по ряду тщательно продуманных причин.)