Spec-Zone.ru › Chef 18

О поиске

[править на GitHub]

Индексы поиска позволяют выполнять запросы к любому типу данных, индексируемому сервером Chef Infra, включая пакеты данных (и элементы пакетов данных), среды, узлы и роли. Определенный синтаксис запросов поддерживает шаблоны поиска, такие как точное совпадение, подстановочные знаки, диапазон и приблизительное соответствие. Поиск — это полнотекстовый запрос, который можно выполнить из нескольких мест, включая рецепт, с помощью подкоманды search в knife, метода search в языке Chef Infra, поля поиска в консоли управления Chef и с помощью конечных точек /search или /search/INDEX в API сервера Chef Infra. Двигатель поиска основан на Elasticsearch и работает на сервере Chef Infra.

Многие примеры в этом разделе используют knife, но индексы поиска и синтаксис запросов поиска могут использоваться во многих местах, включая рецепты и при работе с API сервера Chef Infra.

Индексы поиска

Индекс поиска — это полнотекстовый список объектов, хранящихся на сервере Chef Infra, по которому можно выполнять поисковые запросы. Создаются следующие индексы поиска:

Имя индекса поиска Описание
client Клиент API
DATA_BAG_NAME Пакет данных — это глобальная переменная, хранящаяся в формате JSON и доступная с сервера Chef Infra. Имя индекса поиска соответствует имени пакета данных. Например, если имя пакета данных — «admins», то соответствующий поисковый запрос может выглядеть примерно так: search(:admins, "*:*").
environment Среда — это способ сопоставления реального рабочего процесса организации с тем, что можно настроить и управлять при использовании сервера Chef Infra.
node Узел — это любой сервер или виртуальный сервер, настроенный для обслуживания клиентом Chef Infra.
role Роль — это способ определения определенных шаблонов и процессов, которые существуют на узлах организации и относятся к одной и той же функции.

Использование Knife

Используйте подкоманду knife search для выполнения поискового запроса к информации, индексированной на сервере Chef Infra.

Поиск по идентификатору платформы

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

Синтаксис запроса

Поисковый запрос состоит из двух частей: ключа и шаблона поиска. Синтаксис поискового запроса следующий:

key:search_pattern

где key — имя поля, которое находится в JSON-описании индексируемого объекта на сервере Chef Infra (роль, узел, клиент, среда или пакет данных), а search_pattern определяет, что будет искаться, используя один из следующих шаблонов поиска: точное совпадение, подстановочные знаки, диапазон или неточные совпадения. И key, и search_pattern регистрозависимые; key имеет ограниченную поддержку поиска с подстановочными знаками по нескольким символам, используя звездочку («*») (при условии, что это не первый символ).

Примечание

Поисковые запросы не должны содержать символы новой строки.

Фильтрация результатов поиска

Используйте :filter_result в качестве части поискового запроса, чтобы отфильтровать выходные данные поиска на основе шаблона, заданного в Hash. Будут возвращены только атрибуты в Hash.

Синтаксис метода search, использующего :filter_result, следующий:

search(:index, 'query',
  filter_result: { 'foo' => [ 'abc' ],
                      'bar' => [ '123' ],
                      'baz' => %w(sea power),
                    }
).each do |result|
  puts result['foo']
  puts result['bar']
  puts result['baz']
end

где:

  • :index — имя индекса на сервере Chef Infra, по которому будет выполняться поисковый запрос: :client, :data_bag_name, :environment, :node, и :role
  • 'query' — допустимый поисковый запрос к объекту на сервере Chef
  • :filter_result — определяет Hash значений, которые должны быть возвращены

Например:

search(:node, 'role:web',
  filter_result: { 'name' => [ 'name' ],
                      'ip' => [ 'ipaddress' ],
                      'kernel_version' => %w(kernel version),
                    }
).each do |result|
  puts result['name']
  puts result['ip']
  puts result['kernel_version']
end

Ключи

Пара имя поля/описание доступна в объекте JSON. Используйте имя поля при поиске этой информации в объекте JSON. Можно искать любое поле, которое существует в любом JSON-описании для любой роли, узла, клиента Chef Infra, среды или пакета данных.

Вложенные поля

Вложенное поле появляется глубже в структуре данных JSON. Например, информация о сетевом интерфейсе может находиться на нескольких уровнях вглубь: node['network']['interfaces']['en1']. Когда вложенные поля присутствуют в структуре JSON, клиент Chef Infra извлечёт эти вложенные поля на верхний уровень, сглаживая их в составные поля, которые поддерживают шаблоны поиска с подстановочными знаками.

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

"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: точное совпадение, подстановочные знаки, диапазон и приблизительное соответствие.

