поиск ножа
Индексы поиска позволяют выполнять запросы к любому типу данных, индексированному сервером Chef Infra Server, включая пакеты данных (и элементы пакетов данных), среды, узлы и роли. Определённый синтаксис запросов поддерживает шаблоны поиска, такие как точное соответствие, подстроки, диапазон и приблизительное соответствие. Поиск — это полнотекстовый запрос, который можно выполнить из нескольких мест, включая рецепт, с помощью подкоманды search в knife, метода search в DSL-синтаксисе рецептов, поля поиска в консоли управления Chef и с помощью конечных точек /search или /search/INDEX API сервера Chef Infra Server. Двигатель поиска основан на Elasticsearch и выполняется на сервере Chef Infra Server.
Используйте подкоманду knife search для выполнения запроса поиска по информации, индексированной на сервере Chef Infra Server.
Синтаксис
Эта подкоманда имеет следующий синтаксис:
knife search INDEX SEARCH_QUERY
где INDEX — это client, environment, node, role, или имя пакета данных, а SEARCH_QUERY — это синтаксис запроса поиска для запроса, который будет выполнен.
INDEX подразумевается, если его не указать, и будет по умолчанию равно node. Например:
knife search '*:*' -i
вернёт результат, похожий на:
8 items found
centos-62-dev
opensuse-15
ubuntu-1604-dev
ubuntu-1804-orgtest
ubuntu-1804-ohai-test
ubuntu-1804-ifcfg-test
ohai-test
win2k19-dev
и является эквивалентным запросу:
knife search node '*:*' -i
Если SEARCH_QUERY не содержит двоеточие (:), то шаблон запроса по умолчанию — tags:*#{@query}* OR roles:*#{@query}* OR fqdn:*#{@query}* OR addresses:*#{@query}*, что означает, что следующие два запроса поиска фактически эквивалентны:
knife search ubuntu
или:
knife search node "tags:*ubuntu* OR roles:*ubuntu* OR fqdn:*ubuntu* (etc.)"
Синтаксис запроса
Запрос поиска состоит из двух частей: ключа и шаблона поиска. Запрос поиска имеет следующий синтаксис:
key:search_pattern
где key — это имя поля, которое находится в описании JSON индексируемого объекта на сервере Chef Infra Server (роль, узел, клиент, среда или пакет данных), а search_pattern определяет, что будет искаться, используя один из следующих шаблонов поиска: точное соответствие, подстроки, диапазон или приблизительное соответствие. И key, и search_pattern чувствительны к регистру; key имеет ограниченную поддержку подстрок с несколькими символами, используя звездочку (*) (и если она не является первым символом).
Ключи
Пара имя поля/описание доступна в объекте JSON. Используйте имя поля при поиске этой информации в объекте JSON. Можно искать в любом поле, которое существует в любом описании JSON для любой роли, узла, клиента Chef Infra, среды или пакета данных.
Чтобы найти доступные поля для конкретного объекта, используйте аргумент show с любой из следующих подкоманд knife: knife client, knife data bag, knife environment, knife node, или knife role. Например: knife data bag show.
Вложенные поля
Вложенное поле появляется глубже в структуре данных JSON. Например, информация о сетевом интерфейсе может находиться на нескольких уровнях вложенности: node['network']['interfaces']['en1']. Когда вложенные поля присутствуют в структуре JSON, Chef Infra Client извлекает эти вложенные поля на верхнем уровне, делая их составными полями, которые поддерживают шаблоны поиска по подстрокам.
Комбинируя подстроки с шаблонами диапазона и подстроками, можно выполнять очень мощные поиски, например, используя vendor (производителя) части MAC-адреса, чтобы найти все узлы, у которых сетевая карта сделана указанным производителем.
Рассмотрим следующий фрагмент данных JSON:
{"network":
[
//snipped...
"interfaces",
{"en1": {
"number": "1",
"flags": [
"UP",
"BROADCAST",
"SMART",
"RUNNING",
"SIMPLEX",
"MULTICAST"
],
"addresses": {
"fe80::fa1e:dfff:fed8:63a2": {
"scope": "Link",
"prefixlen": "64",
"family": "inet6"
},
"f8:1e:df:d8:63:a2": {
"family": "lladdr"
},
"192.0.2.0": {
"netmask": "255.255.255.0",
"broadcast": "192.168.0.255",
"family": "inet"
}
},
"mtu": "1500",
"media": {
"supported": {
"autoselect": {
"options": [
]
}
},
"selected": {
"autoselect": {
"options": [
]
}
}
},
"type": "en",
"status": "active",
"encapsulation": "Ethernet"
},
//snipped...
Перед индексированием этих данных на сервере Chef Infra Server, вложенные поля извлекаются на верхний уровень, подобно:
"broadcast" => "192.168.0.255",
"flags" => ["UP", "BROADCAST", "SMART", "RUNNING", "SIMPLEX", "MULTICAST"]
"mtu" => "1500"
что позволяет выполнять такие поиски, чтобы найти данные, присутствующие в этом узле:
node "broadcast:192.168.0.*"
или:
node "mtu:1500"
или:
node "flags:UP"
Эти данные также сглаживаются в различные составные поля, которые следуют той же схеме, что и иерархия JSON, и используют символы подчеркивания (_) для разделения уровней данных, подобно:
# ...snip...
"network_interfaces_en1_addresses_192.0.2.0_broadcast" => "192.168.0.255",
"network_interfaces_en1_addresses_fe80::fa1e:tldr_family" => "inet6",
"network_interfaces_en1_addresses" => ["fe80::fa1e:tldr","f8:1e:df:tldr","192.0.2.0"]
# ...snip...
что позволяет выполнять такие поиски, чтобы найти данные, присутствующие в этом узле:
node "network_interfaces_en1_addresses:192.0.2.0"
Эта сглаженная структура данных также поддерживает использование составных полей подстроки, которые позволяют выполнять поиски, опуская уровни в структуре данных JSON, которые не важны для запроса поиска. В следующем примере звездочка (*) используется для обозначения места, где может существовать подстрока при поиске вложенного поля:
"network_interfaces_*_flags" => ["UP", "BROADCAST", "SMART", "RUNNING", "SIMPLEX", "MULTICAST"]
"network_interfaces_*_addresses" => ["fe80::fa1e:dfff:fed8:63a2", "192.0.2.0", "f8:1e:df:d8:63:a2"]
"network_interfaces_en0_media_*" => ["autoselect", "none", "1000baseT", "10baseT/UTP", "100baseTX"]
"network_interfaces_en1_*" => ["1", "UP", "BROADCAST", "SMART", "RUNNING", "SIMPLEX", "MULTICAST",
"fe80::fa1e:dfff:fed8:63a2", "f8:1e:df:d8:63:a2", "192.0.2.0",
"1500", "supported", "selected", "en", "active", "Ethernet"]
Для каждого из примеров подстроки выше, возможные значения показаны в скобках. При выполнении запроса поиска, синтаксис запроса для подстрок — это просто опустить имя узла (сохранив подчеркивания), подобно:
network_interfaces__flags
Этот запрос будет искать внутри узла flags, внутри структуры JSON, для каждого из UP, BROADCAST, SMART, RUNNING, SIMPLEX, и MULTICAST.
Примеры
Чтобы увидеть доступные ключи для узла, введите следующее (для узла с именем staging):
knife node show staging -Fj | less
чтобы вернуть полное JSON-описание узла и просмотреть доступные ключи, на основе которых можно составлять запросы поиска.
Чтобы использовать знак вопроса (?) для замены одного символа в поиске по подстроке, введите следующее:
knife search node 'platfor?:ubuntu'
Чтобы использовать звездочку (*) для замены нуля (или более) символов в поиске по подстроке, введите следующее:
knife search node 'platfo*:ubuntu'
Чтобы найти все IP-адреса, находящиеся в одной сети, введите следующее:
knife search node 'ipaddress:192.168*'
где 192.168* — это сетевой адрес, для которого будет выполнен поиск.
Чтобы использовать поиск по диапазону для поиска IP-адресов в подсети, введите следующее:
knife search node 'ipaddress:[192.168.0.* TO 192.0.2.*]'
где 192.168.0.* TO 192.0.2.* определяет диапазон подсети.
О шаблонах
Шаблон поиска — это способ уточнения результатов поиска, возвращая все, что соответствует какому-то типу неполного запроса поиска. Существует четыре типа шаблонов поиска, которые можно использовать при поиске в индексах поиска на сервере Chef Infra Server: точное соответствие, подстроки, диапазон и приблизительное соответствие.
Точное соответствие
Шаблон поиска точного соответствия используется для поиска ключа с именем, которое точно соответствует запросу поиска. Если имя ключа содержит пробелы, в шаблоне поиска необходимо использовать кавычки, чтобы убедиться, что запрос поиска находит ключ. Весь запрос также должен быть заключён в кавычки, чтобы предотвратить его интерпретацию оболочкой Ruby или командной строки. Лучший способ обеспечить последовательное использование кавычек — это заключить весь запрос в одинарные кавычки (' ') и шаблон поиска в двойные кавычки (" ").
Чтобы выполнить поиск в определённом пакете данных для определённого элемента пакета данных, введите следующее:
knife search admins 'id:charlie'
где admins — имя пакета данных, а charlie — имя элемента пакета данных. Будет возвращён результат, похожий на следующий:
1 items found
_rev: 1-39ff4099f2510f477b4c26bef81f75b9
chef_type: data_bag_item
comment: Charlie the Unicorn
data_bag: admins
gid: ops
id: charlie
shell: /bin/zsh
uid: 1005
Чтобы выполнить поиск в определённом пакете данных, используя строку для поиска любого соответствующего элемента пакета данных, введите следующее:
knife search admins 'comment:"Charlie the Unicorn"'
где admins — имя пакета данных, а Charlie the Unicorn — строка, которая будет использована при поиске. Будет возвращён результат, похожий на следующий:
1 items found
_rev: 1-39ff4099f2510f477b4c26bef81f75b9
chef_type: data_bag_item
comment: Charlie the Unicorn
data_bag: admins
gid: ops
id: charlie
shell: /bin/zsh
uid: 1005
Поиск по подстрокам
Шаблон поиска по подстрокам используется для запроса совпадений подстрок, которые заменяют ноль (или более) символов в шаблоне поиска чем-угодно, что могло бы совпасть с заменённым символом. Существует два типа поиска по подстрокам:
- Знак вопроса (
?) может использоваться для замены ровно одного символа (при условии, что этот символ не является первым символом в шаблоне поиска) - Звездочка (
*) может использоваться для замены любого количества символов (включая ноль)
Чтобы выполнить поиск по любому узлу, содержащему указанный ключ, введите следующее:
knife search node 'foo:*'
где foo — имя узла.
Чтобы выполнить поиск по узлу с частичным именем, введите одно из следующих:
knife search node 'name:app*'
или:
knife search node 'name:app1*.example.com'
или:
knife search node 'name:app?.example.com'
или:
knife search node 'name:app1.example.???'
чтобы вернуть app1.example.com (и любой другой узел, который соответствует любому из строковых поисков выше).
Поиск по диапазону
Шаблон поиска по диапазону используется для запроса значений, которые находятся в диапазоне, определённом верхними и нижними границами. Шаблон поиска по диапазону может быть включительным или исключительным для границ. Использование квадратных скобок ("[ ]") для обозначения включительных границ и фигурных скобок ("{ }") для обозначения исключительных границ и со следующим синтаксисом:
boundary TO boundary
где TO обязательно (и должно быть заглавным).
Пакет данных с именем sample содержит четыре элемента пакета данных: abc, bar, baz, и quz. Все элементы между bar и foo, включая, могут быть найдены с помощью включительного шаблона поиска.
Чтобы выполнить поиск с использованием включительного диапазона, введите следующее:
knife search sample "id:[bar TO foo]"
где используются квадратные скобки ([ ]).
Пакет данных с именем sample содержит четыре элемента пакета данных: abc, bar, baz, и quz. Все элементы, исключающие bar и foo, могут быть найдены с помощью исключительного шаблона поиска.
Чтобы выполнить поиск с использованием исключительного диапазона, введите следующее:
knife search sample "id:{bar TO foo}"
где используются фигурные скобки ({ }).
Приблизительное соответствие
Поиск с размытым соответствием используется для поиска на основе близости двух строк символов. (Необязательное) целое число может быть использовано в качестве части запроса поиска для более точного определения близости. Узор поиска с размытым соответствием имеет следующий синтаксис:
"search_query"~edit_distance
где search_query — строка, которая будет использоваться во время поиска, а edit_distance — близость. Тильда ("~") используется для разделения расстояния редактирования и запроса поиска.
Для использования поиска с размытым соответствием введите что-то подобное:
knife search client "name:boo~"
где boo~ определяет шаблон поиска с размытым соответствием. Это вернёт что-то подобное:
{
"total": 1,
"start": 0,
"rows": [
{
"public_key": "too long didn't read",
"name": "foo",
"_rev": "1-f11a58043906e33d39a686e9b58cd92f",
"json_class": "Chef::ApiClient",
"admin": false,
"chef_type": "client"
}
]
}
Операторы
Оператор может использоваться для обеспечения включения определённых терминов в результаты, исключения их из результатов или исключения их, даже если другие аспекты запроса совпадают. Поиск может использовать следующие операторы:
| Оператор | Описание |
|---|---|
AND |
Используется для поиска совпадения, когда оба термина существуют. |
OR |
Используется для поиска совпадения, если существует любой термин. |
NOT |
Используется для исключения термина после NOT из результатов поиска. |
Операторы должны быть ВСЕМИ ЗАГЛАВНЫМИ буквами. Скобки могут быть использованы для группировки фрагментов и для формирования подзапросов.
Предупреждение
Использование AND NOT вместе может привести к ошибке. Например:
ERROR: knife search failed: invalid search query:
'datacenter%3A123%20AND%20NOT%20hostname%3Adev-%20AND%20NOT%20hostanem%3Asyslog-'
Parse error at offset: 38 Reason: Expected one of \ at line 1, column 42 (byte 42) after AND
Используйте - вместо NOT. Например:
knife search sample "id:foo AND -id:bar"
И
Для объединения запросов с помощью булевого оператора AND введите следующее:
knife search sample "id:b* AND animal:dog"
чтобы получить что-то вроде:
{
"total": 1,
"start": 0,
"rows": [
{
"comment": "an item named baz",
"id": "baz",
"animal": "dog"
}
]
}
Или, чтобы найти все компьютеры, работающие на платформе Microsoft Windows, которые связаны с ролью под названием jenkins, введите:
knife search node 'platform:windows AND roles:jenkins'
чтобы получить что-то вроде:
2 items found
Node Name: windows-server-2012r2.domain.com
Environment: _default
FQDN: windows-server-2012r2
IP: 0000::0000:0000:0000:0000
Run List: role[jenkins-windows]
Roles: jenkins-windows, jenkins
Recipes: jenkins-client::windows, jenkins::node_windows
Platform: windows 6.3.9600
Tags:
Node Name: 123-windows-2012r2-amd64-builder
Environment: _default
FQDN: ABC-1234567890AB
IP: 123.45.6.78
Run List: role[123-windows-2012r2-amd64-builder]
Roles: 123-windows-2012r2-amd64-builder, jenkins
Recipes: jenkins::node_windows, git_windows
Platform: windows 6.3.9600
Tags:
НЕ
Для отрицания результатов поиска, используя булев оператор NOT, введите следующее:
knife search sample "(NOT id:foo)"
чтобы получить что-то вроде:
{
"total": 4,
"start": 0,
"rows": [
{
"comment": "an item named bar",
"id": "bar",
"animal": "cat"
},
{
"comment": "an item named baz",
"id": "baz"
"animal": "dog"
},
{
"comment": "an item named abc",
"id": "abc",
"animal": "unicorn"
},
{
"comment": "an item named qux",
"id": "qux",
"animal", "penguin"
}
]
}
ИЛИ
Для объединения запросов с помощью булевого оператора OR введите следующее:
knife search sample "id:foo OR id:abc"
чтобы получить что-то вроде:
{
"total": 2,
"start": 0,
"rows": [
{
"comment": "an item named foo",
"id": "foo",
"animal": "pony"
},
{
"comment": "an item named abc",
"id": "abc",
"animal": "unicorn"
}
]
}
Специальные символы
Специальный символ может быть использован для точной настройки запроса поиска и повышения точности результатов поиска. Следующие символы могут быть включены в синтаксис запроса поиска, но каждый символ должен быть экранирован обратной косой чертой (\), также (/) должны быть экранированы от Elasticsearch:
+ - && | | ! ( ) { } [ ] ^ " ~ * ? : \ /
Например:
\(1\+1\)\:2
Параметры
Примечание
Эта подкоманда имеет следующие параметры:
-
-a ATTR,--attribute ATTR Атрибут (или атрибуты) для отображения.
-
-b ROW,--start ROW Строка, с которой начинаются возвращаемые результаты.
-
-f FILTER,--filter-result FILTER Используется для фильтрации выходных данных поиска на основе шаблона, соответствующего указанному
FILTER. Будут возвращены только атрибуты вFILTER. Например:\"ServerName=name, Kernel=kernel.version\.-
-i,--id-only Отобразить только соответствующие идентификаторы объектов.
INDEXИмя индекса, который будет запрошен:
client,environment,node,role, илиDATA_BAG_NAME. По умолчанию индекс:node.-
-l,--long Отобразить все атрибуты в выводе и отобразить вывод как JSON.
-
-m,--medium Отобразить обычные атрибуты в выводе и отобразить вывод как JSON.
-
-q SEARCH_QUERY,--query SEARCH_QUERY Защитить запросы поиска, начинающиеся с тире (-). Запрос
-qможет быть указан в качестве аргумента или опции, но не в обоих форматах.-
-r,--run-list Отобразить только список выполнения.
-
-R INT,--rows INT Количество строк, которые должны быть возвращены.
SEARCH_QUERYЗапрос поиска, используемый для определения списка элементов на сервере Chef Infra. Этот параметр использует тот же синтаксис, что и подкоманда
search.
Примеры
Следующие примеры демонстрируют, как использовать эту подкоманду knife:
Поиск по идентификатору платформы
Чтобы найти идентификаторы всех узлов, работающих на платформе Amazon EC2, введите:
knife search node 'ec2:*' -i
чтобы получить что-то вроде:
4 items found
ip-0A7CA19F.ec2.internal
ip-0A58CF8E.ec2.internal
ip-0A58E134.ec2.internal
ip-0A7CFFD5.ec2.internal
Поиск по типу экземпляра
Чтобы найти тип экземпляра (размер) всех узлов, работающих на платформе Amazon EC2, введите:
knife search node 'ec2:*' -a ec2.instance_type
чтобы получить что-то вроде:
4 items found
ec2.instance_type: m1.large
id: ip-0A7CA19F.ec2.internal
ec2.instance_type: m1.large
id: ip-0A58CF8E.ec2.internal
ec2.instance_type: m1.large
id: ip-0A58E134.ec2.internal
ec2.instance_type: m1.large
id: ip-0A7CFFD5.ec2.internal
Поиск по рецепту
Для поиска рецептов, используемых узлом, используйте атрибут recipes для поиска имён рецептов, введите что-то вроде:
knife search node 'recipes:recipe_name'
или:
knife search node '*:*' -a recipes | grep 'recipe_name'
Поиск по кулинарной книге, затем по рецепту
Чтобы найти кулинарные книги на узле, используйте атрибут recipes и шаблон cookbook::recipe, экранируя оба символа :. Например:
knife search node 'recipes:cookbook_name\:\:recipe_name'
Поиск по узлу
Чтобы найти все узлы, работающие под Ubuntu, введите:
knife search node 'platform:ubuntu'
Поиск по узлу и среде
Чтобы найти все узлы, работающие под CentOS в среде production, введите:
knife search node 'chef_environment:production AND platform:centos'
Поиск вложенных атрибутов
Чтобы найти вложенный атрибут, используйте шаблон, аналогичный следующему:
knife search node <query_to_run> -a <main_attribute>.<nested_attribute>
Поиск по нескольким атрибутам
Для построения запроса поиска, использующего несколько атрибутов, используйте подчёркивание (_) для разделения каждого атрибута. Например, следующий запрос найдет все узлы, работающие с определенной версией Ruby:
knife search node "languages_ruby_version:2.7.0"
Поиск вложенных атрибутов с помощью запроса поиска
Чтобы создать запрос поиска, который может найти вложенный атрибут:
knife search node name: <node_name> -a kernel.machine
Использование тестового запроса
Для проверки запроса поиска, который будет использоваться в подкоманде knife ssh:
knife search node "role:web NOT name:web03"
где запрос в предыдущем примере ищет все серверы, имеющие роль web, но не на сервере с именем web03.
© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/workstation/knife_search/