注意:我们使用 Puppet 独立版(无主),即 puppet apply。
通常,在部署 Web 应用程序时,有许多后端服务和应用程序在前端应用程序后面运行 - 例如数据库、搜索服务器、缓存服务器、其他内部服务等。这些服务不需要监听公共网络接口。相反,它们可以监听私有网络接口,并且所有应用程序都可以通过该接口安全地进行通信。这是我已经做过的事情。
当您想要自动部署这些服务时,就会出现问题。我们使用 Puppet 进行基础设施配置。部署这些服务时,我们依靠事实来获取诸如 ipaddress 和 hostname 之类的信息。根据您的机器所在的位置,接口的名称会有所不同。例如,Soft Layer 提供的机器标识符为 bond0、bond1 等,而 Digital Ocean 提供的机器标识符为 eth0、eth1 等。其中,假设 bond0 和 eth0 是公共接口,而 bond1 和 eth1 是私有接口。
理想情况下,无论您在何处配置基础设施,我们都应该使用相同的 Puppet 脚本来配置基础设施。我们使用 hiera 来选择类的默认值。因此,理想情况下,我希望有 ipaddress_public、ipaddress_private 等事实可用,然后我可以随心所欲地将它们用于 Puppet 中的任何类。事实应该隐藏弄清机器在哪里(即 Soft Layer、Digital Ocean、AWS 等)的复杂细节,并为我提供工作事实。或者,我可以在 hiera 中为基础设施提供商创建一个层次结构,并为不同的基础设施提供商设置不同的默认值。
问题是我不知道如何找出特定机器的提供商。例如,如果我给你一台机器来运行 Puppet,有没有可靠的方法可以确定它是在 Soft Layer、Digital Ocean、AWS 等上运行?你们是如何解决这些问题的?
答案1
这显然不像一开始看起来那么简单。对于 AWS,有一些自定义事实会告诉您您在使用 AWS,例如:
# facter -p | grep ^ec2 |wc -l
33
公有 IP 保存在 'ec2_public_ipv4' 中。因此,很容易检测到 AWS。
但在 DigitalOcean 上 - 没有任何迹象表明虚拟机本身正在 DigitalOcean 上运行。我看到的唯一有趣的事实是:
# facter -p | grep kvm
virtual => kvm
Amazon 使用 xenhvm。如果 SoftLayer 使用 xen/kvm 以外的其他产品,那么您可以将此事实作为起点。当然,这种方法不是很可靠,因为它们中的每一个都可以在某个时间点更改 virt 技术,这可能会导致该提供商上的所有虚拟机无法运行。
我建议你编写自己的自定义事实,它将考虑你对所使用的不同云提供商的所有了解,然后决定向你的脚本公开哪些 IP。不幸的是,没有其他方法。