25

目前我的所有部署脚本都在 shell 中,它安装了大约 10 个程序并对其进行配置。我看到它的方式 shell 是一个很棒的工具:

模块化:每个脚本只有一个程序,这样我可以将程序分布在不同的服务器上。

简单: Shell 脚本非常简单,不需要安装任何其他软件。

一键式:我只需要运行一次 shell 脚本,一切就都设置好了。

不可知论:大多数程序员都可以弄清楚 shell,不需要知道如何使用特定的程序。

版本控制:由于我的代码在GitHub 上,一个简单的 Git 拉取并重新启动所有主管将运行我的最新代码。

有了所有这些优点,为什么人们总是告诉我使用AnsibleChef之类的工具,而不是使用 shell?

4

1 回答 1

48

如果您让它们按您需要的方式工作,Shell 脚本并没有那么糟糕。

人们出于各种原因推荐其他工具(例如CFEnginePuppet、Chef、Ansible 等等),其中一些是:

  1. make人们使用类似工具而不是使用脚本实现构建系统的原因相同。
  2. 幂等性:确保它可以安全地重新运行任意次数的质量,并且在每次运行时,它要么达到所需的状态,要么保持在那里,或者至少在 //convergent 中更接近它// 方式。

    当然,您可以编写脚本以使最终结果是幂等的:

     # Crude example
     grep myhost /etc/hosts || echo '1.2.3.4  myhost' >> /etc/hosts 
    

    但是使用幂等工具要好得多。

  3. Shell 脚本是命令式的。Chef/Ansible/Puppet 等工具是声明性的。一般而言,在给定一定规模阈值的情况下,声明式会导致更高的生产力。

  4. DSL 会带走一些电力,但它们会给你带来秩序、清洁和其他类型的电力。我喜欢 shell 脚本,但我也喜欢 Ruby,而 Puppet 人也喜欢他们的语言!如果你仍然认为 shell 是要走的路,因为你更喜欢它,嘿,那你没有问题。

  5. [添加]可再分发、可重复使用的软件包。Ruby 有 gems,Perl 有 CPAN,Node 有 npm,Java 有 maven——所有这些语言都有自己的约定,即必须如何打包可重用源代码并与世界共享。

    Shell 脚本没有。

    Chef 有遵循约定的食谱,可以像将 gem 导入 ruby​​ 应用程序一样导入,从而为应用程序提供一些新功能。Puppet 有 puppetforge 和它的模块,Juju 有魅力(它们非常接近 shell 脚本,所以你可能会感兴趣)。

  6. 这些工具实际上帮助了他们!我是一个顽固的 shell 脚本编写者,现在仍然是,但是使用 Chef 让我可以早点回家,睡个好觉,保持控制,可以跨操作系统移植,避免混淆——我在放弃大规模后体验到的实实在在的好处服务器外壳脚本。

于 2013-10-31T10:23:03.823 回答