新しい画像から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
を介してローカルで実行されている場合は問題なく機能することに注意する必要があります。
だから...これは少し恥ずかしいですが...
環境。
ちょうど私の_/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のようには機能しません。
私はこれと同じ問題に遭遇しましたが、別の修正がありました
次のようにパペットモジュールを生成した場合:
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'
発生する可能性のある別の問題は、モジュールに無効なmetadata.json
ファイル。
metadata.json
ファイルにはすべての必須フィールドがあります( https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson を参照)
同様の問題がありました。私の場合、クラス名は「onehost :: change_IoT_password_reminder」でした。 straceを使用した後、puppetがmodules/onehost/manifests/change_iot_password_reminder.ppファイルを探していることがわかりました。クラスの最初の文字でなくても、クラス名に大文字を使用することはお勧めできません。
Fedoraのpuppet 3.7.1で同様の問題が発生しました:my.serverのクラスpuppetが見つかりませんでした
解決:
Sudo ln -s /my/local/copy/puppet/modules /etc/puppet/
その後、動作します。