我正在使用厨师来测试软件。因此,所述软件动态/的文件名和下载位置将作为属性传入。
请注意,作为测试过程的一部分,我必须使用我们的运营团队正在使用的厨师脚本和食谱。它们在环境级别和 default.rb 食谱级别具有相关值。他们使用ruby脚本通过knife openstack设置虚拟机&&通过REST api将该服务器添加到厨师:
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 应用程序中,然后使用刀或 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 中可以看作原始值)。您似乎只能以这种方式设置新属性 - 但不能编辑/覆盖现有属性。
我正在考虑简单地动态生成 environment.json 文件......但不希望偏离正在使用的操作。