我正在使用厨师来测试软件。因此,所述软件动态/的文件名和下载位置将作为属性传递。
请注意,我必须使用我们的运营团队正在使用的厨师脚本和食谱,作为测试程序的一部分。它们具有环境级别和default.rb cookbook级别的值。他们使用ruby脚本通过刀具openstack&& amp;来设置VM。通过REST api将该服务器添加到chef:
Chef::Config.from_file("/root/.chef/knife.rb")
rest = Chef::REST.new(CHEF_API)
newserver=
{
:name => server.hostname,
:chef_type => "node",
:chef_environment => server.environment,
:json_class => "Chef::Node",
:attributes => {
:cobbler_profile => server.profile
},
:overrides => {
},
:defaults => {
},
:run_list => server.roles
}
begin
result = rest.post_rest("/nodes",newserver)
....
理想情况下,文件名和位置将作为命令行参数传递到python应用程序,然后使用knife或pychef(或ruby,如果必须...)来设置/覆盖现有的节点级属性。
他们用来添加服务器的方法省略了我在其他类似问题中看到的-j
选项。
我尝试了knife node edit
- 但这需要使用编辑器。
我试过了
node = chef.Node('myNode')
node.override['testSoftware']['downloads']['testSoftwareInstaller'] = 'http://location/of/download'
node.save()
但是node.override['testSoftware']['downloads']['testSoftwareInstaller']
随后会返回原始值(并且可以在UI中看作原始值)。您似乎只能以这种方式设置 new 属性 - 但不能编辑/覆盖现有属性。
我正在考虑简单地动态生成environment.json文件......但更愿意不偏离正在使用的操作。
答案 0 :(得分:1)
我对厨师很陌生,你可能在3年后甚至不需要这个,但是......我认为你应该使用node['override']['attribute']
代替node.override['attribute']
。前者用于设定值,后者用于获取值。
我不是说这会起作用,因为我没有使用python的厨师,但我认为这是它的工作方式。