2

我正在使用厨师来测试软件。因此,所述软件动态/的文件名和下载位置将作为属性传入。

请注意,作为测试过程的一部分,我必须使用我们的运营团队正在使用的厨师脚本和食谱。它们在环境级别和 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 文件......但不希望偏离正在使用的操作。

4

1 回答 1

1

我对厨师很陌生,3年后你可能甚至不需要这个,但是......我认为你应该使用node['override']['attribute']而不是node.override['attribute']. 前者用于设置值,后者用于获取值。

我并不是说这会起作用,因为我没有使用过 python 的厨师,但我认为这就是它的工作方式。

于 2016-04-25T16:55:57.727 回答