python chef在控制台中工作而不是脚本

时间:2013-05-30 16:34:07

标签: python chef

我可以跑:

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的版本是一样的,模块是一样的。为什么会发生这种情况?

3 个答案:

答案 0 :(得分:2)

我发现当作为脚本运行时,pyChef无法正确识别autoconfigure步骤的knife.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 ... - 甚至尝试指向自动配置('/folder/of/knife.rb')没有运气。

答案 1 :(得分:1)

虽然我不知道为什么ChefAPI对象不会在脚本中保留,但我发现我必须将我的Search对象传递给我的ChefAPI对象as seen as a keyword argument in the signature here。就像你的情况一样,在控制台中测试我的代码时没有必要这样做。

就我而言,我生成了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

答案 2 :(得分:1)

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

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

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

  

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