問題は、特定のクラスから構成をロードするように新しいインスタンスをセットアップする方法です
あなたが対処しようとしていると思われる問題を説明してみましょう
私がここで答えようとしているのは
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)