ec2 での puppet 証明書の不一致

ec2 での puppet 証明書の不一致

私は、gem (rhel6 上) を介して ec2 で 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

'puppet' ホスト名を localhost にポイントするための /etc/hosts エントリがボックスにあるので、'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' が解決するものを制御し、どのサーバーを決定したいですか (可用性ゾーンなどで簡単に再生できます)

答え1

そこで、少し調査した後、この問題の原因を突き止めました。Puppet 2.7.6 は、マスター用の証明書を生成するときに、サーバー証明書に subjectAltNames を設定しません (実際には、どの時点でもマスターであることを認識していません)。

これを修正するには 2 つの方法があります。

1. マスターの証明書を手動で生成する

puppet ca generate --dns_alt_names puppet [master-name/uuid/string/etc]

2. puppet.confでdns_alt_namesを設定する

dns_alt_names = puppetpuppet master または puppet を実行する前にマスターに追加します(証明書が生成されます)

これで、/etc/hosts または dns エントリを使用して 'puppet' に接続すると正常に動作するようになります。

プラグインに関連するその他のエラーは、pluginsync が有効になっているが、同期できるプラグインがないというバグです。

答え2

certname = master

certname がマスターとして設定されています。設定方法に応じて、puppet で動作させるか、ホスト ファイルを使用して puppet ではなくマスターの IP アドレスを設定します。

また、検索ドメイン エントリを必要とせずに DNS エントリを使用できるように、master.example.com や puppet.example.com などの FQDN を使用することもできます。

答え3

EC2 で puppet を使用するためのヒントの 1 つは、puppetmaster に ElasticIP を割り当て、IP の A レコードではなく ElasticIP CNAME の DNS エントリを作成することです。

AWS DNS サーバーは、クエリが同じ EC2 リージョン内から送信されたか、外部から送信されたかによって応答が異なります。CNAME リクエストが EC2 リージョン内から送信された場合、AWS DNS サーバーは CNAME の内部 IP で応答します。

DNS で CNAME を使用すると、EC2 Puppet クライアントが AWS DNS サーバーに Puppetmaster の IP を照会したときに、外部 IP ではなく、Puppetmaster の内部 IP に誘導する応答が受信されるようになります。

関連情報