0

私はファクトからファクトを読み取るためにpuppetを使用しており、それに基づいてモジュールに異なる構成を適用しています。

問題:

人形エージェントはこの事実を見ていません。puppet agent --testインタラクティブに実行すると、期待どおりに機能します。スクリプトから非対話的に実行する場合でも、正常に機能するようです。エージェント自体だけが台無しになっています。

プロセス:

UbuntuベースのアプリスタックをEC2にデプロイしています。userdata(#cloud-config)を使用して、/ etc/environmentに環境変数を設定します。

export FACTER_tl_role=development

次に、すぐに#cloud-configで、/ etc/environmentをソースします。次に、i apt-get install puppetのみ(#cloud-configステップのシーケンスのあいまいさを排除するためにpackage:puppetの使用をやめました)

インスタンスが起動したら、ファクトが利用可能であることを確認します。実行facter tl_roleすると「開発」が返されます。次に/var/ log / syslogを確認しますが、パペットエージェントはこの事実を認識していないようです。カタログをコンパイルできず、値が表示されるはずの場所に何も(空白)ないため、これを知っています。この事実に応じて変数が設定されます。

ただし、puppet agent --testインタラクティブに実行すると、カタログが正常にコンパイルおよび実行されます。#cloud-configスクリプトからこれを実行しても(puppetをインストールした直後)、問題なく機能します。

この事実を人形エージェントが利用できるようにするにはどうすればよいですか?エージェントサービスを再起動しても違いはなく、カスタムファクトを認識しません。インスタンスを再起動しても違いはありません。

ここにいくつかのコードがあります:

EC2ユーザーデータ:

#cloud-config

puppet:
  conf:
    agent:
      server: "puppet.foo.bar"
      certname: "%i.%f"
      report: "true"

runcmd:
- sleep 20
- echo 'export FACTER_tl_role=development' >> /etc/environment
- . /etc/environment
- apt-get install puppet
- puppet agent --test

主な人形のマニフェスト:

# /etc/puppet/manifests/site.pp
node default {
case $tl_role {
    'development':  { $sitedomain = "dev.foo.bar"}
    'production':   { $sitedomain = "new.foo.bar"}
}
class {"code" : sitedomain => $sitedomain}
class {"apache::site" : sitedomain => $sitedomain}
class {"nodejs::grunt-daemon" : sitedomain => $sitedomain}

そして、$ sitedomainが想定されている場所でエラーが発生したため、$tl_roleが設定されていないように見えます。

何か案は?これは私の脳を爆発させています...

4

3 に答える 3

3

ありがとう、@クリストファー。これは良い解決策かもしれません、私はそれをテストし、おそらく私の現在の恐ろしいハックからそれに移動します。PuppetユーザーのGoogleグループで得た答えは、Puppetエージェントプロセスにログインシェルの環境があり、FacterがPuppetエージェントによって実行されるときにもこの環境があると想定すべきではないというものでした。

これが私がそれを解決した方法です(確かに、ブルートフォースによって):

runcmd:
- echo 'export FACTER_tl_role=development' >> /etc/environment
- . /etc/environment
- apt-get install puppet
- service puppet stop
- sed -i '/init-functions/a\. \/etc\/environment' /etc/init.d/puppet
- puppet agent --test
- service puppet start

ご覧のとおり、Puppetをインストールした後、エージェントを停止し、/ etc / init.d/puppetに行を追加して/etc/environmentをソースします。次に、エージェントを開始します。理想的ではありません...しかし、それは機能します!

于 2013-03-20T14:39:20.710 に答える
1

. /etc/environmentcloud-initの実行方法が正しく機能するとは思いませんruncmd。2つの可能な解決策:

  • puppetagentコマンドを使用して変数をエクスポートします。

    export FACTER_tl_role=development && puppet agent --test

それが機能しない場合:

  • コマンドをユーザーデータスクリプトにドロップし、それらを「マルチパート入力」としてワイヤリングするだけです(cloud-initドキュメントで説明されています)。

2番目の解決策は、コマンドを適切なシェルスクリプトとして実行し、問題を修正する可能性があります。ただし、最初の機能が機能する場合は、所有しているものを使用する方が簡単です。

于 2013-02-26T23:02:36.370 に答える