Назад | Перейти на главную страницу

Есть ли способ передать параметры во время выполнения в Chef?

Я хотел передать некоторые атрибуты в chef-client во время выполнения. Есть ли способ сделать то же самое? Я смотрел в chef-client -j вариант, но, насколько мне известно, его можно использовать для указания run_list. Могу ли я передать в него какие-то атрибуты? Если да, то как?

Да, вы можете использовать -j json файл для заполнения атрибутов узла.

{
  "my_attribute": "I like attributes!"
}

Это сделает атрибут с именем my_attribute доступны в ваших кулинарных книгах. Например,

Chef::Log.info(node['my_attribute'])

Или,

if node['my_attribute'] =~ /like/
  package "foo-likes-attributes" do
    action :install
  end
end

Установка начального run_list - наиболее частое использование файла атрибутов json для Chef Client. Если вы используете Chef Client + Chef Server, вы можете просто изменить объект узла на сервере либо через webui (Open Source Chef Server), либо через консоль управления (Opscode Hosted / Private Chef), либо через knife node edit если вы используете инструмент командной строки, нож.

Обратите внимание, что использование файла JSON похоже на изменение объекта узла на сервере, атрибуты устанавливают здесь «нормальный» приоритет, как когда они используются в рецепте, и эти значения атрибутов будут сохранены в объекте узла на сервере в конце успешного пробега.

Идеальный способ использования атрибутов - записать их в свою кулинарную книгу или в пакет данных. Вот расположение файлов для:

Макет каталога Chef Repo

|- chef-repo
|---- cookbooks
|------- attributes
|---------- default.rb
|------- recipes
|---------- default.rb
|---- data_bags
|------- users
|---------- john.json
|---------- susan.json
|------- databases
|----------- master.json
|----------- slave.json

Вы можете хранить данные в своих файлах пакетов данных в базовом формате JSON ( knife create data_bag users).

Создайте пакет пользовательских данных для john:

$ knife data bag create users john

{
  "id" : "john"
  "age" : "27"
  "height" : "60in"
}

Использование пакетов данных

Если вы решите использовать пакеты данных (я рекомендую их, если у вас много разных пользователей или серверов баз данных (в этом контексте)), вы можете просмотреть дополнительную информацию на https://docs.getchef.com/dsl_recipe_method_data_bag.html. Кроме того, проще создать users в каталоге data_bags и создайте там пользовательские файлы .json (~ / chef-repo / data_bags / users / john.json) с указанным выше содержимым, затем загрузите пакет данных на сервер Chef: knife data bag from file users /path/to/data_bags/users/john.json

Использование атрибутов

Вы также можете сохранить данные в своем файле атрибутов:

файл атрибутов

$ vi ~/chef-repo/cookbooks/my-cookbook-name/attributes/default.rb

default['my-cookbook-name']['user-1'] = "John"
default['my-cookbook-name']['user-1']['age'] = "27"
default['my-cookbook-name']['user-1']['height'] = "60in"

рецепт поваренной книги

$ vi ~/chef-repo/cookbooks/my-cookbook-name/default.rb

template "/root/user-list" do
  action :create
  source "user-list.erb"
end

user-list.erb

$ vi ~/chef-repo/cookbooks/my-cookbook-name/templates/default/user-list.erb

<html>
<head>
 <title>My User List</title>
</head>
<body>
<h1>User List</h1>
User 1: <%= node['my-cookbook-name']['user-1'] %>
User Age: <%= node['my-cookbook-name']['user-1']['age'] %>
User Height: <%= node['my-cookbook-name']['user-1']['height'] %>
</body> 
</html>

вы можете сделать это в командной строке, но - особенно при беге с ножом - это начнет выглядеть действительно непривычно:

chef-client \
  -o vmware-tools \
  --force-formatter \
  -j '<(echo {\"vmware-tools\":{\"style\":\"rpm\"}})'

Но здесь мы используем -j и a <(notation) для создания файла JSON на лету, поскольку артефакты подбрасываются с помощью ножа (или ssh-i, здесь). Если вы должны это сделать, существует риск, что конфликтующие разделители сведут вас с ума примерно в то время, когда вы заставите его работать.