Spec-Zone.ru › Chef 18

Настройка узла

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

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

  • Запустите команду knife bootstrap с рабочей станции.
  • Выполните установку без участия человека для настройки с самого узла, без необходимости подключения SSH или WinRM.

На следующей схеме показаны этапы операции настройки, а список ниже схемы подробно описывает каждый из этих этапов.

image

Во время операции настройки knife bootstrap, происходит следующее:

Этапы Описание
knife bootstrap Выполните подкоманду knife bootstrap с рабочей станции. Укажите имя хоста, IP-адрес или полное доменное имя целевого узла в этой команде. Knife установит соединение SSH или WinRM с целевой системой и запустит скрипт настройки.

Получение скрипта установки от Chef

Скрипт оболочки запросит на веб-сайте Chef последнюю версию скрипта установки Chef Infra Client (install.sh или install.ps1).

Получение пакета Chef Infra Client от Chef Скрипт установки собирает информацию, специфичную для системы, определяет правильный пакет для Chef Infra Client и загружает соответствующий пакет с omnitruck-direct.chef.io.
Установка Chef Infra Client Chef Infra Client устанавливается на целевой узел с использованием системного пакета (.rpm, .msi и т. д.).

Запуск выполнения Chef Infra Client

На машинах на базе UNIX и Linux: второй скрипт оболочки выполняет двоичный файл chef-client с набором начальных настроек, сохраненных в first-boot.json на узле. first-boot.json генерируется с рабочей станции как часть начальной подкоманды knife bootstrap.

На машинах Microsoft Windows: пакетный файл, полученный из шаблона bootstrap-windows-chef-client-msi.erb, выполняет двоичный файл chef-client с набором начальных настроек, сохраненных в first-boot.json на узле. first-boot.json генерируется с рабочей станции как часть начальной подкоманды knife bootstrap.

Завершение выполнения Chef Infra Client

Выполнение Chef Infra Client продолжается с использованием HTTPS (порт 443) и регистрирует узел на сервере Chef Infra.

Первый запуск Chef Infra Client по умолчанию содержит пустой список задач. Список задач можно указать в рамках начальной операции настройки с помощью параметра --run-list в рамках подкоманды knife bootstrap.

knife bootstrap

Команда knife bootstrap — распространенный способ установки Chef Infra Client на узел. По умолчанию этот подход предполагает, что узел может получить доступ к сайту Chef, чтобы загрузить пакет Chef Infra Client из этого места.

Установка Chef Infra Client обнаружит версию операционной системы и затем установит соответствующую версию Chef Infra Client с помощью одной команды для установки Chef Infra Client и всех его зависимостей, включая встроенную версию Ruby, OpenSSL, парсеры, библиотеки и утилиты командной строки.

Установка Chef Infra Client помещает все в уникальный каталог (/opt/chef/), чтобы Chef Infra Client не конфликтовал с другими приложениями, которые могут работать на целевой машине. После установки Chef Infra Client требуется несколько дополнительных шагов настройки перед выполнением первого запуска Chef Infra Client на узле.

Выполнение команды настройки

