使用pychef通过使用Chef REST API上传环境文件,但收到错误

时间:2015-08-04 01:33:53

标签: python chef pychef

我正在使用pychef在Chef服务器上运行命令,主要是成功。 Pychef目前没有烹饪支持(上传,下载等),但它在Chef Server REST API中公开,而pychef具有的功能可以让您轻松点击主厨api(将auth凭证标题和诸如此类的东西放在一起)。

所以我在服务器上有一个名为let {#1}}的环境,我试图更新环境文件中的食谱版本my_environment,所以我的整个环境文件将如下所示:

"some_cookbook": "= 1.2.3"

所以,我创建了一个主厨api对象,如:

    {
        "json_class": "Chef::Environment", 
        "chef_type": "environment", 
        "cookbook_versions": {
            "some_cookbook": "= 1.2.3"
        }, 
        "description": "example environment file", 
        "name": "my_environment"
    }

ChefApi类上有 chef_api = chef.ChefAPI(BASE_CHEF_URL + "/" + my_organization, chef_key, CHEF_USER) # BASE_CHEF_URL is something like https://my.chef.server/organizations 函数,因此我使用它:

request()

但是,我收到一条错误消息: chef_api.request("PUT", "/environments/my_environment", data=json.dumps(environment_file_dict)) # environment_file_dict is the dictionary shown above.

这很令人困惑,因为根据我的终点,我真的不希望这会尝试更改chef.exceptions.ChefServerError: The '_default' environment cannot be modified.环境。我试过通过Chef和Knife代码来查找问题的根源无济于事,而厨师网站上的文档似乎也没有任何消息。同样奇怪的是,除了_default之外,我可以做同样的事情并完全拉下我的环境文件。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

经过进一步调查,我发现我对pychef和我的问题错了。这是一个不能充分阅读文档的情况。虽然pychef确实没有上传/下载烹饪书,但它 可以轻松处理主厨环境https://pychef.readthedocs.org/en/latest/api.html#environments。我做的是我以与上面相同的方式创建了一个大厨api:

    chef_api = chef.ChefAPI(BASE_CHEF_URL + "/" + my_organization, chef_key, CHEF_USER)

然后我使用Environment对象更新现有环境:

    import chef  # This is the pychef module
    env_obj = chef.Environment("my_environment", api=chef_api)
    # env_obj now has attributes corresponding to the environment json that 
    # you can upload and download with knife or view on the chef server
    env_obj.cookbook_versions["some_cookbook"] = "= 3.2.1"
    env_obj.save() # This will save the object to the chef server

但是,我仍然没有解释错误“''_default'环境无法修改”。