Spec-Zone.ru › Chef 17

поиск с помощью knife

[редактировать на GitHub]

Индексы поиска позволяют выполнять запросы к любому типу данных, индексированному сервером Chef Infra Server, включая пакеты данных (и элементы пакетов данных), среды, узлы и роли. Определенный синтаксис запроса используется для поддержки шаблонов поиска, таких как точное совпадение, подстрока, диапазон и нечёткое соответствие. Поиск — это полнотекстовый запрос, который можно выполнить из нескольких мест, в том числе изнутри рецепта, с помощью подкоманды search в knife, метода search в языке Chef Infra, поля поиска в консоли управления 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-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 извлечёт эти вложенные поля на верхний уровень, сглаживая их в составные поля, которые поддерживают шаблоны поиска с подстрокой.

Комбинируя подстроки с шаблонами поиска диапазонов и запросами с подстроками, можно выполнять очень мощные поиски, такие как поиск поставщика части 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

Поиск по типу экземпляра

Чтобы найти тип экземпляра (flavour) всех узлов, работающих на платформе 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 в производственной среде, введите:

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

Spec-Zone.ru

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