Подкоманда knife bootstrap используется для выполнения операции настройки, устанавливающей Chef Infra Client на целевой узел. Следующие шаги описывают, как настроить узел с помощью knife.

  1. Определите полное доменное имя (FQDN) или IP-адрес целевого узла. Команда knife bootstrap требует FQDN или IP-адрес узла для завершения операции настройки.

  2. После настройки рабочей машины ее можно использовать для установки Chef Infra Client на один (или несколько) узлов в организации с помощью операции настройки knife bootstrap. Команда knife bootstrap используется для подключения SSH к целевой машине, а затем выполняется необходимое для запуска Chef Infra Client на узле. Она установит исполняемый файл Chef Infra Client (при необходимости), сгенерирует ключи и зарегистрирует узел на сервере Chef Infra. Для операции настройки требуется IP-адрес или FQDN целевой системы, учетные данные SSH (имя пользователя, пароль или идентификационный файл) для учетной записи с правами root на узле и (если операционная система не Ubuntu, что является стандартным дистрибутивом, используемым knife bootstrap), операционная система, работающая на целевой системе.

    В окне командной строки введите следующее:

    knife bootstrap 172.16.1.233 -U USERNAME --sudo
    

    где 172.16.1.233 — IP-адрес или полное доменное имя узла, USERNAME — имя пользователя, которое вы хотите использовать для подключения, а --sudo указывает на повышение привилегий с помощью команды sudo в системах на базе UNIX.

    Во время выполнения операции настройки в окне командной строки будет отображаться что-то подобное:

    Enter password for ubuntu@172.16.1.233:
    
    Connecting to 172.16.1.233
    Performing legacy client registration with the validation key at /Users/USERNAME/.chef/validator.pem...
    Delete your validation key in order to use your user credentials for client registration instead.
    Bootstrapping 172.16.1.233
    [172.16.1.233] -----> Installing Chef Omnibus (stable/16)
    downloading https://omnitruck.chef.io/chef/install.sh
    [172.16.1.233]   to file /tmp/install.sh.1624/install.sh
    [172.16.1.233] trying wget...
    [172.16.1.233] ubuntu 20.04 aarch64
    [172.16.1.233] Getting information for chef stable 16 for ubuntu...
    [172.16.1.233] downloading https://omnitruck.chef.io/stable/chef/metadata?v=16&p=ubuntu&pv=20.04&m=aarch64
      to file /tmp/install.sh.1628/metadata.txt
    [172.16.1.233] trying wget...
    [172.16.1.233] sha1  8d89f8ac2e7f52d170be8ec1c2a028a6449d7e3a
    sha256  85cc73bed06e8d6699fc5c0b26c20d2837bf03831873444febccfc8bfa561f00
    url  https://packages.chef.io/files/stable/chef/16.1.16/ubuntu/20.04/chef_16.1.16-1_arm64.deb
    version  16.1.16
    [172.16.1.233]
    [172.16.1.233] downloaded metadata file looks valid...
    [172.16.1.233] downloading https://packages.chef.io/files/stable/chef/16.1.16/ubuntu/20.04/chef_16.1.16-1_arm64.deb
      to file /tmp/install.sh.1628/chef_16.1.16-1_arm64.deb
    [172.16.1.233] trying wget...
    [172.16.1.233] Comparing checksum with sha256sum...
    [172.16.1.233] Installing chef 16
    installing with dpkg...
    [172.16.1.233] Selecting previously unselected package chef.
    [172.16.1.233] (Reading database ... 99114 files and directories currently installed.)
    [172.16.1.233] Preparing to unpack .../chef_16.1.16-1_arm64.deb ...
    [172.16.1.233] Unpacking chef (16.1.16-1) ...
    [172.16.1.233] Setting up chef (16.1.16-1) ...
    [172.16.1.233] Thank you for installing Chef Infra Client! For help getting started visit https://learn.chef.io
    [172.16.1.233] Starting the first Chef Infra Client Client run...
    [172.16.1.233] +---------------------------------------------+
    ✓ 2 product licenses accepted.
    +---------------------------------------------+
    [172.16.1.233] Starting Chef Infra Client, version 16.1.16
    [172.16.1.233] [2020-06-08T23:49:10+00:00] ERROR: shard_seed: Failed to get dmi property serial_number: is dmidecode installed?
    [172.16.1.233] Creating a new client identity for name_of_node using the validator key.
    [172.16.1.233] resolving cookbooks for run list: []
    [172.16.1.233] Synchronizing Cookbooks:
    [172.16.1.233] Installing Cookbook Gems:
    [172.16.1.233] Compiling Cookbooks...
    [172.16.1.233] [2020-06-08T23:49:17+00:00] WARN: Node name_of_node has an empty run list.
    [172.16.1.233] Converging 0 resources
    [172.16.1.233]
    [172.16.1.233] Running handlers:
    [172.16.1.233] Running handlers complete
    [172.16.1.233] Chef Infra Client finished, 0/0 resources updated in 11 seconds
    
  3. После завершения операции настройки убедитесь, что узел распознается сервером Chef Infra. Чтобы отобразить только узел, который был только что настроен, выполните следующую команду:

    knife client show NAME_OF_NODE
    

    где NODE_NAME — имя узла, который был только что настроен. Сервер Chef Infra вернет что-то подобное:

    admin: false
    chef_type: client
    name:  NODE_NAME
    validator: false
    

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

    knife client list
    

    Сервер Chef Infra вернет что-то подобное:

    workstation1
    workstation2
    ...
    client1
    client2
    

Бесключевые и устаревшие валидаторные операции настройки

Рекомендуется использовать «бесключевую настройку» для аутентификации новых узлов на сервере Chef Infra.

