Chef Repo 目录布局

Chef Repo 目录布局

我想chef-client在运行时传递一些属性。有没有办法做同样的事情?我正在研究chef-client -j选项,但据我所知,它可以用于指定 run_list。我可以在其中传递一些属性吗?如果可以,怎么做?

答案1

是的,您可以使用-jjson 文件选项来填充节点属性。

{
  "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,此处)抛出的工件。如果您必须这样做,风险是冲突的分隔符会在您使其工作时让您发疯。

相关内容