Важное примечание: В теме статьи упомянуто «магит» (Magit), однако предоставленная справочная информация относится исключительно к инструменту Knife — командной строке системы управления конфигурациями Chef Infra․ Magit, это интерфейс для Git в редакторе Emacs и не имеет отношения к Knife․ Ниже представлена подробная статья на основе официальной документации Chef по работе с подкомандой knife search․
Knife — это мощный интерфейс командной строки (CLI), входящий в состав Chef Workstation․ Он обеспечивает взаимодействие между локальной рабочей станцией разработчика и сервером Chef Infra Server․ С помощью Knife можно управлять нодами, кукбуками, ролями, окружениями, дата-багами (data bags) и многое другое․
Одна из самых критически важных возможностей Knife — это поиск (search)․ Chef Infra Server индексирует все данные об инфраструктуре: ноды, роли, окружения, клиентов и дата-баги․ Подкоманда knife search позволяет выполнять полнотекстовые запросы к этим индексам на базе Elasticsearch, что делает возможным динамическое обнаружение сервисов, построение топологий кластеров и автоматизацию на основе данных инфраструктуры․
Синтаксис команды knife search
Базовый синтаксис подкоманды выглядит следующим образом:
knife search INDEX SEARCH_QUERY Параметры:
- INDEX (Индекс) — тип объекта, в котором выполняется поиск․ Допустимые значения:
node— ноды (серверы, управляемые Chef), значение по умолчанию;role— роли․environment— окружения․client— клиенты (API-клиенты)․ИМЯ_DATA_BAG— имя конкретного дата-бага (например,users,apps)․
- SEARCH_QUERY (Поисковый запрос) — строка запроса в специальном синтаксисе (подробнее ниже)․
Если индекс не указан, Knife по умолчанию ищет в индексе node․
Примеры базового использования
Поиск всех нод (список имен)
Ключ -i (или --id-only) выводит только ID (имена) найденных объектов, без полного JSON․
knife search *:* -i Результат:
ubuntu-1804-orgtest
ubuntu-1804-ohai-test
ubuntu-1804-ifcfg-test Этот запрос эквивалентен явному указанию индекса нод:
knife search node *:* -i Упрощенный синтаксис для нод
Если запрос не содержит двоеточия (:), Knife применяет эвристический шаблон по умолчанию, проверяющий популярные поля: теги, роли, FQDN, IP-адреса․
Следующие две команды идентичны:
knife search ubuntu knife search node "tags:ubuntu OR roles:ubuntu OR fqdn:ubuntu OR addresses:ubuntu" Это удобно для быстрого поиска нод по части имени или роли․
Структура поискового запроса: Ключ и Шаблон
Полноценный поисковый запрос состоит из двух частей, разделенных двоеточием:
key:search_pattern - key (Ключ/Поле) — имя поля в JSON-представлении объекта на Chef Server․ Регистрозависим․ Поддерживает ограниченные wildcard-символы () не в начале строки (например,
network․inter)․ - search_pattern (Шаблон поиска) — то, что мы ищем․ Поддерживает несколько режимов совпадения․
Как узнать доступные поля (ключи)?
Используйте подкоманду show для любого объекта, чтобы увидеть его JSON-структуру:
knife node show NODE_NAME -F json
knife role show ROLE_NAME -F json
knife data bag show BAG_NAME ITEM_NAME -F json Типы поисковых шаблонов (Search Patterns)
Chef Search (на базе Elasticsearch) поддерживает 4 основных типа совпадения:
Точное совпадение (Exact Match)
Ищет точное значение поля․ Если значение содержит пробелы или спецсимволы — заключите в кавычки․
knife search node "platform:ubuntu"
knife search node "platform_version:20․04"
knife search node "chef_environment:production" Подстановочные знаки (Wildcard Matching)
Используются символы (ноль или более символов) и ? (один символ)․
platform:ubuntu— найдет ubuntu, ubuntu-20․04, ubuntu-server․fqdn:․example․com— все ноды в домене example․com․roles:web-, все роли, начинающиеся на web-․
knife search node "platform:ubuntu*" Диапазонные запросы (Range Matching)
Позволяют искать числовые или датированные значения в диапазоне․ Используются квадратные скобки [] (включительно) и фигурные {} (исключительно)․
uptime_seconds:[3600 TO 86400]— ноды с аптаймом от 1 часа до 1 суток․cpu_total:{4 TO ]— ноды с более чем 4 CPU (строго больше 4)․ohai_time:[2023-01-01T00:00:00Z TO ]— ноды, проверявшиеся после указанной даты․
knife search node "uptime_seconds:[86400 TO *]" Нечеткий поиск (Fuzzy Matching)
Ищет термины, похожие на заданный (по расстоянию Левенштейна)․ Используется тильда ~ с необязательным параметром․edit distance (0-2, по умолчанию 0․5/1-2 в зависимости от версии ES)․
knife search node "platform:ubunto~" Найдет «ubuntu» даже при опечатке в запросе․
Работа с вложенными полями (Flattened Data)
JSON-объекты нод часто имеют глубокую вложенность (например, node['network']['interfaces']['eth0']['addresses'])․ Chef Infra Server автоматически «выпрямляет» (flattens) вложенные структуры в составные ключи верхнего уровня, объединяя уровни через точку․
Пример:
Вместо ручного прохода по вложенности, можно искать сразу по составному ключу:
knife search node "network․interfaces․eth0․addresses:192;168․1․" Также поддерживаются wildcard в самих ключах (но не в начале):
knife search node "network․interfaces․․addresses:10․0․0․*" Это позволяет находить ноды по IP-адресу на любом интерфейсе, не зная его имени (eth0, ens33, enp0s3 и т․д․)․
Комбинирование запросов (Boolean Logic)
Для построения сложных фильтров используются булевы операторы (должны быть в ВЕРХНЕМ РЕГИСТРЕ):
- AND — пересечение (оба условия должны выполняться)․
- OR, объединение (хотя бы одно условие)․
- NOT, отрицание (исключение)․
Группировка осуществляется круглыми скобками ․
Примеры сложных запросов:
- Все веб-серверы в продакшене на Ubuntu:
knife search node "role:web-server AND chef_environment:production AND platform:ubuntu" - Ноды с 4+ CPU и памятью более 8ГБ (предполагая наличие атрибутов):
knife search node "cpu_total:[4 TO ] AND memory_total:[8589934592 TO *]" - Все ноды, КРОМЕ баз данных:
knife search node "NOT role:database" - Поиск в конкретном дата-баге (например, пользователи с uid > 1000):
knife search users "uid:[1000 TO *]"
Практические сценарии применения
Динамическая конфигурация в рецептах (Chef Infra Language)
Хотя статья про Knife CLI, важно знать: тот же движок поиска доступен внутри рецептов через метод search(:index, "query")․ Knife позволяет отлаживать эти запросы локально перед запуском конверджа․
# В рецепте:
web_nodes = search(:node, "role:web AND chef_environment:#{node․chef_environment}")
knife search node "role:web AND chef_environment:production" Инвентаризация и аудит
- Найти все ноды с устаревшим Chef-клиентом:
knife search node "chef_version:17․" - Найти ноды, не проверявшиеся долго:
knife search node "ohai_time:[ TO 2023-12-31T23:59:59Z]"
Автоматизация развертывания (Service Discovery)
Получение списка IP-адресов баз данных для балансировщика нагрузки:
knife search node "role:db-master" -a ipaddress -i (Флаг -a ipaddress показывает значение атрибута ipaddress для каждой найденной ноды)․
Управление секретами через Data Bags
# Поиск элемента дата-бага 'credentials' для приложения 'myapp'
knife search credentials "id:myapp-prod" -F json Полезные флаги вывода (Output Formatting)
По умолчанию Knife выводит таблицу․ Для автоматизации и парсинга используйте:
-F json(или--format json) — вывод полного JSON․ Идеально дляjq․-i(или--id-only) — только имена (ID) объектов, по одному на строку․-a ATTR(или--attribute ATTR), показать значение конкретного атрибута (поддерживает вложенность через точку:-a kernel․machine)․-r(или--run-list) — показать run-list нод․
Пример для скриптов (Bash/JQ):
# Получить FQDN всех нод с ролью 'app' в JSON и извлечь их через jq
knife search node "role:app" -F json | jq -r '․rows[]․automatic․fqdn' Ограничения и нюансы
- Регистрозависимость: Имена полей (
key) и строковые значения в точном совпадении чувствительны к регистру․ Wildcard-поиск (*) в значениях обычно тоже регистрозависим в Elasticsearch, если не настроено иначе (стандартный анализатор Chef — keyword/exact)․ - Индексация не мгновенна: После конверджа ноды данные попадают в поисковый индекс с небольшой задержкой (обычно секунды)․
- Поля типа Array: Поиск по массивам (например,
recipesилиroles) работает как «содержит элемент»․ Запросrecipes:nginxнайдет ноду, у которой в run-list естьrecipe[nginx]․ - Производительность: Избегайте запросов с лидирующим wildcard (
:valueилиfield:suffix), они не используют индексы эффективно и нагружают Chef Server․ Старайтесь использовать префиксный поиск (field:prefix*)․
Knife search — это «швейцарский нож» администратора Chef Infra․ Понимание синтаксиса ключей, шаблонов (exact, wildcard, range, fuzzy), булевой логики и работы с выпрямленными (flattened) атрибутами позволяет решать задачи любой сложности: от простого «найди мне IP этого сервера» до построения динамических топологий кластеров внутри рецептов․
Освоив knife search, вы получаете полный контроль над данными своей инфраструктуры, хранящимися на Chef Infra Server․
Статья подготовлена на основе официальной документации Chef (docs․chef․io) для версии Chef Workstation 26+․ Дата актуальности информации: ․