为什么我的厨师正常属性不持久化?

Why Aren't My Chef Normal Attributes Persisted?

我需要在节点上的 运行 个主厨客户端之间保留一些值。从 Chef docs 我认为正常属性适用于此

"At the beginning of a chef-client run, all default, override, and automatic attributes are reset...Normal attributes are never reset...At the conclusion of the chef-client run, all default, override, and automatic attributes disappear, leaving only a collection of normal attributes that will persist until the next chef-client run.")

但是,如果我 bootstrap 一个具有以下配方的节点两次

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

我希望看到

Before setting I am my value

2 日 运行(因为值是从 1 日 运行 开始保留的)。然而,它再次恢复为未设置。

价值是否有可能持续存在?我需要以不同的方式 运行 食谱吗?还是根本不可能?

编辑:据我所知,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

您应该尝试 node.set['my_key'] = 'my value'(或使用 node.set_unless,以便在有人更改您的 Chef 服务器上的属性时安全地保留)。

好的,所以有两种情况节点状态(包括属性)无法保存回 chef-server:

  1. 当运行以错误结束时(这里根据错误,状态无论如何都可以保存,但它超出了这个问题的范围)
  2. 运行 chef-client -o any_recipe_list 这里的 -o 选项是为了临时覆盖 运行 列表,所以不会保存回 chef-server 不覆盖实际的 运行 列表。

node.normalnode.set是一回事,将值写入到节点对象中,存储到服务器上。 Examples in the documentation on the attributes

这里的问题是由于使用 knife bootstrap(根据 documentation on the validator less bootstrap 版本 > 12.1),首先在 chef-server 上创建节点及其客户端密钥。调用它两次并允许它覆盖以前的对象会重置整个节点对象。

bootstrap 应该只使用一次,以后的任何 chef-client 运行 应该通过其他方式触发(crontab、knife ssh 等)