Предыдущий процесс настройки узлов на основе валидатора Chef Infra полагался на использование общего «валидаторного» ключа во всей организации для аутентификации новых узлов на сервере Chef Infra.

Недостатки устаревшего процесса валидатора:

  • Все пользователи используют один и тот же ключ для настройки новых систем.
  • Обмен ключами затрудняет их обновление, если они скомпрометированы или сотрудник уходит из организации.

«Бесключевая настройка» генерирует ключ для каждого узла, который затем передается на новый узел и используется для аутентификации на сервере Chef Infra вместо использования общего «валидаторного» ключа.

Процесс настройки Chef Infra по умолчанию бесключевой. Если во время настройки вы получите предупреждение о том, что ключ валидатора используется, удалите конфигурацию для этого устаревшего режима настройки. Отредактируйте файл config.rb (knife.rb) и удалите все записи validation_key или validation_client_name.

Настройка с использованием chef-vault

Используйте следующие параметры с бесключевой настройкой для указания элементов, хранящихся в chef-vault:

--bootstrap-vault-file VAULT_FILE

Путь к файлу JSON, содержащему список хранилищ и элементов, которые нужно обновить.

--bootstrap-vault-item VAULT_ITEM

Одно хранилище и элемент для обновления как vault:item.

--bootstrap-vault-json VAULT_JSON

Строка JSON, содержащая список хранилищ и элементов, которые нужно обновить. –bootstrap-vault-json ‘{ “vault1”: [“item1”, “item2”], “vault2”: “item2” }’

Примеры

Параметры --bootstrap-vault-* добавляют идентификатор клиента узла настройки в список разрешений указанного элемента хранилища. Это позволяет новому клиенту Chef Infra Client считывать элементы из хранилища. Одновременно только один клиент имеет разрешение на доступ к хранилищу. (Параметр поиска -S с подкомандой knife vault create делает то же самое.)

Восстановление элемента пакета данных

Следующий пример демонстрирует, как восстановить элемент пакета данных:

knife vault delete sea power
Do you really want to delete sea/power? (Y/N) Y
Deleted chef_vault_item[sea/power]

echo "{\"some\":\"content for them\"}" > sea-power-content.json

cat sea-power-content.json
{"some":"content for them"}

knife vault create sea power -M client -A sean_horn,angle -J sea-power-content.json

Нет клиентов, так как параметр -S не был указан при создании хранилища.

В настоящее время только пользователи sean_horn и angle имеют разрешение на чтение и управление хранилищем.

knife vault show sea power  --mode client -p all
admins:
  sean_horn
  angle
clients:
id: power
search_query:
some:  content for them

Это определенно зашифрованный пакет данных, видите?

knife data_bag show sea power
WARNING: Encrypted data bag detected, but no secret provided for decoding. Displaying encrypted data.
id: power
some:
cipher:  aes-256-cbc
encrypted_data: c7Axnyg+1KDxBPOZdYN9QuIYx6dmSmK70unAQbn12Lygvsv2g9DPJJbueXVh
+yxL
iv: ONoVR7OjPZiAzaqOZ30bjg==
version: 1

Использование –bootstrap-vault-file

Сначала выполните шаг восстановления sea:power выше, чтобы увидеть разницу в разрешениях хранилища.

echo "{\"sea\":\"power\"}" > sea-power-bootstrap-vault-file.json

knife bootstrap localhost -p 2200 -N ubuntu-20.04 -r 'role[group1]' --connection-user vagrant --sudo --bootstrap-vault-file sea-power-bootstrap-vault-file.json
Node ubuntu-20.04 exists, overwrite it? (Y/N) Y
Client ubuntu-20.04 exists, overwrite it? (Y/N) Y
Creating new client for ubuntu-20.04
Creating new node for ubuntu-20.04
Connecting to localhost
localhost -----> Existing Chef installation detected
localhost Starting first Chef Client run...
localhost Starting Chef Client, version 12.2.1
localhost resolving cookbooks for run list: ["delay-test-reporting"]
localhost Synchronizing Cookbooks:
localhost   - delay-test-reporting
localhost Compiling Cookbooks...
localhost Converging 1 resources
localhost Recipe: delay-test-reporting::default
localhost   * execute[sleep 30] action run
localhost     - execute sleep 30
localhost
localhost Running handlers:
localhost Running handlers complete
localhost Chef Client finished, 1/1 resources updated in 34.307257232 seconds

Клиент ubuntu-20.04 был добавлен к chef-vault во время настройки.