Точное соответствие

Для поиска ключа с именем, точно соответствующим запросу, используется точное соответствие. Если имя ключа содержит пробелы, в шаблоне поиска должны использоваться кавычки, чтобы убедиться, что поисковый запрос находит ключ. Весь запрос также должен быть заключен в кавычки, чтобы предотвратить его интерпретацию 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

Цели

Целью поиска является любой объект, который был проиндексирован на сервере Chef Infra, включая роли (и списки выполнения), узлы, среды, пакеты данных и любые клиенты API.

Роли в списках выполнения

Можно выполнить поиск по ролям, которые находятся на верхнем уровне списка выполнения, а также по роли, которая является частью расширенного списка выполнения.

Примечание

Поле roles обновляется при каждом выполнении Chef Infra Client; изменения в списке выполнения не повлияют на roles до следующего выполнения Chef Infra Client на узле.
Расположение роли Описание

На верхнем уровне

Чтобы найти узел с ролью на верхнем уровне своего списка выполнения, выполните поиск в поле role (и экранируйте любые специальные символы символом косой черты) с помощью следующего синтаксиса:

role:ROLE_NAME

где role (единственное число!) обозначает список выполнения верхнего уровня.

Расширенный

Чтобы найти узел с ролью в расширенном списке выполнения, выполните поиск в поле roles (и экранируйте любые специальные символы символом косой черты) с помощью следующего синтаксиса:

roles:ROLE_NAME

где roles (множественное число!) обозначает расширенный список выполнения.

Чтобы выполнить поиск в списке выполнения верхнего уровня для роли с именем load_balancer, используйте подкоманду knife search из командной строки или метод search в рецепте. Например:

knife search node role:load_balancer

и изнутри рецепта:

search(:node, 'role:load_balancer')

Чтобы выполнить поиск в расширенном списке выполнения для всех узлов с ролью load_balancer, используйте подкоманду knife search из командной строки или метод search в рецепте. Например:

knife search node roles:load_balancer

и изнутри рецепта:

search(:node, 'roles:load_balancer')

Узлы

Узел может быть найден из рецепта с помощью следующего синтаксиса:

search(:node, "key:attribute")

Подстановка символов может быть использована для замены символов в поисковом запросе.

Расширенные списки ролей (все роли, которые применяются к узлу, включая вложенные роли) и рецепты к атрибутам роли и рецепта на узле сохраняются на сервере Chef Infra. Расширенные списки ролей позволяют искать на узлах, на которых выполняется данный рецепт, даже если этот рецепт включён ролью.

Примечание

Поле recipes обновляется при каждом выполнении Chef Infra Client; изменения в списке выполнения не повлияют на recipes до следующего выполнения Chef Infra Client на узле.
Расположение узла Описание

В указанном рецепте

Чтобы найти узел с указанным рецептом в списке выполнения, выполните поиск в поле run_list (и экранируйте все специальные символы символом косой черты) с помощью следующего синтаксиса:

search(:node, 'run_list:recipe\[foo\:\:bar\]')

где recipe (единственное число!) указывает на список выполнения верхнего уровня. Переменные могут быть интерполированы в строки поиска с использованием альтернативного синтаксиса цитирования Ruby:

search(:node, %Q{run_list:"recipe[#{the_recipe}]"} )

В развернутом списке выполнения

Чтобы найти узел с рецептом в развернутом списке выполнения, выполните поиск в поле recipes (и экранируйте все специальные символы символом косой черты) с помощью следующего синтаксиса:

recipes:RECIPE_NAME

где recipes (множественное число!) указывает на поиск в развернутом списке выполнения.

Если вы хотите просто использовать каждый результат поиска и не заботитесь о совокупном результате, вы можете предоставить блок кода методу поиска. Каждый результат затем передается в блок:

# Print every node matching the search pattern
search(:node, "*:*").each do |matching_node|
  puts matching_node.to_s
end

Клиенты API

Клиент API — это любое устройство, имеющее разрешение на использование API сервера Chef Infra для связи с сервером Chef Infra. Клиент API обычно является узлом (который выполняет Chef Infra Client) или рабочей станцией (которая выполняет knife), но также может быть любым другим устройством, настроенным для использования API сервера Chef Infra.

Иногда, когда роль не полностью определена (или реализована), может потребоваться, чтобы устройство подключалось к базе данных, поисковому движку или другому сервису в среде, используя настройки, расположенные на другом устройстве, например, имя хоста, IP-адрес или частный IP-адрес. Следующий пример показывает упрощенный файл настроек:

username: "mysql"
password: "MoveAlong"
host:     "10.40.64.202"
port:     "3306"

