Ec2でgem(rhel6)を介してpuppetmaster(2.7.6)をセットアップしていますが、証明書名に問題が発生し、マスターが自分自身と通信できるようになっています。
私のpuppet.confは次のようになります。
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
vardir = /var/lib/puppet
ssldir = $vardir/ssl
pluginsync = true
environment = production
report = true
certname = master
Puppetmasterプロセスを開始すると、sslディレクトリは次のようになります。
ssl/private_keys/master.pem
ssl/crl.pem
ssl/public_keys/master.pem
ssl/ca/ca_crl.pem
ssl/ca/signed/master.pem
ssl/ca/ca_crt.pem
ssl/ca/ca_pub.pem
ssl/ca/ca_key.pem
ssl/certs/ca.pem
ssl/certs/master.pem
ボックスに/ etc/hostsエントリがあり、「puppet」ホスト名がlocalhostを指すようにしているため、「server」オプションを変更する必要はありません。
エージェントを実行すると、次のようになります。
# puppet agent --test
info: Retrieving plugin
err: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate: Server hostname 'puppet' did not match server certificate; expected master
err: /File[/var/lib/puppet/lib]: Could not evaluate: Server hostname 'puppet' did not match server certificate; expected master Could not retrieve file metadata for puppet://puppet/plugins: Server hostname 'puppet' did not match server certificate; expected master
err: Could not retrieve catalog from remote server: Server hostname 'puppet' did not match server certificate; expected master
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
err: Could not send report: Server hostname 'puppet' did not match server certificate; expected master
Certnameをサーバーとして(対応するhostsエントリとともに)指定すると、次のようになります。
# puppet agent --test --server master
info: Retrieving plugin
err: /File[/var/lib/puppet/lib]: Could not evaluate: Could not retrieve information from environment production source(s) puppet://master/plugins
info: Caching catalog for master
info: Applying configuration version '1321805956'
notice: Finished catalog run in 0.05 seconds
これは一種の成功ですが、マニフェストを適用するときに、そのソースエラーが後で私を噛みます。 ec2プライベートホスト名を使用して他のいくつかのバリエーションを試しましたが、さまざまな結果が得られました。
Server = 'x'の設定を避け、dns/hostsを使用して 'puppet'の解決対象を制御し、どのサーバーを決定するかを決定したい(アベイラビリティーゾーンなどでより簡単に再生できる)
それで、いくつかの調査の後、私はこれを理解しました。 Puppet 2.7.6は、マスターの証明書を生成するときにサーバー証明書にsubjectAltNamesを設定しません(実際には、それがマスターであるかどうかはわかりません)。
これを修正する方法は2つあります。
puppet ca generate --dns_alt_names puppet [master-name/uuid/string/etc]
追加 dns_alt_names = puppet
puppet masterまたはpuppetを実行する前にマスター(およびマスターのみ)に送信します(証明書が生成されます)
これで、/ etc/hostsまたはdnsエントリを使用して「puppet」に接続すると問題なく動作します。
プラグインに関連する他のエラーは、pluginsyncを有効にすることに関するバグですが、同期できるプラグインがありません。
certname = master
証明書名がマスターとして設定されています。設定方法については、puppetで動作させるか、Hostファイルを使用してpuppetの代わりにmasterのIPアドレスを設定してください。
また、master.example.comやpuppet.example.comなどのFQDNを使用して、検索ドメインエントリを必要とせずにDNSエントリを使用できるようにすることもできます。
EC2でpuppetを使用するための1つのヒントは、ElasticIPをpuppetmasterに割り当ててから、IPのAレコードではなく、ElasticIPCNAMEのDNSエントリを作成することです。
AWS DNSサーバーは、クエリが同じEC2リージョン内からのものか、外部からのものかによって応答が異なります。 CNAMEリクエストがEC2リージョン内から送信された場合、AWSDNSサーバーはCNAMEの内部IPで応答します。
DNSでCNAMEを使用して、EC2パペットクライアントがAWS DNSサーバーにパペットマスターのIPを照会したときに、外部IPではなくパペットマスターの内部IPに転送する応答を受信するようにする必要があります。