ec2 中的 puppet 证书不匹配

ec2 中的 puppet 证书不匹配

我正在通过 gems (在 rhel6 上) 在 ec2 中设置一个 puppetmaster (2.7.6),但是在证书名称和让 master 能够自言自语方面遇到了问题。

我的 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”主机名指向本地主机,这样我就不必更改“服务器”选项。

当我运行代理时,我得到以下信息:

# 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

如果我将证书名称指定为服务器(带有相应的主机条目),我会得到:

# 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(它实际上在任何时候都不知道它是主服务器)。

有两种方法可以纠正此问题:

1. 手动生成 master 证书

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

2. 在 puppet.conf 中设置 dns_alt_names

在运行 puppet master 或 puppet 之前添加dns_alt_names = puppet到 master(仅限 master)(导致生成证书)

现在使用 /etc/hosts 或 dns 条目连接到“puppet”就可以正常工作。

与插件相关的另一个错误是启用了插件同步但没有可同步的插件的错误。

答案2

certname = master

您已将证书名称设置为 master。对于您设置它的方式,要么使用 puppet 使其工作,要么使用主机文件来设置 master 而不是 puppet 的 ip 地址。

您可能还想使用 FQDN,例如 master.example.com 或 puppet.example.com,这样您就可以使用 dns 条目而不需要搜索域条目。

答案3

在 EC2 中使用 puppet 的一个技巧是给你的 puppetmaster 分配一个 ElasticIP,然后为 ElasticIP CNAME 创建一个 DNS 条目,而不是为 IP 创建一个 A 记录。

AWS DNS 服务器会根据查询是来自同一 EC2 区域内还是外部来改变其响应。如果 CNAME 请求来自 EC2 区域内,AWS DNS 服务器将使用 CNAME 的内部 IP 进行响应。

您应该在 DNS 中使用 CNAME,以便当 EC2 puppet 客户端向 AWS DNS 服务器查询 Puppetmaster 的 IP 时,它们将收到一个响应,将它们定向到 puppetmaster 的内部 IP,而不是外部 IP。

相关内容