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 Server. Этот параметр использует тот же синтаксис, что и подкоманда 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/knife_search/

Spec-Zone.ru

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