为什么在 shell 脚本上使用 Chef/Puppet?

res*_*ing 83 scripting provisioning configuration-management puppet chef

Puppet 和 Chef 工具的新功能。似乎他们正在做的工作可以用 shell 脚本来完成。也许它是在 shell 脚本中完成的,直到这些出现。

我同意它们更具可读性。但是,除了可读性之外,是否还有其他优于 shell 脚本的优点?

Pau*_*ear 57

特定领域的语言对您编写的代码量有很大影响。例如,您可能会争辩说:

chmod 640 /my/file
Run Code Online (Sandbox Code Playgroud)

file { "/my/file":
    mode => 640,
}
Run Code Online (Sandbox Code Playgroud)

但它们之间有很大的不同:

FILE=/my/file
chmod 640 $FILE
chown foo $FILE
chgrp bar $FILE
wget -O $FILE "http://my.puppet.server/dist/$FILE"
     # where the URL contains "Hello world"
Run Code Online (Sandbox Code Playgroud)

file { "/my/file":
    mode => 640,
    owner => foo,
    group => bar,
    content => "Hello world",
}
Run Code Online (Sandbox Code Playgroud)

如果 wget 失败会发生什么?你的脚本将如何处理?如果在您的脚本之后有某些内容需要 $FILE 包含正确的内容,会发生什么情况?

您可能会争辩说,可以只放入echo "Hello world" > $FILE脚本,但在第一个示例中,脚本必须在客户端上运行,而 puppet 在服务器上编译所有这些。因此,如果您更改内容,您只需在服务器上更改它,它会为您想要安装的任意数量的系统更改它。并且 puppet 会自动为您处理依赖项和传输问题。

没有可比性 - 适当的配置管理工具可以节省您的时间和复杂性。你尝试做的越多,越多的 shell 脚本看起来不够用,用 puppet 做它可以节省更多的精力。

  • @Paul Gear,从长远来看,说配置管理工具是可行的方法是过于简单化了。例如,使用 AWS 的 shell 脚本可以从头开始构建服务器,运行一些测试,一旦您确定 AWS 实例正常,就可以制作映像。然后,您可以将此映像部署到预览或暂存环境以进行进一步测试,一旦您验证该映像适合您的目的,您就可以推送到生产环境。在这种情况下,配置管理工具根本没有帮助。 (10认同)
  • 这不是一个很有说服力的例子。我可以从 wget 开始,然后我就不会处于奇怪的状态。如果任何步骤不成功,文件是否会像事务一样被回滚? (6认同)

ken*_*ada 33

这将是一个不受欢迎的观点,但配置管理系统不一定更好。有时候简单真的是最好的。

您选择的配置系统有一定的学习曲线和管理开销。毕竟,您正在引入依赖项。与任何自动化一样,您还必须注意在部署的配置中维护安全性。

我只有几个实例,我们部署了配置管理并且它卡住了。总是有大量系统具有重复配置并且需要执行可配置的千篇一律的部署。

  • 当管理环境的成本如此之高以至于管理自动化确实更便宜时。如果在 Git 中管理更改脚本或在 ssh 多路复用器中设置更简单,我们会这样做。对我来说最重要的是我监控系统并验证一切都按预期运行。只要我在配置错误时收到警报,它如何配置就不是那么重要了。 (10认同)
  • @ewwhite“你什么时候决定自动化与不自动化”http://xkcd.com/1205/ (10认同)
  • 与 Chef 或 Puppet 相比,更现代的工具(例如 Ansible)的部署/管理开销要少得多,几乎不需要依赖项(尤其是 Ansible 是无代理的)。这确实降低了采用的门槛。 (3认同)
  • @ewwhite 当您想要提高个人生产力时,您可以自动化。你通过自动化学习,而不是通过做平凡的任务来学习。学习=生产力提高和迭代改进。自动化与此相结合以产生更多的积极影响。这是一个积极的雪球,而不是一个消极的雪球。技术进步与技术债务。 (2认同)
  • @ABB 不,这不是暗示。我什至没有提到 shell 脚本,我提到自动化是一种普遍做法。您可以使用 shell 脚本自动化操作并学习脚本抽象而不是手动操作,这不仅可以节省您再次执行该任务的时间,还可以防止错误。此外,您应该能够比上一个脚本更好地编写下一个脚本。一个积极的雪球... 但是,如果您是编写脚本的专家,并且您不编写您将再次运行的脚本,那么它不会以任何方式帮助您学习或节省您的时间。 (2认同)

