2013-05-30 82 views
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'] 

因此,機器是一樣的,蟒蛇的版本是一樣的, nd模塊是一樣的。爲什麼這可能發生?

回答

2

我發現,當作爲腳本運行時,pyChef沒有正確識別自動配置步驟的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

雖然我不知道爲什麼ChefAPI對象不會持久存在一個腳本,我發現我必須通過我的搜索對象我的ChefAPI對象,as seen as a keyword argument in the signature here。就像你的情況,當在控制檯中測試我的代碼時,這是沒有必要的。

就我而言,我生成ChefAPI對象from_config_file(),並將它傳遞給我的搜索對象是這樣的:

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

在控制檯中,該工程沒有經過api=chefapiobject

1

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

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

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

Try to find a knife or chef-client config file to load parameters from, starting from either the given base path or the current working directory.

相關問題