Почему не сохраняются обычные атрибуты моего шеф-повара?

Мне нужно сохранить некоторые значения между запусками chef-client на узле. Из документов Chef я подумал, что для этого предназначены обычные атрибуты.

«В начале запуска шеф-клиента все атрибуты по умолчанию, переопределения и автоматические атрибуты сбрасываются... Обычные атрибуты никогда не сбрасываются... В конце запуска шеф-клиента все атрибуты по умолчанию, переопределения и автоматические атрибуты исчезнуть, оставив только набор обычных атрибутов, которые будут сохраняться до следующего запуска шеф-клиента.")

Однако, если я загружаю узел по следующему рецепту дважды

log 'message' do
  message "Before setting I am #{node['my_key']}"
  level :warn
end

node.normal['my_key'] = 'my value'

log 'message' do
  message "After setting I am #{node['my_key']}"
  level :warn
end

я ожидал увидеть

Перед установкой я - моя ценность

при втором прогоне (поскольку значение сохранилось с первого прогона). Однако он снова становится неустановленным.

Возможно ли, чтобы значение сохранялось? Нужно ли запускать рецепт по-другому? Или это просто невозможно?

EDIT: Насколько я вижу, запуск Chef успешно завершается. Вот команда и вывод:

mfreake@my-linux:/export/apps/chef/chef-repo/cookbooks$ knife bootstrap node1.blah.com --ssh-user mfreake --ssh-password 'yaddayadda' --sudo --use-sudo-password  --bootstrap-proxy 'http://proxy.blah.com/' -N node1 --run-list persist_test::read_set_read
Node node1 exists, overwrite it? (Y/N) Y
Client node1 exists, overwrite it? (Y/N) Y
Creating new client for node1
Creating new node for node1
Connecting to node1.marketpipe.com
node1.blah.com [sudo] password for mfreake: -----> Existing Chef installation detected
node1.blah.com Starting first Chef Client run...
node1.blah.com Starting Chef Client, version 12.4.2
node1.blah.com resolving cookbooks for run list: ["persist_test::read_set_read"]
node1.blah.com Synchronizing Cookbooks:
node1.blah.com   - persist_test
node1.blah.com Compiling Cookbooks...
node1.blah.com [2015-09-30T17:45:40+01:00] WARN: Cloning resource attributes for log[message] from prior resource (CHEF-3694)
node1.blah.com [2015-09-30T17:45:40+01:00] WARN: Previous log[message]: /var/chef/cache/cookbooks/persist_test/recipes/read_set_read.rb:2:in `from_file'
node1.blah.com [2015-09-30T17:45:40+01:00] WARN: Current  log[message]: /var/chef/cache/cookbooks/persist_test/recipes/read_set_read.rb:9:in `from_file'
node1.blah.com Converging 2 resources
node1.blah.com Recipe: persist_test::read_set_read
node1.blah.com   * log[message] action write[2015-09-30T17:45:40+01:00] WARN: A message add to the log. 
node1.blah.com 
node1.blah.com   
node1.blah.com   * log[message] action write[2015-09-30T17:45:40+01:00] WARN: A message add to the log. my value
node1.blah.com 
node1.blah.com   
node1.blah.com 
node1.blah.com Running handlers:
node1.blah.com Running handlers complete
node1.blah.com Chef Client finished, 2/2 resources updated in 1.621458795 seconds

person matt freake    schedule 30.09.2015    source источник
comment
1) Удачно ли закончился ваш повар? если нет, ничего не сохраняется обратно на сервер. 2) Если вы запускаете шеф-клиент с -o recipe, объект узла также не сохраняется. Вы действительно из этих двух случаев? (Что касается вашего последнего вопроса, да, это возможно и предназначено)   -  person Tensibai    schedule 01.10.2015
comment
Спасибо, кажется, все прошло успешно. Я добавил команду и вывод выше. Существует ли выходной узел node1, перезаписать его? (Т/Н) - проблема? Как не перезаписать?   -  person matt freake    schedule 01.10.2015
comment
Действительно, начальную загрузку следует использовать только один раз для начальной загрузки (создайте объект узла, создайте клиентский ключ, установите шеф-клиент и выполните первый запуск). Когда вы переделываете его, он перезаписывает объект узла, поэтому, очевидно, он пуст во время выполнения. Например, запустите запуск с помощью ножа ssh, и все будет в порядке.   -  person Tensibai    schedule 01.10.2015
comment
Аааааа, это многое объясняет. Идея многократной начальной загрузки узла не звучала правильно. Я использую книгу Learning Chef и, возможно, я просто пропустил эту часть (хотя я все еще не вижу ее или не могу найти в указателе). Спасибо - не стесняйтесь указывать это как ответ, если вам нужны баллы / галочки   -  person matt freake    schedule 01.10.2015
comment
Если книга предназначена для шеф-повара11, это нормально, поведение слегка изменилось в шеф-поваре12, где ключ валидатора не копируется в узел, чтобы он мог зарегистрировать себя, а создает узел заранее. Я попытаюсь обобщить это в ответе   -  person Tensibai    schedule 01.10.2015


Ответы (2)


Итак, есть два случая, когда состояние узла, включая атрибуты, не может быть сохранено обратно на шеф-сервере:

  1. Когда запуск заканчивается ошибкой (здесь, в зависимости от ошибки, состояние все равно может быть сохранено, но это выходит за рамки этого вопроса)
  2. При запуске chef-client -o any_recipe_list параметр -o предназначен для временного переопределения списка выполнения, поэтому он не будет сохраняться обратно на сервер шеф-повара, чтобы не перезаписать фактический список выполнения.

node.normal и node.set — это одно и то же, запись значений в объект узла для сохранения на сервере. Примеры в документации по атрибутам

Здесь проблема связана с использованием knife bootstrap (с версией > 12.1 согласно документации по валидатору меньше bootstrap), которые начинаются с создания узла на шеф-сервере и его клиентского ключа. Вызов его дважды и разрешение перезаписать предыдущий объект сбрасывает весь объект узла.

bootstrap следует использовать только один раз, любой последующий запуск шеф-клиента должен запускаться другим способом (crontab, knife ssh и т. д.)

person Tensibai    schedule 01.10.2015

Вы должны попробовать node.set['my_key'] = 'my value' (или использовать node.set_unless, чтобы сохранить его, если кто-то изменит атрибут на вашем сервере шеф-повара).

person Martin    schedule 30.09.2015
comment
set является псевдонимом для normal, это не решит проблему OP. - person Tensibai; 01.10.2015
comment
@Tensbai, у тебя есть ссылка на это? Вчера вечером я просмотрел кодовую базу и не смог найти для нее def. Отсюда мой пост, в котором говорится, что вы должны попробовать ... вместо того, чтобы я знаю, что ответ X :) - person Martin; 01.10.2015
comment
См. ссылку на документы атрибутов выше, из базы кода это строка псевдонима здесь, который является псевдонимом обычного метода, описанного выше. node['key'] = value тоже может использоваться для той же цели и делегируется классу Chef::Node::Attribute, определенному здесь. Я лично придерживаюсь формы node['key'] для чтения атрибутов и формы node.method['key'] для их установки (где метод может быть любым приоритетом атрибута) - person Tensibai; 01.10.2015
comment
Спасибо за указатель. Я искал def set, но не додумался искать псевдонимы! :) - person Martin; 02.10.2015