Puppet 或 Chef 是否适合管理多租户环境中非常基本的服务器配置?

Puppet 或 Chef 是否适合管理多租户环境中非常基本的服务器配置?

这与多租户环境(例如小型托管公司)相关。

Puppet (或类似技术) 是否适合处理基本但关键的大规模变更?例如:

  • 更新 DNS 解析器(resolv.conf)
  • 设置 SSH 密钥
  • 更新 NTP 配置
  • 配置 snmpd
  • 部署监控脚本,如 SNMP Perl 扩展或 Nagios 脚本

我担心的是安全性和侵入性:

  1. 我不希望任何服务器能够看到它不应该看到的任何配置
  2. 我担心 Puppet Master 可能会受到受感染服务器的攻击
  3. 我不希望 Puppet 做出任何不应该做的更改,或者撤销在服务器上完成的任何手动更改。

我应该提醒一下,我从来没有在生产中使用过 Puppet,只是在测试实验室里快速玩了一下,所以我可能以错误的方式考虑了这一点!

答案1

尝试一下 Ansible (ansible.cc)。也许它适合你。你的客户端上没有运行代理。它发展得非常快。

另一个非常好的替代方案是 Salt Stack。

Ansible 和 Salt 很容易理解,如果你愿意的话,可以将它们用作命令行工具,就像分布式 shell 一样。

答案2

是的,这当然是可能的。不过,是否应该这样做则取决于你自己。

关于您的疑问:

1) 公平地说。流量基于 SSL,因此证书管理很重要。另外,不要相信客户端提供的任何与其身份相关的“事实”,因为这些事实可能会被客户端更改。您需要依靠客户端的 SSL 证书来提供服务器身份的身份验证。说实话,如果您正确使用 hiera 之类的东西,并避免在代码中使用大量基于主机名的 if 块(您确实应该这样做),那么您就没问题了。

2) 假设您保持修补,则不应该。正确配置后,Puppetmaster 受到客户端攻击的途径很小。话虽如此,如果它确实受到攻击,影响将非常大,因此请小心锁定它。

3) 这确实是一个测试和部署问题。如果你有可靠的 Puppet 代码,它就不会破坏你的文件。确实需要一点时间才能解决,但对于基本功能(如你需要的功能)来说,时间不长。

答案3

Puppet(或类似技术)是否是一种适合处理基本但关键的大规模变化的技术?

是的,可以这样使用。我用它来支持外部客户端系统。

我不希望任何服务器能够看到它不应该看到的任何配置

如果你正在使用 Puppet,你一定不然后启用自动签名。自动签名允许主机自动请求证书。您的配置和权限几乎肯定会直接与证书中的 CN 相关联。您不希望随机计算机上网并能够声称它们实际上是具有所有秘密高安全性内容的系统。

如果您真的很偏执,您可以调整 puppets 文件服务器设置以创建只有某些系统可以访问的共享。文件服务器访问基于证书。

我不希望 Puppet 做出任何不应该做的更改,或者撤销在服务器上完成的任何手动更改。

有几种不同的方法可以允许本地更改。

我经常使用的方法如下。基本上,如果你将一个列表传递给source,那么 puppet 会尝试列表中的每个项目。因此,我将列表中的第一个项目添加到指向本地文件。

  file { '/etc/ssh/sshd_config':
    ensure => present,
    source => ["/etc/ssh/sshd_config_local",
               "puppet:///modules/ssh/$ssh_config_file"],
    ...
  }

另一个选择是使用符号链接。如果有人想使用 Puppet 版本,他们可以符号链接到文件的 Puppet 版本。如果他们想在本地维护他们的配置,那么他们就不需要创建符号链接。

  file { '/etc/ssh/sshd_config_puppet':
    ensure => present,
    source => "puppet:///modules/ssh/$ssh_config_file",
    ...
  }

另一种可能性是使用 augeas 进行行级更改,而不是更改整个文件。对于更改的内容要非常谨慎。

答案4

我不希望 Puppet 做出任何不应该做的更改,或者撤销在服务器上完成的任何手动更改。

对于使用 Puppets 文件类型创建的配置文件,可以通过设置来实现:

replace => false,

我第一次将应用程序部署到服务器时使用它来生成一些配置文件,但是对该配置文件的任何编辑都不会被 Puppet 覆盖。

然而,这确实违背了 Puppet 作为幂等部署脚本的理念。

如果可以的话,最好将不受 puppet 管理的管理员可编辑文件与受 puppet 管理的文件中的内容分开。

相关内容