为什么我的厨师正常属性不持久化?
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:
- 当运行以错误结束时(这里根据错误,状态无论如何都可以保存,但它超出了这个问题的范围)
- 运行
chef-client -o any_recipe_list
这里的 -o
选项是为了临时覆盖 运行 列表,所以不会保存回 chef-server 不覆盖实际的 运行 列表。
node.normal
和node.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 等)
我需要在节点上的 运行 个主厨客户端之间保留一些值。从 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:
- 当运行以错误结束时(这里根据错误,状态无论如何都可以保存,但它超出了这个问题的范围)
- 运行
chef-client -o any_recipe_list
这里的-o
选项是为了临时覆盖 运行 列表,所以不会保存回 chef-server 不覆盖实际的 运行 列表。
node.normal
和node.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 等)