eww*_*ite 24

你已经回答了你自己的问题...

自动化正在变得更具可扩展性和形式化。如今,Puppet 和 Chef 被视为标准(查看招聘广告)。

拼凑在一起的 shell 脚本有其一席之地,但它们在DevOps 运动的背景下不可扩展。可读性是其中的一部分。

  • shell 脚本是否不那么正式化?引用招聘广告会使论点令人信服吗?DevOps 是一种耻辱,因为他/她作为开发人员没有得到充分利用。该链接并未真正说明可扩展性。是否声称 shell 脚本不可扩展?我认为 Puppet 很有趣,但不一定是因为答案中的原因。 (7认同)

小智 14

Chef 使管理和版本变得更容易复杂基础设施的设置,尤其是在任何类型的云环境中,而不必手动 ftp 或 scp 一堆以非标准化方式组织的 shell 脚本。根据您需要管理多少依赖关系,这种胜利的大小可能会有很大差异,这使得迁移到 CM 解决方案的决定对很多人来说并不明显。

Chef 的真正(通常是无名的)好处是幂等性。能够确定资源的状态而不管以重叠的兴趣运行的配方的组合是比 shell 脚本配置的巨大好处。如果您现在有用于配置的 shell 脚本,请问自己有多少可以多次运行而不会产生意外/不良后果?

适当的 CM 解决方案有助于通过简化跨平台自动化和团队协作来确保大规模成功。虽然可以通过组织良好、维护得当、版本化的 shell 脚本组来完成所有这些工作;你必须问自己“为什么”。Chef/Puppet 和类似技术的出现是因为一群才华横溢的 SysOps 厌倦了一遍又一遍地解决这些相同的问题,并着手为我们提供更好的选择。

关键部分:

  • 幂等性
  • 易于依赖管理(版本控制)
  • 标准化组织(在行业层面接受)
  • 从系统级细节中分离服务器配置任务的抽象
  • 利用社区知识的能力(保证接受上述所有原则)

  • ss 几乎不可能实现幂等性。依赖关系由 yum/apt 等管理得很好。接受是无关紧要的。社区知识存在于 ss。但是,我承认不必复制一堆脚本以及集中配置系统都是有用的。我听说 puppet 需要客户端代理。 (4认同)

小智 11

现代配置管理工具(例如 Puppet 和 Chef)允许您定义系统状态,而不必担心实现已配置服务器所需的活动

例如,您的 chmod 命令假定文件存在,拥有该文件的用户存在,目录已经创建,等等。因此,您的脚本必须考虑所有这些先决条件。

基于状态的配置管理工具更简单:您只关心文件是否具有正确的权限。如何实现是工具的问题。

  • 实际上,我的 `chmod` 并不假设该文件存在,因为该文件是由脚本创建的或由脚本测试是否存在的。 (2认同)

gWa*_*ldo 9

如果服务器对您来说是一次性的,或者您有理由一次站起来不止几个,那么成熟的 CM 系统将比一系列 shell 脚本更好地满足您的需求。

如果您的构建需求不大(或者喜欢手工制作有机自由放养公平贸易服务器),那么请保持简单。

就个人而言,在过去的演出中广泛使用 Chef,我试图在这次演出中“保持简单”,但我真的很想念 Chef 提供的原语、抽象和功能。即使您遇到可以从几个 shell 命令获得所需内容的情况,您也可以简单地使用“命令”块运行它们,输入您的 shell 命令,就像您在 shell 中编写它们一样。

话虽如此,您可以在没有服务器的情况下运行 Chef (chef-solo),而且我很确定 Puppet 有一个类似物,您仍然可以在不运行中央服务器的情况下利用其他人的食谱和食谱。

另一个好处是社区:有很多人(其中许多人会比你更聪明和/或更有经验)。就我个人而言,当其他人为我完成工作时,我喜欢它,通常比我更广泛。