我想chef-client
在运行时传递一些属性。有没有办法做同样的事情?我正在研究chef-client -j
选项,但据我所知,它可以用于指定 run_list。我可以在其中传递一些属性吗?如果可以,怎么做?
答案1
是的,您可以使用-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 是 Chef Client 的 json 属性文件最常见的用途。但是,如果您使用的是 Chef Client + Chef Server,则只需通过 WebUI(Open Source Chef Server)或管理控制台(Opscode Hosted/Private Chef)或通过knife node edit
命令行工具 knife 修改服务器上的节点对象即可。
请注意,使用 JSON 文件就像修改服务器上的节点对象一样,此处设置的属性就像在配方中使用时一样具有“正常”优先级,并且这些属性值将在成功运行结束时保存到服务器上的 Node 对象中。
- 直接在配方中应用于节点的常规属性(摘自文档)
答案2
使用属性的理想方法是将它们写入食谱或数据包中。以下是文件位置:
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
)。
为约翰创建用户数据包:
$ 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
用户列表.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>
答案3
你可以在命令行上执行此操作,但是 - 特别是在使用 knife 运行时 - 它看起来会非常奇怪:
chef-client \
-o vmware-tools \
--force-formatter \
-j '<(echo {\"vmware-tools\":{\"style\":\"rpm\"}})'
但在这里我们利用 -j 和 a<(notation)
动态创建 JSON 文件,作为通过 knife(或 ssh-i,此处)抛出的工件。如果您必须这样做,风险是冲突的分隔符会在您使其工作时让您发疯。