knife vault show sea power  --mode client -p all
admins:
  sean_horn
  angle
clients:  ubuntu-20.04
id: power
search_query:
some:  content for them

Использование –bootstrap-vault-item

Сначала выполните шаг восстановления sea:power выше, чтобы увидеть разницу в разрешениях хранилища.

knife bootstrap localhost -p 2200 -N ubuntu-20.04 -r 'role[group1]' --connection-user vagrant --sudo --bootstrap-vault-item sea:power
Node ubuntu-20.04 exists, overwrite it? (Y/N) Y
Client ubuntu-20.04 exists, overwrite it? (Y/N) Y
Creating new client for ubuntu-20.04
Creating new node for ubuntu-20.04
Connecting to localhost
localhost -----> Existing Chef installation detected
localhost Starting first Chef Client run...
localhost Starting Chef Client, version 12.2.1
localhost resolving cookbooks for run list: ["delay-test-reporting"]
localhost Synchronizing Cookbooks:
localhost   - delay-test-reporting
localhost Compiling Cookbooks...
localhost Converging 1 resources
localhost Recipe: delay-test-reporting::default
localhost   * execute[sleep 30] action run
localhost     - execute sleep 30
localhost
localhost Running handlers:
localhost Running handlers complete
localhost Chef Client finished, 1/1 resources updated in 34.322229474
seconds

Во время выполнения вышеприведенной команды элемент хранилища sea:power был обновлен клиентом ubuntu-20.04 во время бесключевой настройки. Раньше доступ к содержимому имели только два администратора.

knife vault show sea power -p all
admins:
  sean_horn
  angle
clients:  ubuntu-20.04
id: power
search_query: role:stuff
some:  secret stuff for them

Затем проверим клиента ubuntu-20.04. Сам клиент может также расшифровать и прочитать содержимое зашифрованного пакета данных с помощью встроенного knife CLI в пакете Chef Infra Client.

sudo /opt/chef/bin/knife vault show sea power -c /etc/chef/client.rb -M client -p all
admins:
  sean_horn
  angle
clients:  ubuntu-20.04
id: power
search_query: role:group1
some:  secret stuff for them

Успех! Клиент имеет разрешение на просмотр содержимого элемента пакета данных sea:power

Использование –bootstrap-vault-json

Сначала выполните шаг восстановления sea:power выше, чтобы увидеть разницу в разрешениях хранилища.

knife bootstrap localhost -p 2200 -N ubuntu-20.04 -r 'role[group1]' --connection-user vagrant --sudo --bootstrap-vault-json '{"sea": "power"}'
Node ubuntu-20.04 exists, overwrite it? (Y/N) Y
Client ubuntu-20.04 exists, overwrite it? (Y/N) Y
Creating new client for ubuntu-.04
Creating new node for ubuntu-20.04
Connecting to localhost
localhost -----> Existing Chef installation detected
localhost Starting first Chef Client run...
localhost Starting Chef Client, version 12.2.1
localhost resolving cookbooks for run list: ["delay-test-reporting"]
localhost Synchronizing Cookbooks:
localhost   - delay-test-reporting
localhost Compiling Cookbooks...
localhost Converging 1 resources
localhost Recipe: delay-test-reporting::default

localhost   * execute[sleep 30] action run
localhost     - execute sleep 30
localhost
localhost Running handlers:
localhost Running handlers complete
localhost Chef Client finished, 1/1 resources updated in 33.732784033 seconds
knife vault show sea power -M client -p all
admins:
  sean_horn
  angle
clients:  ubuntu-20.04
id: power
search_query:
some:  content for them

Автоматическая установка

Клиент Chef Infra можно установить с помощью беспривязного запуска. Это позволяет установить Chef Infra Client из него самого без необходимости SSH. Например, машины часто создаются с использованием сред, таких как AWS Auto Scaling, AWS CloudFormation, Rackspace Auto Scale и PXE. В этом случае использование инструментов для установки на одной машине с участием пользователя, таких как knife bootstrap или knife CLOUD_PLUGIN create, непрактично, поскольку машины создаются автоматически, и присутствие человека для инициирования процесса запуска не всегда возможно.

