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']

つまり、マシンは同じで、python のバージョンも同じで、モジュールも同じです。なぜこれが起こり得るのでしょうか?

4

3 に答える 3

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が使用されていることを確認しました... - autoconfigure( '/ folder/of/knife.rb') 運が悪い。

于 2013-05-30T19:01:10.053 に答える
1

その ChefAPI オブジェクトがスクリプトに保持されない理由はわかりませんが、こちらの署名のキーワード引数として見られるように、検索オブジェクトに ChefAPI オブジェクトを渡す必要があることがわかりました。あなたの場合のように、コンソールで私のコードをテストするとき、これは必要ありませんでした。

私の場合、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

于 2013-09-04T18:24:59.887 に答える