web-dev-qa-db-ja.com

ec2でのパペット証明書の不一致

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'の解決対象を制御し、どのサーバーを決定するかを決定したい(アベイラビリティーゾーンなどでより簡単に再生できる)

3
Stick

それで、いくつかの調査の後、私はこれを理解しました。 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 = puppet puppet masterまたはpuppetを実行する前にマスター(およびマスターのみ)に送信します(証明書が生成されます)

これで、/ etc/hostsまたはdnsエントリを使用して「puppet」に接続すると問題なく動作します。

プラグインに関連する他のエラーは、pluginsyncを有効にすることに関するバグですが、同期できるプラグインがありません。

4
Stick
certname = master

証明書名がマスターとして設定されています。設定方法については、puppetで動作させるか、Hostファイルを使用してpuppetの代わりにmasterのIPアドレスを設定してください。

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

2
becomingwisest

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に転送する応答を受信するようにする必要があります。

0
robbyt