Spec-Zone.ru › Chef 16

поиск ножа

[edit on GitHub]

Индексы поиска позволяют выполнять запросы к любому типу данных, индексированному сервером 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

Параметры

Примечание

Проверьте список общих параметров, доступных для этой (и всех) подкоманд и плагинов knife.

Эта подкоманда имеет следующие параметры:

-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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API