这与多租户环境有关,例如小型托管公司。
Puppet(或类似的)是否适合处理基本但关键的质量变化?例如:
- 更新 DNS 解析器 (resolv.conf)
- 设置 SSH 密钥
- 更新 NTP 配置
- 配置 snmpd
- 部署监控脚本,例如 SNMP Perl 扩展或 Nagios 脚本
我担心的是安全性和侵入性:
- 我不希望任何服务器能够看到它不应该看到的任何配置
- 我担心 Puppet master 可能容易受到受感染服务器的攻击
- 我不希望 Puppet 进行任何不应进行的更改,或恢复在服务器上完成的任何手动更改。
我应该通过说我从未在生产中使用过 Puppet 来警告这一点,只是在测试实验室中快速玩了一下,所以我可能以错误的方式思考这个问题!
是的,这当然是可能的。不过,决定是否应该这样做取决于您。
关于您的查询:
1)足够公平。流量是基于 SSL 的,因此证书管理很重要。也不要相信客户提供的与其身份相关的任何“事实”,因为这些可能会被客户更改。您希望依靠客户端的 ssl 证书来提供服务器身份的身份验证。老实说,如果您正确使用 hiera 之类的东西并避免在代码中使用大量基于主机名的 if 块(您确实应该这样做),您会没事的。
2)它不应该,假设你保持它的补丁。如果配置得当,客户端攻击 puppetmaster 的机会很小。也就是说,如果它确实受到损害,影响会很大,因此请注意将其锁定。
3) 这确实是一个测试和部署问题。如果你有可靠的木偶代码,它不会破坏你的文件。排序确实需要一些时间,但对于基础知识(如您需要的)来说,时间并不长。
试试 Ansible (ansible.cc)。可能是给你的。您的客户端上没有运行代理。它增长非常快。
另一个很好的选择是 Salt Stack。
Ansible 和 Salt 很容易理解,如果你愿意,你可以将它们用作命令行工具,如分布式 shell。
是的,它可以这样使用。我用它来支持外部客户端系统。
如果您使用的是 puppet,则不得启用自动签名。自动签名允许主机自动请求证书。您的配置和权限几乎肯定会直接绑定到证书中的 CN。您不希望随机计算机上线并能够声称它们实际上是具有所有秘密高安全性内容的系统。
如果您真的很偏执,您可以调整 puppets 文件服务器设置以创建只有某些系统可以访问的共享。文件服务器访问基于证书。
有几种不同的方法可以允许本地更改。
下面是我经常使用的一种方法。基本上,如果您将列表传递给 a
source
,那么人偶会尝试列表中的每个项目。所以我在列表中添加第一项以指向本地文件。另一种选择是使用符号链接。如果有人想使用 puppet 版本,他们可以符号链接到文件的 puppet 版本。如果他们想在本地维护他们的配置,那么他们不会创建符号链接。
另一种可能性是使用 augeas 进行行级更改而不是更改整个文件。对你所做的改变要非常保守。
3> Puppet 或任何此类工具中没有自动撤消功能。您必须编写明确的代码才能撤消。此外,您可以研究 puppet 的环境功能,拥有一个测试新代码(可以是 VM)的测试实验室,并使用代码审查。
对于使用 Puppets 文件类型创建的配置文件,这可以通过设置来实现:
第一次将应用程序部署到服务器时,我用它来生成一些配置文件,但是之后对该配置文件的任何编辑都不会被 Puppet 覆盖。
然而,这确实违背了 Puppet 作为幂等部署脚本的理念。
如果可以的话,拥有独立的管理员可编辑文件可能会更好,这些文件不受 puppet 管理,这些文件包含在 puppet 管理的文件中。
Puppet 最适合具有相同配置的许多服务器。例如,您编写公司提供的共享 Web 服务器的所有配置,然后创建该服务器的 N 个实例。之后一次对所有实例进行更改(例如,您发现需要更改所有 apache 虚拟主机的 AllowOverride)将非常容易。您还可以将所有配置信息存储在一个地方,并将其置于版本控制之下。在完美的情况下,您将能够通过丢弃损坏的主机、用新的主机替换它、设置相同的主机名并签署所需的证书来处理硬件故障。其他一切都可以由 Puppet 完成。
但是,如果您最终在两台主机之间几乎没有配置共享,那么使用 puppet 的效率可能不如手动配置。此外,使用 puppet 管理服务器配置的一半,手动管理另一半可能没有多大意义。
摘要: 如果您可以为要管理的主机创建统一的结构化配置,Puppet 是您最好的朋友,但如果您必须专门处理每个服务(主机、虚拟主机、数据库),Puppet 将不会添加很有价值。