Я хотел передать некоторые атрибуты в 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
|---- 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
).
$ 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
$ 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, здесь). Если вы должны это сделать, существует риск, что конфликтующие разделители сведут вас с ума примерно в то время, когда вы заставите его работать.