我可以跑:
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/