Как найти узлы по ролям с помощью «нож-соло» и «повар-соло-поиск», т. е. search(:node, role:some_role)?

Я пытаюсь настроить пару серверов с помощью ножа-соло, и мне нужно использовать базовый поиск в рецепте, чтобы я мог знать, какие серверы реализуют определенную роль. Кажется, это самая основная цель использования поиска.

Я использую 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")??

(Мы явно решили не использовать серверное решение шеф-повара по ряду тщательно продуманных причин.)


person Tom Wilson    schedule 14.01.2014    source источник


Ответы (2)


Chef Solo не поддерживает поиск:

шеф-повар-соло — это версия клиента шеф-повара с открытым исходным кодом, которая позволяет использовать поваренные книги с узлами, не требуя доступа к серверу. chef-solo запускается локально и требует, чтобы поваренная книга (и любые ее зависимости) находилась на том же физическом диске, что и узел. шеф-повар-соло — это версия клиента шеф-повара с ограниченной функциональностью, которая не поддерживает следующее:

  • Хранение данных узла
  • Поисковые индексы ‹-
  • Централизованное распространение поваренных книг
  • Централизованный API, который взаимодействует с компонентами инфраструктуры и интегрирует их.
  • Аутентификация или авторизация
  • Постоянные атрибуты

Источник: http://docs.opscode.com/chef_solo.html

person sethvargo    schedule 14.01.2014
comment
Да, именно поэтому я также использую повар-соло-поиск... github.com/edelight/ шеф-повар-соло-поиск Я могу использовать его неправильно, но он работает для различных поисков, но не работает должным образом для поиска узлов/ролей. - person Tom Wilson; 15.01.2014
comment
Я не думаю, что chef-solo-search поддерживает расширенные варианты использования, такие как поиск ролей или run_lists на узлах. - person sethvargo; 15.01.2014
comment
Интересно, есть ли трудности в терминологии. Например, является ли это: search(:node, role:test_role) индексированным поиском, а этот search(:node, run_list:*role\[test_role\]*) - нет? Или я, возможно, теряюсь в несоответствиях между node и data_bag/node/ между knife-solo и chef-solo-search? - person Tom Wilson; 15.01.2014
comment
sethvargo, спасибо, я так и предполагал, основываясь на тестовом коде, на который я ссылался: github.com/edelight/chef-solo-search/blob/master/tests/ ~ строка 208 Но простое отсутствие поддержки может быть самым простым объяснением, почему я не могу заставить его работать; -) - person Tom Wilson; 15.01.2014

Это не работает, потому что вам нужно указать это в json-файле узла, чтобы chef-solo-search считал его реальным объектом узла вместо обычного Hash:

"json_class": "Chef::Node"

После этого он будет доступен для поиска по ролям. Итак, в основном ваш пример node2 должен выглядеть так:

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

Я заметил это, изучив тесты для поиска шеф-повара, которые вы указали в последнем комментарии к первому ответу. Тест поиска ролей выполняется только на узлах alpha и beta, а не на узле without_json_class, и я обнаружил разницу, которая заключается в том, что последний класс утверждает Hash здесь вместо Chef::Node.

person nightw    schedule 11.02.2014
comment
Текущие версии не будут работать таким образом, по крайней мере, с моей установкой. Добавление элемента "json_class": "Chef::Node" к узлу приводит к тому, что значение id каким-то образом устанавливается равным nil, что приводит к ошибке при доступе к databag_item (то есть к узлу). - person Tom Wilson; 30.05.2014