Puppet の完全修飾パラメータ パス エラーを修正するにはどうすればよいですか?

Puppet の完全修飾パラメータ パス エラーを修正するにはどうすればよいですか?

マシン(デーモン化されていない)で Puppet クライアントを実行すると、定期的に、しかしランダムに次のエラー メッセージが表示されます。

エラー: 作成できませんでした: パラメータ パスに失敗しました: ファイル パスは完全修飾である必要があります
警告: 失敗したカタログではキャッシュが使用されていません
警告: 構成をインスタンス化できませんでした: パラメータ パスに失敗しました: ファイル パスは完全修飾である必要があります

それが何を意味するかは、パラメータに完全修飾パスがないということが、ある程度は明らかであるように思われます。しかし、どここれを修正する方法、またはどのパラメータが間違っているかがわかります:(

(デバッグ オプションを使用すると一貫して動作するので、マニフェストのキャッシュに問題があるようです... 実稼働環境では、これを削除したほうがよいでしょう)

注: これを一貫して実現することはできません :/

答え1

[しばらく設定をいじってみてから、自分自身の質問に答える]

私はこれを、私が書いたモジュールの 1 つにまで追跡することができました (もちろん)。しかし、それは変数の使用が期待通りに機能しなかったことが原因でした。

何が起こったか:

$variable_dir = "/etc/puppet/bar"

class foo {
  file { $variable_dir:
    ensure => directory
  }
}

define some-define() {
   # Trimmed for brevity
   exec { "some-$name":
     # command, creates, timeout etc here
     require => File[$variable_dir],
   }
}

..これは基本的に、File[] で変数を使用する際に混乱を引き起こしました。今のところ、これらを変数の明示的な値に置き換えて、すべて正常に動作していますが、これは驚きでした。スコープと変数を定義/使用できるタイミングに関する私の理解が Puppet とは少しずれていると思われますので、次のことを学びます。多くより良い...

変数が見つからないか、値を取得できないため、ファイル文字列に完全修飾パスを使用しない場合と同じ動作が発生したようです。いずれにしても、かなり奇妙です。

編集: 変数がスコープ内で見つからなかったため、空になり、完全に修飾されたパスではなかった可能性が十分にあります。ただし、これが一貫していない理由は説明されていません...

答え2

パペットの設定をテストするには、次のコマンドを実行します。

puppetd --test

これにより、より詳細な出力が得られ、どこで失敗したかが表示されます。本当に困っている場合は、追加して--debugさらに詳しい出力を取得することもできます。

.ppファイル内を検索したい場合は、

file { "path/to/file":
    ...
}

が欠落しています/(つまり、/path/to/file代わりに次のように記載する必要があります)。

答え3

実際のパスをパス プロパティに指定すると、機能します。私の場合は次のように機能します:

$variable_dir = "/etc/puppet/bar"

class foo {
  file { 'variable_dir':
    path => ${variable_dir},
    ensure => directory
  }
}

define some-define() {
   # Trimmed for brevity
   exec { "some-$name":
     # command, creates, timeout etc here
     require => File['variable_dir'],
   }
}

答え4

pathパラメータを使用していない限り、キー名には完全なパスを配置する必要があります。

例えば:

file { '/full/path':
  ensure => directory,
  recurse => true,
}

または:

file { 'my name':
  path => "/full/path",
  ensure => directory,
  recurse => true,
}

変数を使用している場合は、それが定義されていることを確認してください。別のクラスにある場合は、標準構文を使用してください。さらに詳しい情報を得るには、 (verbose+debug) パラメータ$class::variableを指定して puppet を実行してください。-vd

関連情報