使用部署工具(例如Ansible)相比使用Shell的优势

29

目前我所有的部署脚本都是用shell编写的,它会安装约10个程序并进行配置。在我看来,Shell是一个非常好的工具:

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

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

一键式:只需运行一次Shell脚本,就可以设置好所有内容。

不受限制:大多数程序员都能够使用Shell,并不需要知道如何使用特定的程序。

版本控制:由于我的代码存储在GitHub上,所以只需要进行简单的Git拉取和重启supervisor即可运行最新的代码。

既然有了所有这些优势,为什么人们一直告诉我要使用像Ansible或者Chef这样的工具,而不是使用Shell呢?


1
我在这个主题上发现了一篇好文章。它很好地回答了当你试图说服系统管理员关注像chef/ansible/puppet这样的工具时所遇到的反复出现的问题:http://devopsu.com/blog/ansible-vs-shell-scripts/ - Mark O'Connor
5
这条问题被标记为“基于观点”的关闭,这正是我对stackoverflow感到恼火的原因。大多数重要事情都涉及判断(观点)。 - AdamC
只有“简单”和“不可知论”不适用于例如Ansible。 - jwg
1个回答

50

如果你已经使Shell脚本按照你的需求正常工作,那它们并不算太糟糕。

人们推荐其他工具(例如CFEngine、Puppet、Chef、Ansible等),原因有很多,其中一些包括:

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

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

     # 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有cookbook遵循惯例,并且可以以与将gem导入Ruby应用程序相同的方式导入, 为您的应用程序提供一些新的能力。Puppet有puppetforge和它的模块,Juju有charms(它们非常接近 shell脚本,所以你可能会感兴趣)。

  6. 这些工具实际上帮助了他们!我曾经是一个忠实的shell脚本编写者,现在仍然是, 但是使用Chef让我早点回家,睡个好觉,保持控制, 在不同的操作系统之间可移植,避免混淆-这些是我放弃大规模服务器shell脚本后体验到的有形利益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接