web-dev-qa-db-ja.com

クラスが見つかりませんでしたが、まだあります

新しい画像からpuppet agentを呼び出すと、err: Could not find class custommodエラーが発生します。モジュール自体は、呼び出している他のすべてのモジュールと同じ/etc/puppet/modules/custommodにありますが、これは難解です。

[site.pp]

node /clunod-wk\d+\.sub\.example\.local/ {
      include base
      include curl
      include custommod
      class{ "custommod::apps": frontend => "false}
      [...]
}

Puppetmasterをデバッグ出力で実行すると、baseとcurlの情報が明確に見つかります。

debug: importing '/etc/puppet/modules/base/manifests/init.pp' in environment production
debug: Automatically imported base from base into production
debug: importing '/etc/puppet/modules/curl/manifests/init.pp' in environment production
debug: Automatically imported curl from curl into production
err: Could not find class custommod for clunod-wk0130.sub.example.local at /etc/puppet/manifests/site.pp:84 on node clunod-wk0130.sub.example.local

行84はinclude custommodです

省略されたディレクトリとファイル構造:

/etc/puppet
   |- manifests
   |     |- site.pp
   |
   |- modules
         |- base
         |    |- manifests
         |          |- init.pp
         |
         |- curl
         |    |- manifests
         |          |- init.pp
         |   
         |- custommod
              |- files 
              |     |- apps
              |         |- [...]
              |
              |- manifests
                    |- init.pp
                    |- apps.pp

スペルチェックを行いました:}

Custommodディレクトリのinit.ppの内容は、まったく目立ちません:

class custommod {
}

その意図は、肉がある場所であるapps.ppファイルの空のクラスを作成することです。

class custommod::apps {

    [lots of stuff]
}

ただし、appsファイルに到達することはありません。 include custommodをコメント化すると、代わりにclass{ "custommod::apps": frontend => "false}行に上記のエラーが生成されます。

このエラーがどのように生成されているかを見つけるために、ハントで何が欠けていますか?このリポジトリがpuppet applyを介してローカルで実行されている場合は問題なく機能することに注意する必要があります。

31
sysadmin1138

だから...これは少し恥ずかしいですが...

環境。

ちょうど私の_/etc/puppet.conf_ファイルの中にあります:

_[master]
  manifest=$confdir/manifests/site.pp
  modulepath=$confdir/environments/$environment/modules:$confdir/modules
_

straceをそれに投げて、ファイルを探している場所を見つけたところ、何かに気づきました。 _/etc/puppet/environments/production/modules_の下でcustommodを探していましたが、そこにディレクトリがあったため(空)、その後_/etc/puppet/modules_をチェックしませんでした。どうやらモジュールをインポートするとき、ファイルの存在(init.pp)ではなくディレクトリの存在をチェックします。

その空のディレクトリを削除すると、動作が開始されます。

別の環境を使用してPuppetエージェントを実行すると、動作が開始されます。

この話の教訓:

Puppet環境のパスは、bash $ PATHのようには機能しません。

32
sysadmin1138

私はこれと同じ問題に遭遇しましたが、別の修正がありました

次のようにパペットモジュールを生成した場合:

puppet module generate foo-example_module

foo名前空間を持つexample_moduleという名前のモジュールを作成します。すべてのマニフェストはfoo-example_moduleというディレクトリ内にあります

Init.ppで定義されているクラスの名前は、フォルダー名と同じである必要があります。

簡単な修正:

mv foo-example_module example_module

Puppet-lintを実行すると、次のメッセージが表示されます。

ERROR: example_module not in autoload module layout on line 42

R10kまたはlibrarian-puppetでPuppetfileを使用する場合は、名前空間を削除して、ファイルがモジュールディレクトリに「foo」プレフィックスなしで配置されるようにする必要がある場合もあります。

前:

mod 'foo-example_module',
    :git => [email protected]:foo/example_module'

後:

mod 'example_module',
    :git => [email protected]:foo/example_module'
4
spuder

発生する可能性のある別の問題は、モジュールに無効なmetadata.jsonファイル。

metadata.jsonファイルにはすべての必須フィールドがあります( https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson を参照)

2
Nico

同様の問題がありました。私の場合、クラス名は「onehost :: change_IoT_password_reminder」でした。 straceを使用した後、puppetがmodules/onehost/manifests/change_iot_password_reminder.ppファイルを探していることがわかりました。クラスの最初の文字でなくても、クラス名に大文字を使用することはお勧めできません。

0
Geoff Crompton

Fedoraのpuppet 3.7.1で同様の問題が発生しました:my.serverのクラスpuppetが見つかりませんでした

解決:

Sudo ln -s /my/local/copy/puppet/modules /etc/puppet/

その後、動作します。

0
Haibo Liu