Chef中有没有办法在运行时传递参数?

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

是的,您可以使用-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)或pipe理控制台(Opscode Hosted / Private Chef)简单地修改服务器上的节点对象,或者通过knife node edit if你正在使用命令行工具,刀。

请注意,使用JSON文件就像修改服务器上的节点对象一样,这里的属性设置为“正常”的优先级,就像它们在配方中使用时一样,这些属性值将会保存到服务器上的节点对象的末尾成功的运行。

  • 在配方中直接在节点上应用正常属性 (从文档中)

使用属性的理想方法是将它们写入您的食谱或数据包。 以下是以下任一文件的位置:

厨师回购目录布局

 |- 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 )存储在数据包文件中。

为john创build用户数据包:

 $ knife data bag create users john { "id" : "john" "age" : "27" "height" : "60in" } 

使用数据包

如果您select使用数据提包(如果您拥有许多不同的用户或数据库服务器(在此上下文中),则可以推荐他们),则可以在https://docs.getchef.com/dsl_recipe_method_data_bag.html上查看更多信息。 另外,在data_bags目录下创buildusers目录会更容易一些,然后用上面的内容创buildusers的.json文件(〜/ chef-repo / data_bags / users / john.json),然后将数据包上传到厨师服务器: 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 

用户list.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> 

你可以在命令行上执行它,但是 – 特别是在刀子运行的时候 – 它会开始看起来很糟糕的ooky:

 chef-client \ -o vmware-tools \ --force-formatter \ -j '<(echo {\"vmware-tools\":{\"style\":\"rpm\"}})' 

但是在这里,我们利用-j和一个<(notation)来创buildJSON文件,因为通过刀子(或者ssh-i,在这里)抛出了文物。 如果你必须这样做,风险是相互冲突的分隔符会在你开始工作的时候让你疯狂。