Puppetの環境はどこから来たのですか?

Puppetの環境はどこから来たのですか?

自分で訓練puppetし、次のチェックリストを作成しました。

class bratch::test {

  file { '/var/cache/tempFile':
    owner  => 'root',
    group  => 'root',
    mode   => '0644',
    source => "puppet://${puppetserver}/modules/bratch/tempFile"
  }

  exec { "create_file":
    command => "/bin/echo boop >> /tmp/outputFile",
  }

期待どおりに動作しましたが、実際には実行が終わるまでその実行ラインについては考えませんでした。

出力リダイレクトを理解したら、puppetシェルを呼び出すという意味ですか?では、その環境はどこから来るのか?毎回環境を初期化しますか、それともPuppetエージェントから直接継承しますか?

答え1

これ文書この時点では少し混乱しています。

プロバイダー

POSIX

シェルを介したり、補間を行わずに直接外部バイナリを実行します。これはほとんどのコマンドを実行するためのより安全で予測可能な方法ですが、ワイルドカードおよびシェル組み込み(「for」および「if」ステートメントなどの制御ロジックを含む)は使用できません。

デフォルト値はfeature==ですposix

シェル

提供されたコマンドを渡します/bin/sh。 POSIX システムにのみ適用されます。これにより、シェルワイルドカードおよび組み込みコマンドを使用でき、コマンドパスを正規化する必要がなくなります。これはプロバイダよりも便利かもしれませんがposix、いつものようにエスケープに注意する必要があるという意味でもあります。

execこのプロバイダは、Puppet 0.25.xの種類と非常によく似ています。

したがって、プロバイダーを使用している場合は、shellリダイレクトを使用できる必要がありますが、既定値はです。posixつまり、自分で行うので、指定しない限りshell...

どちらの場合も、ドキュメントには環境について多くの内容が記載されていません。確認が必要ですパスワード:

begin
  # Do our chdir
  Dir.chdir(dir) do
    environment = {}

    environment[:PATH] = resource[:path].join(File::PATH_SEPARATOR) if resource[:path]

空白に設定されてから、environmentそのフィールドを使用して提供されているすべての設定でいっぱいになるため、毎回再初期化されます。


しかし、移動経路をたどると次のようになります。関数呼び出し次の操作を行います。

      output = Puppet::Util::Execution.execute(command, :failonfail => false, :combine => true,
                              :uid => resource[:user], :gid => resource[:group],
                              :override_locale => false,
                              :custom_environment => environment)

Execution.execute着信電話execute_posix、これは順番にする:

  command = [command].flatten
  ...
    options[:custom_environment] ||= {}
    Puppet::Util.withenv(options[:custom_environment]) do
      Kernel.exec(*command)

私はRubyを知りません。コマンドと引数を配列として明示的に指定し、次のような"/bin/echo boop >> /tmp/outputFile"文字列を指定しない限り、そう言いたいと思います。Kernel.exec、の:

この文字列はコマンドラインとして扱われ、実行前にシェル拡張が必要です。

そのため、shellプロバイダとして設定しなくてもリダイレクトを使用できます。さらに進んでみるとwithenvenvironment上記で設定された配列は、オーバーレイのセットとして使用されます。environmentフィールドが次の場合いいえ指定すると何も上書きしません。したがって、環境はPuppetから継承する必要があります。 Puppetがどのような環境になるのかわかりませんが、UbuntuなどのUpstart-as-initシステムでサービスとして実行されている場合は、少なくともTERMそしてPATH利用可能。

関連情報