где host — частный IP-адрес сервера базы данных. Используйте следующую команду knife для просмотра информации об узле:

knife search node "name:name_of_database_server" --long

Для доступа к этим настройкам в рамках рецепта, который выполняется на веб-сервере, используйте код, похожий на:

db_server = search(:node, "name:name_of_database_server")
private_ip = "#{db_server[0][:rackspace][:private_ip]}"
puts private_ip

где «[0]» — индекс 0 (ноль) для идентификатора db_server. Возвращается один документ, поскольку поиск узла выполняется по его уникальному имени. Идентификатор private_ip теперь будет содержать значение частного IP-адреса сервера базы данных (10.40.64.202) и может затем использоваться в шаблонах в качестве переменной, помимо других возможных применений.

Среды

Среда — это способ сопоставления реального рабочего процесса организации с тем, что может быть настроено и управляемо при использовании Chef Infra. Это сопоставление выполняется путем задания атрибутов и привязки кулинарных книг на уровне среды. С помощью сред вы можете изменять конфигурации кулинарных книг в зависимости от назначения системы. Например, назначив разные среды этапа тестирования и производства, вы можете определить правильный URL-адрес сервера базы данных для каждой среды. Среды также позволяют организациям уверенно переносить новые версии кулинарных книг из этапа тестирования в производство, пропуская их через тестовые среды, прежде чем запускать в производство.

При поиске среда — это атрибут. Это позволяет ограничить результаты поиска заданной средой, используя булевы операторы и дополнительные поисковые термины. Например, для использования knife для поиска всех серверов, работающих под CentOS в среде с именем «QA», введите следующее:

knife search node "chef_environment:QA AND platform:centos"

Или, чтобы включить тот же поиск в рецепте, используйте блок кода, похожий на:

qa_nodes = search(:node, 'chef_environment:QA')
qa_nodes.each do |qa_node|
    # Do useful work specific to qa nodes only
end

Папки данных

Папки данных хранят глобальные переменные в формате JSON. Папки данных индексируются для поиска и могут загружаться кулинарной книгой или использоваться во время поиска.

Любой поиск в папке данных (или элемента папки данных) должен указать имя папки данных, а затем предоставить строку запроса поиска, которая будет использоваться во время поиска. Например, для использования knife для поиска в папке данных с именем «admin_data» по всем элементам, кроме элемента «admin_users», введите следующее:

knife search admin_data "(NOT id:admin_users)"

Или, чтобы включить тот же поисковый запрос в рецепте, используйте блок кода, похожий на:

search(:admin_data, 'NOT id:admin_users')

Возможно, не будет известно, какие элементы папки данных понадобятся. Может потребоваться загрузить все элементы в папку данных (но не знать, что такое «все»). Использование поискового запроса является идеальным способом справиться с этой неопределенностью, но при этом гарантировать, что все необходимые данные будут возвращены. Следующие примеры показывают, как рецепт может использовать серию поисковых запросов для поиска в папке данных с именем «admins». Например, для поиска каждого администратора:

search(:admins, '*:*')

Или для поиска администратора с именем «charlie»:

search(:admins, 'id:charlie')

Или для поиска администратора с идентификатором группы «ops»:

search(:admins, 'gid:ops')

Или для поиска администратора, имя которого начинается с буквы «c»:

search(:admins, 'id:c*')

Элементы папки данных, возвращаемые поисковым запросом, могут использоваться как хэш. Например:

charlie = search(:admins, 'id:charlie').first
# => variable 'charlie' is set to the charlie data bag item
charlie['gid']
# => "ops"
charlie['shell']
# => "/bin/zsh"

Следующий рецепт может использоваться для создания пользователя для каждого администратора путем загрузки всех элементов из папки данных «admins», циклирования по каждому администратору в папке данных и создания ресурса пользователя, чтобы каждый из этих администраторов существовал:

admins = data_bag('admins')

admins.each do |login|
  admin = data_bag_item('admins', login)
  home = "/home/#{login}"

  user(login) do
    uid       admin['uid']
    gid       admin['gid']
    shell     admin['shell']
    comment   admin['comment']
    home      home
    manage_home true
  end
end

И затем тот же рецепт, измененный для загрузки администраторов с помощью поискового запроса (и использования массива для хранения результатов поискового запроса):

admins = []

search(:admins, '*:*').each do |admin|
  login = admin['id']

  admins << login

  home = "/home/#{login}"

  user(login) do
    uid       admin['uid']
    gid       admin['gid']
    shell     admin['shell']
    comment   admin['comment']

    home      home
    manage_home true
  end
end

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

Spec-Zone.ru

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