我可以跑:
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的版本是一样的,模块是一样的。为什么会发生这种情况?
答案 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配置文件来加载参数。