11

EC2 インスタンスを使用して、AWS でパペット管理インフラストラクチャ (非エンタープライズ) を構築しようとしています。puppetlabs-aws モジュールを使用すると、便利な方法でマシンを作成できます。次に、各ノードでローカル設定を行います。最も重要なのは、一意のホスト名を設定することです。これどうやってするの?

私が知っている 1 つの方法は、user_dataパラメーターを介してスクリプトを提供することです。それは素晴らしいことですが、使用できるようにするには、エージェントごとにスクリプトが重複するのを避けるために、そのスクリプトをパラメーター化できる必要があります。

それは理にかなっていますか?プログラムで新しいインスタンスを起動したいので、これを実現する便利な方法を本当に感謝しています。どんな提案も考慮されます。

アップデート

私の問題の例として、プロビジョニング パペット マニフェストの次のスニペットを考えてみましょう。

ec2_instance { 'backend':
  ensure => present,
  name => 'backend',
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  user_data => template('configure.erb'),
}

ec2_instance { 'webfront':
  ensure => present,
  name => 'webfront',
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  user_data => template('configure.erb'),
}

これにより、2 つのインスタンスが稼働中であることが保証されます。user_data => template('configure.erb')インスタンスの作成後にインスタンスで実行されるテンプレート スクリプトを参照していることに注意してください。ここで、決定の基礎となるデータのみを知っていれば、ホスト名 (または希望するもの) を設定できます。インスタンスの説明にタグを追加することはできますが、configure.erb私の知る限り、スクリプトから読み取ることはできません。

とにかく、ホスト名を設定することは、根本的な問題を解決するという私の考えです。他にもっと便利な方法があるかもしれません。私が望むのは、これら 2 つのインスタンスがパペット マスターに対して異なるノード タイプを表す方法です。

4

1 に答える 1

3

問題は、特定のクラスから構成をロードするように新しいインスタンスをセットアップする方法です

あなたが対処しようとしていると思われる問題を説明してみましょう

私がここで答えようとしているのは

aws-puppet モジュールを使用して AWS で EC2 仮想ホストをセットアップする既存のスクリプトがあります。このモジュールは、AWS API を呼び出して実際に EC2 仮想ホストを作成します。ただし、API 呼び出しで使用される AMI ファイルに「組み込まれている」構成のみが含まれています。典型的な AMI ファイルは、Centos の基本イメージです。この段階では、「ユーザー データ スクリプト」を使用してさらに構成を行うことができます。しかし、これがシェルスクリプトであり、テストと保守が難しく、複雑なセットアップが含まれていないと仮定しましょう

そのため、さらに構成、パッケージのインストール、およびセットアップが必要です。このセットアップを実現するために、まったく異なるマニフェストを使用して、パペットからのアクティビティの第 2 フェーズがあります (質問では詳しく説明されていません)。

この第 2 段階は、パペット マスターに独自の権限で接続する新しい EC2 仮想ホストによって制御されます。だから私はあなたがしていると仮定しています:

  • フェーズ 1、EC2 ホストの作成
  • フェーズ 2、パペットから自分自身を構成するとき

ロールを使用した基本的な回答

ここでは、EC2 ホストの 2 フェーズ構成でこのシナリオを機能させる方法のいくつかのアイデアを示します。

作成時にカスタム ファクト「ロール」を作成します。このように /etc/facter/facts.d/role.yaml にファイルを作成します

role: webserver

これは、このようなコマンドをユーザー データ スクリプトに追加することでインスタンスが作成されるときにセットアップできます。

echo 'role: webserver' > /etc/facter/facts.d/role.yaml

パペットが起動する前にこの「役割」が設定されている限り、正常に機能します。

マニフェストを含むモジュールのセットがあり、ロールと同じ名前のモジュール パスにファイル サブディレクトリがあると想定しています。

次に、site.pp を次のように変更します。

include "$role"

そして、モジュールからの init.pp が開始され、正しいことを実行し、パッケージをインストールし、ファイルを構成します。

このアイデアについては、こちらで詳しく説明していますhttps://puppetlabs.com/presentations/designing-puppet-rolesprofiles-pattern


別のアプローチ

上記は、私がテストしていない非常に大雑把な方法です。私たちのセットアップには役割がありますが、hiera 構成を介してそれらをロードします。heira の構成はこのように見えます

---
:backends:
  - yaml
:hierarchy:
    - role/%{::role}
    - global
:yaml:
  :datadir: /etc/puppet/environments/production/hiera

次に、 /etc/puppet/environments/production/hiera/role/webserver.yaml ファイルがあるかもしれません

classes:
  - webserver
  - yum_repos
  - logstash
  - java8

そして、site.ppの最後には

hiera_include('classes')

modules_include ファイルから関連するすべての「クラス」定義をロードします

これには、コードの重複を大幅に減らしながら、各ロールで複数のクラスをロードできるという利点があります。

yaml 構成の「グローバル」部分は、管理者ユーザーの ssh キーなど、環境内のすべてによってロードされるクラスを対象としています。


定義型の例

以下は、定義済みの型を ec2_instance のラッパーとして使用して、「myrole」をテンプレートに渡す方法の例です。私はこれをテストしていません。aws puppet がインストールされていません。

define my_instance( 
  $ensure = present,
  $region = 'us-west-2',
  $image_id = 'ami-f0091d91',
  $instance_type = 't2.micro',
  $key_name= 'mykey',
  $security_groups = ['provision-sg'],
  $myrole = 'webserver'
  )
{
ec2_instance { $title :
  ensure => $ensure,
  name => $title,
  region => $region,
  image_id => $image_id,
  instance_type => $instance_type,
  key_name => $key,
  security_groups => $security_groups,
  user_data => template('configure.erb'),
}
}

$instance_data={
  'backend' =>
  {
  ensure => present,
  name => 'backend',
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  myrole => 'voodooswamp'
},
  'webfront'=>
  {
  ensure => present,
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  myrole => 'humanfly'
  }
}


create_resources(my_instance, $instance_data)
于 2015-12-14T12:04:06.730 に答える