我想在运行时传递一些属性给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 )存储在数据包文件中。
$ 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
$ 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,在这里)抛出了文物。 如果你必须这样做,风险是相互冲突的分隔符会在你开始工作的时候让你疯狂。