このページは[http://reductivelabs.com/trac/puppet/wiki/ExternalNodes]を翻訳したものです。 翻訳の間違いや誤字、元ページの更新などに気づいた方はぜひ修正お願いします。
外部ノードとは何か?
外部ノードとは、あなたのノード定義を外部のデータソースに保存することを許可するものです。例えば、あるデータベースやその他の似たようなリポジトリにあたります。Puppetクライアントは、マスターへ外部ノードスクリプトを問い合わせるために接続したとき、"insertnamehere"と呼ばれるホストをもっているかどうか問い合わせます。
これによって、次のことができるようになります
- Puppetマニフェストにあるそれぞれのノード定義をさけて、よりメンテナンスしやすい柔軟なものに差し替える
- 将来的に、すでに一ヶ所に保存されている情報に監理対象のホストを意味しているあなただけがメンテナンスできる外部データソースを問い合わせるできる(LDAPあるいは有用な管理データ)
外部ノードのツールを使うことの優位性は、外部ノードのツールは一番上のスコープは言語化で割り当てられたノードによって生成されたスコープと違っていてもパラメータとして割り当てられることである。これは、ベースノード用に割り当てるデフォルトパラメータを設定しなくてもよいし、あなたの望むままに子たちに設定用のパラメータを定義できる。最終的に、Puppetはノード用のパラメータ一覧を受け入れて、外部ノードのツールを使ったときの設定されたそらのパラメータを一番上のスコープとして設定する。
どのように外部ノードを使うか
外部ノードのクラス化を使うことは、あなたのホストごとそれぞれにノードエントリを定義することが加わり、引数でホスト名を指定できてかるPuppetが扱える情報を返すスクリプトを作成することが必要である。
注意: 外部ノードと一緒にマニフェストにノードエントリを使うことはできる。外部ノードとLDAPノードを一緒に使うことはできない。必ず、二つの種類から一つを使わなければならない。
外部ノードの制限事項
外部ノードは特定のクラスメンバーや環境や属性のみでできる種類によってリソースを特定することができない。クラスは、階層化することができるので、継承することは可能である(これによる変わりの方法は [Recipes/HandlingDisparateDefinesWithClasses] を参照すること)。
puppetmasterdでの設定
最初にpuppetmasterdに外部ノードのスクリプトを使用するという設定をします。
[main] external_nodes = /usr/local/bin/puppet_node_classifier
バージョン0.24系以降では、オプションとして適したノードの終端を選択できる特定のnode_terminusが必要になります。
[main] external_nodes = /usr/local/bin/puppet_node_classifier node_terminus = exec
外部ノードの対応には、バージョンアップ0.23系で大幅に変更されたスクリプト(そしてさらに改善された)から必要な出力フォーマットの二つの違ったバージョンが存在します。両方のバージョンアップでは、ノードについての出力情報のあとに成功したことを示すための終了コード0で終了させなければなりません、もし認識ミスでないノードをほしいときには設定が含まれていない状態で0以外の終了コードで終了させなければなりません。
バージョン0.23系以降の外部ノードのスクリプト
バージョン0.23系からはじめるには、スクリプトはクラスとパラメータをキーにしたハッシュの出力であるYAMLで出力しなければなりません。クラス変数は、ノード用に含まれたクラス配列であり、パラメータ変数は定義するためのハッシュ変数です。もしスクリプトが何も出力しなければ、スクリプトは最初にhostname.example.com、次にhostnameのみ、最後にdefaultという起動引数で3回で呼ばれたテストの段階で別のホスト名で呼ばれているかもしれません。 それはより短いホスト名あるいはdefault付きで呼ばれたものでしょう。
#!/bin/sh # バージョン0.23系以降用のとても単純な外部ノードのスクリプト cat <<"END" --- classes: - common - puppet - dns - ntp environment: production parameters: puppet_server: puppet.example.com dns_server: ns.example.com mail_server: mail.example.com END exit 0
このサンプルは、次のような基本的なノード定義として評価されます。
node default {
$puppet_server = 'puppet.example.com'
$dns_server = 'ns.example.com'
$mail_server = 'mail.example.com'
include common, puppet, dns, ntp
}
両方のバージョンでは、スクリプトは出力を行ったあとで終了コード0で終了しなければなりません。もし設定に見つからなければ終了コード0以外で終了してください。
さらに複雑な外部ノードのスクリプト
これは、私が本番環境で使っているスクリプトの最初のバージョンのものです。私の環境ではホスト名はすべて場所、サーバの種類、ID番号、ネットワークを説明したホスト名をもっています。例えば、dev1-app-01、dev1-mgmt-01、test-app-01、test-app-02、prod-app-01、prod-app-02、などです。これからはホストごとに異なったタイプになっていて、test-app-01からtest-app-05、といったエイリアスアドレスです、そしてtest-app用のDNSエイリアスはさまざまなサーバにラウンドロビンされています。これが私の環境では、私がPuppetサーバのアドレスとしてセットアップした最初のものであるので、それぞれのネットワークの場所を<ネットワーク>-puppetのようなサーバ名を使っています。
このスクリプトは、コンポーネント部分の内部にあるホスト名を分けていて、それらに相応しいクラスを割り当てることに使っています。ネットワーク上の場所を基本にしたサーバアドレス用の変数もまた設定します。
#!/usr/bin/perl -w
use strict;
use warnings;
use YAML qw( Dump );
my $fullhost = shift || die "ホスト名が指定されていません";
$fullhost =~ /^((\w+)-(\w+)-(\d+))\.example\.com$/
or die "無効なホスト名です: $fullhost";
my ( $host, $net, $type, $id ) = ( $1, $2, $3, $4 );
my @classes = ( 'common', $type.'_server' );
my $environment = "production";
my %parameters = (
puppet_server => $net."-puppet.example.com",
file_server => "puppet://".$net."-puppet.example.com/files",
);
print Dump( {
classes => \@classes,
environment => $environment,
parameters => \%parameters,
} );
