我可以跑:

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

最佳答案

我发现当以脚本身份运行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 ...-甚至尝试指向autoconfigure('/文件夹/of/knife.rb'),但没有运气。

关于python - python Chef在控制台中工作而不是在脚本中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16841496/

10-12 23:25