我正尝试在 Amazon AWS 中按如下方式使用 Puppet:
我部署了一个主机名为“server.example.com”的实例,它在启动时启动 Puppet 代理并获取初始软件有效负载。
然后我终止该实例。
然后,我重新启动具有相同主机名的新实例,它将为具有相同主机名“server.example.com”的实例生成新的私钥和 csr
这次,puppet 代理更新失败,因为新实例上的私钥与 puppet master 上该主机名的密钥不匹配。
我该如何克服这个问题?
答案1
puppet 使用盒子的 fqdn 来工作。所以不,据我所知,你不能有两个具有相同 fqdn 的客户端。你必须先清理证书,正如 Zoredache 在评论中提到的那样。有一种方法可以绕过 puppet master 授权,并签署并允许任何传入请求(我忘记了 conf 中 puppetmaster 中的指令),但即使你这样做,如果存在现有的签名服务器证书,并且新请求使用相同的 fqdn 进入,它也不会起作用。顺便说一句,我强烈建议不要让 puppetmaster 签署任何传入的 fqdn。有人可能会向你的 puppetmaster 发出请求,从而拉取他们不应该的东西。我猜如果是 vpc/privatelan 就无关紧要了,但我仍然不会这样做。
答案2
有一种方法可以做到这一点,但它只应该在开发环境中使用。
请勿在任何需要安全的环境中使用它。
您可以打开 puppet REST api 以允许代理撤销和删除证书。将以下内容添加到 puppet master 上的 auth.conf 中
path /certificate_status
auth any
method find, save, destroy
allow *
完成此更改后,重新启动 puppetmaster 服务
sudo service puppetmaster restart
启动实例时,您可以传递用户数据,该数据将在实例启动时作为脚本运行(该脚本将以 root 身份运行)
#!/bin/bash
curl -k -X PUT -H "Content-Type: text/pson" --data '{"desired_state":"revoked"}' https://puppet:8140/production/certificate_status/$HOSTNAME
curl -k -X DELETE -H "Accept: pson" https://puppet:8140/production/certificate_status/$HOSTNAME
rm -Rf /var/lib/puppet/ssl/*
puppet agent -t
这将撤销主服务器上的代理证书,删除它,删除代理上的证书并重新生成一个新的证书。
将此文件保存在本地,然后在启动新实例时将其传递给 Amazon EC2 API
aws ec2 run-instances <snip> --user-data file://./pclean.sh
其中 pclean.sh 是本地保存的脚本文件的名称,它保存在与您的工作目录相同的目录中(否则包括绝对路径)。
有了这个,每次启动一个新实例时,无论其最初的主机名,它将撤销任何具有相同主机名的现有证书,并生成一个新的证书。
显然,如果您同时启动数百个实例,则可能会遇到并发问题,并且需要其他解决方案。