При установке Chef Infra Client с помощью беспривязного запуска, помните, что Chef Infra Client:

  • Должен иметь возможность аутентификации на сервере Chef Infra
  • Должен иметь возможность настроить список задач
  • Может потребовать пользовательские атрибуты, в зависимости от используемых кулинарных книг
  • Должен иметь доступ к chef-validator.pem, чтобы создать новую учетную запись на сервере Chef Infra
  • Должен иметь уникальное имя узла; Chef Infra Client по умолчанию использует FQDN для хост-системы

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

Беспривязный запуск с данными пользователя

Метод ввода скрипта данных пользователя в сервер будет зависеть от используемой платформы инфраструктуры. Например, в AWS эти данные можно передать в виде текстового файла с помощью командной строки.

Следующие примеры данных пользователя демонстрируют процесс беспривязного запуска узлов Windows и Linux.

Данные пользователя PowerShell

## Set host file so the instance knows where to find chef-server
$hosts = "1.2.3.4 hello.example.com"
$file = "C:\Windows\System32\drivers\etc\hosts"
$hosts | Add-Content $file

## Download the Chef Client
$clientURL = "https://packages.chef.io/files/stable/chef/12.19.36/windows/2012/chef-client-<version-here>.msi"
$clientDestination = "C:\chef-client.msi"
Invoke-WebRequest $clientURL -OutFile $clientDestination

## Install the Chef Client
Start-Process msiexec.exe -ArgumentList @('/qn', '/lv C:\Windows\Temp\chef-log.txt', '/i C:\chef-client.msi', 'ADDLOCAL="ChefClientFeature,ChefSchTaskFeature,ChefPSModuleFeature"') -Wait

## Create first-boot.json
$firstboot = @{
   "run_list" = @("role[base]")
}
Set-Content -Path c:\chef\first-boot.json -Value ($firstboot | ConvertTo-Json -Depth 10)

## Create client.rb
$nodeName = "lab-win-{0}" -f (-join ((65..90) + (97..122) | Get-Random -Count 4 | % {[char]$_}))

$clientrb = @"
chef_server_url        'https://chef-server/organizations/my-org'
validation_client_name 'validator'
validation_key         'C:\chef\validator.pem'
node_name              '{0}'
"@ -f $nodeName

Set-Content -Path c:\chef\client.rb -Value $clientrb

## Run Chef
C:\opscode\chef\bin\chef-client.bat -j C:\chef\first-boot.json

Данные пользователя Bash

#!/bin/bash -xev

# Do some chef pre-work
/bin/mkdir -p /etc/chef
/bin/mkdir -p /var/lib/chef
/bin/mkdir -p /var/log/chef

# Setup hosts file correctly
cat >> "/etc/hosts" << EOF
10.0.0.5    compliance-server compliance-server.automate.com
10.0.0.6    infra-server infra-server.automate.com
10.0.0.7    automate-server automate-server.automate.com
EOF

cd /etc/chef/

# Install chef
curl -L https://omnitruck.chef.io/install.sh | bash || error_exit 'could not install chef'

# Create first-boot.json
cat > "/etc/chef/first-boot.json" << EOF
{
   "run_list" :[
   "role[base]"
   ]
}
EOF

NODE_NAME=node-$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 4 | head -n 1)

# Create client.rb
cat > '/etc/chef/client.rb' << EOF
log_location            STDOUT
chef_server_url         'https://aut-chef-server/organizations/my-org'
validation_client_name  'my-org-validator'
validation_key          '/etc/chef/my_org_validator.pem'
node_name               "${NODE_NAME}"
EOF

chef-client -j /etc/chef/first-boot.json

Важно, чтобы параметры в файле client.rb—chef_server_url, http_proxy, и так далее—использовались, чтобы гарантировать, что параметры конфигурации будут включены в процесс беспривязного запуска.

Указание начального списка задач

Начальный список задач узла указывается с помощью JSON-файла на хост-системе. При запуске Chef Infra Client как исполняемого файла используйте параметр -j, чтобы указать Chef Infra Client, какой JSON-файл использовать. Например:

chef-client -j /etc/chef/file.json --environment _default

где file.json аналогично:

{
  "resolver": {
    "nameservers": [ "10.0.0.1" ],
    "search":"int.example.com"
  },
  "run_list": [ "recipe[resolver]" ]
}

и где _default — имя среды, назначенной узлу.

Предупреждение

Этот подход может использоваться для обновления обычных атрибутов, но никогда не должен использоваться для обновления других типов атрибутов, так как все атрибуты, обновленные с помощью этого параметра, рассматриваются как атрибуты normal.

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

Spec-Zone.ru

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