1

我可以跑:

import chef
chef.autoconfigure()
for node in chef.Node.list():
    if "auto" in node.lower():
        print "deleting node " + node
        nodeObj = chef.Node(node)
        nodeObj.delete()

直接在控制台中,但是当我尝试将其作为脚本运行时:python2.7 test.py我收到以下错误:

Traceback (most recent call last):
  File "test.py", line 38, in <module>
    for node in chef.Node.list():
  File "/usr/local/lib/python2.7/site-packages/chef/base.py", line 86, in list
    names = [name for name, url in api[cls.url].iteritems()]
TypeError: 'NoneType' object has no attribute '__getitem__'

我使用控制台验证

>>> chef.__path__
['/usr/local/lib/python2.7/site-packages/chef']

所以,机器是一样的,python的版本是一样的,模块是一样的。为什么这可能发生?

4

3 回答 3

2

我发现当作为脚本运行时,pyChef 无法正确识别自动配置步骤的刀.rb 文件。

这就是让它工作的原因:

with chef.ChefAPI('http://example.com:4000', '/root/.chef/client.pem', 'client'):
    for node in chef.Node.list():
        if "auto" in node.lower():
            print "deleting node " + node
            nodeObj = chef.Node(node)
            nodeObj.delete()

请注意,我不知道为什么它无法在一种情况下正确使用knife.rb文件而不是另一种情况(我验证了在两种情况下都使用了相同的cwd...... - 甚至尝试指向自动配置('/文件夹/of/knife.rb')没有运气。

于 2013-05-30T19:01:10.053 回答
1

虽然我不知道为什么 ChefAPI 对象不会保留在脚本中,但我发现我必须将我的 Search 对象传递给我的 ChefAPI 对象,就像这里的签名中的关键字参数一样。就像您的情况一样,在控制台中测试我的代码时,这不是必需的。

就我而言,我生成 ChefAPI 对象from_config_file(),并将其传递给我的 Search 对象,如下所示:

import chef
chefapiobject = chef.chefAPI.from_config_file('knife.rb')
nodes = chef.Search('node', 'roles:worker', api=chefapiobject)

在控制台中,这可以不通过api=chefapiobject

于 2013-09-04T18:24:59.887 回答
1

您可以使用 chef.autoconfigure 导入本地配置。例如:

from chef import autoconfigure, Client, Node
api = autoconfigure()

http://pychef.readthedocs.org/en/latest/api.html#chef.autoconfigure

尝试从给定的基本路径或当前工作目录开始,找到一个 knife 或 chef-client 配置文件来加载参数。

于 2015-08-03T20:35:41.327 回答