我正在使用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
之外,我可以做同样的事情并完全拉下我的环境文件。有什么想法吗?
答案 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'环境无法修改”。