Ansible vs木偶

Ansible和Puppet是构建重复基础架构所需的配置管理系统(SCM)。

Ansible易于使用,具有无代理架构(不需要在目标系统上安装代理/客户端)和类似YAML的DSL(用Python编写并且可以通过模块轻松扩展)。通常管理Linux配置。

Puppet具有客户端-服务器体系结构(定期轮询服务器以更改由网络管理员进行的配置),它是用Ruby编写的,并且具有类似Ruby的DSL。此应用程序使您可以集中管理安装在多台计算机上的软件的配置。

本文比较了这些SCM的优缺点。



与90年代相比,如今,系统管理员和开发人员必须管理大量托管更多应用程序的服务器。原因是与虚拟化和云计算等新技术的出现相关的组织和公司的计算呈指数级增长。

因此,诸如Puppet和Ansible之类的工具迅速成为管理例如数据中心中大量服务器的必要组件。它们分别称为配置管理工具(CM)和远程执行(RE),通常与软件更新工具一起使用。这些有用的应用程序使网络管理员可以同时在多台服务器上执行操作,一键部署多个应用程序,从而大大简化了数十台,数百台甚至数千台服务器的配置和维护。

Ansible vs. Puppet:简要回顾


木偶是CM市场上最著名的品牌之一。它自2005年以来就存在,对于CM工具而言,它就等于人类诞生以来的存在。 Google,Reddit,Dell,PayPal,Oracle,Los Alamos Labs和Stanford University等许多大公司都使用Puppet管理数据中心。拥有此类客户总是可以使产品具有一定的信心。 Puppet还拥有最成熟的界面,并且可以在所有主要操作系统(Linux,Windows,Unix甚至Mac OS X)上运行。遵循各种Linux版本创建的模型,该开源应用程序是用Ruby开发的。但是,有一家实力雄厚的PuppetLabs支持和赞助公司,提供专业支持和该软件的商业公司版本。

Puppet还提供了简单的安装过程和多种工具来完成诸如快速部署到客户端服务器的任务。除了GUI外,还有一个基于Ruby的CLI。实际上,对于大多数高级任务,您很可能将不得不依赖CLI,而GUI是用于查看,管理和监视的界面。这意味着除了以系统管理员身份工作外,您还需要学习Ruby。



您可能会想:“这听起来很棒!在专业的CM论坛上使用此SCM的辩论是,与许多其他软件巨头一样,Puppet一直是其自身成功和规模的牺牲品。是否有任何不利之处,还是现在值得购买Puppet? “灵活”和“敏捷”不是可以用来形容木偶作品的词。用户报告的错误需要花费很长时间才能修复并忽略新请求。 PuppetLabs不断推动其客户接受商业版本这一事实也引起了一些不满。最后,尽管Puppet在CLI上同时支持纯Ruby及其配置的DSL,但不建议仅支持Ruby。对于那些只学习Ruby而不学习DSL的人来说,这是个坏消息。

Ansible绕过了Puppet,在配置管理行业占据了最大的市场份额 -26.5%。其次是Microsoft System Center CM(21.8%)和Puppet(12%)。



它也是2012年发布的开源产品,此后得到了AnsibleWorks的支持。它是用Python而不是Ruby开发的,从精神上讲,它比Puppet更接近Salt(另一个新的CM工具)。 Python的另一个优点是,它已内置在大多数Unix和Linux应用程序中,因此以该语言编写的SCM可以安装并运行得更快。

Ansible独特的营销策略在于其轻松快速的部署。实际上,该系统甚至不使用已部署的代理与主客户端进行通信;相反,所有功能都是通过SSH执行的。对于不支持root SSH的那些配置,Ansible可以以root用户身份运行“ sudo”。可以从CLI启动Ansible,而无需使用配置文件来完成简单的任务,例如检查服务的运行或启动更新和重新启动。对于更复杂的任务,使用YAML语法在称为“剧本”的配置文件中处理Ansible配置。 Ansible命令几乎可以用任何一种编程语言编写,并可以作为通用JSON模块分发,这显然比选择一种特定语言更具优势。

Ansible通过一种用于传统配置任务的新方法变得越来越流行,许多公司使用它来部署大型数据中心。

Ansible发烧友社区正在通过增加支持的设备数量,集成更好的Windows支持,改善生态系统等来努力取得成功。

Ansible与Puppet:安装差异


从安装系统开始,Ansible或Puppet之间的区别就显而易见。由于它们遵循不同的体系结构范例,因此它们的设置有很大不同。因此,Ansible的明确目标是使设置过程尽可能简单,这体现在用户体验中。



要配置Ansible,您首先需要指定一个节点作为控制节点。实际上,您的任何节点都可以是管理节点。您可以使用发行版软件包存储库中的最新Ansible软件包在该节点上安装Ansible,而无需在其他节点上配置客户端软件。只需在管理节点上创建SSH密钥对,然后将它们复制到其他节点即可。接下来,为Ansible节点创建清单文件-通常在Linux操作系统(如Red Hat Linux,Ubuntu和Debian)上,这发生在/ etc / ansible / hosts中。现在您可以使用Ansible在主机和网络基础设施的其余部分上启动PlayBook。Ansible将使用与您的控制节点的SSH连接来触发基于PlayBook的配置管理。

设置Puppet看起来有些复杂,但是Internet上有很多文档可以在困难的情况下提供帮助。首先,您需要配置主节点和代理节点,以便它们具有相同的时间和时区。然后,您需要使用root特权进入主服务器并安装Puppet服务器软件。接下来,您需要配置Puppet向导文件/ etc / hosts以连接所有受管客户端,启动PuppetServer服务并将其置于“启用”模式以在端口8140上接收客户端连接。由于Puppet依赖于客户端软件,因此您需要安装Puppet软件代理在每个。

另外,您需要在/ etc / hosts中添加主服务器的IP地址,以便客户端可以连接到它。为此,您必须在每个客户端上启动并启用Puppet代理服务,然后生成SSL证书,因为此CM系统使用HTTPS进行主客户端通信。

在这两种情况下,都必须加强服务器的安全性,以排除未授权连接的可能性。

Ansible与Puppet:可伸缩性和配置传输机制


两种SCM都可以很好地扩展,但是使用不同的配置传输机制来实现这一目标。实际上,不管您是否需要管理数十万或数万个节点,都可以在每个平台上使用一些技巧和策略来方便地扩展到所需的级别。



默认情况下,Ansible使用智能传输机制,该机制基于受信任的SSH证书。 Ansible首先将分析PlayBooks并确定受影响的基础架构元素。然后,她将打开SSH连接并创建一个临时目录。关闭此连接后,Ansible打开第二个连接以复制Ansible模块代码和Ansible模板代码。 Ansible将在打开第三个最终连接以执行代码之前关闭此连接。此设置可用于大多数目的,但是可以随着基础架构的扩展而更改。

Ansible可以使用的第一个功能称为ControlPersist,它依赖于持久性套接字,以减少交换多个连接所需的握手所需的时间。 Ansible还支持管道传输,该配置可将所需的连接数量从三个减少到一个。最后,可以通过在此系统的配置中设置forks变量,将Ansible配置为同时处理更多清单节点。默认情况下,此值为5,但是您可以设置更高的值以加快处理速度。



人偶传输机制是HTTPS,它使用SSL证书进行管理。一台Puppet服务器处理整个Puppet客户端列表的配置请求。每个客户端都将Puppet事实发送到主服务器,并发送到Puppet目录的请求,之后主服务器发送此目录作为响应。然后,客户端处理目录,检查目录中指定的具有所需配置状态的每个软件资源。如果资源未处于所需状态,则Puppet客户端将在此计算机上更新资源,并且在更新完成后,会将有关已完成的配置更改的报告发送到Puppet服务器。



值得注意的是,Puppet处理模型从线程池分配一个JRuby线程来处理每个传入的客户端连接。随着节点数量的增加,可以通过增加池中可用的JRuby线程的数量来优化Puppet缩放。这可以通过将Puppet“ max-active-instances”配置参数设置为高于默认值1来完成。通常,此值假定等于计算机的处理器核心数,但是请记住,这将需要更多CPU内存使用的RAM RAM。通常,您还需要为Puppet服务器的JVM设置更高的“最大堆大小”,以确保您可以分配其他JRuby线程而不会出现Java内存不足错误。进行此设置时必须小心,因为这可能会导致性能下降。

CM Ansible代码示例


对于日常配置工作,由于以下两个因素的结合,编写Ansible代码非常简单:将YAML格式用于PlayBooks和声明式的配置管理样式可以消除“尖锐的角落”。这对于快速提高DevOps命令的性能,并确保即使对于复杂的配置任务,您的代码也是可管理的,这一点很重要。

Ansible代码是幂等的。这意味着您可以安全地一次又一次地为系统组件运行PlayBook,而不会破坏服务器。 Ansible仅会更改超出所需状态的服务器上的软件资源配置。例如,如果您的PlayBook需要安装软件包并在磁盘上创建特定的配置文件,则Ansible将仅安装该软件包并创建在主机上首次启动PlayBook时指定的配置文件。随后启动PlayBook会自动使程序包完好无损,直到有任何更改会删除或修改指定的文件或程序包配置为止。这使您的节点保持可预测的确定性状态,很少或几乎没有配置漂移的机会。

以下是Ansible PlayBook代码示例,该代码将Tomcat Web服务器安装在您的站点上。该示例摘自Ansible 官方示例存储库,您应该仔细阅读该存储库以更好地熟悉Ansible惯用风格:

---
- name: Install Java 1.7
yum: name=java-1.7.0-openjdk state=present

- name: add group "tomcat"
group: name=tomcat

- name: add user "tomcat"
user: name=tomcat group=tomcat home=/usr/share/tomcat createhome=no
become: True
become_method: sudo

- name: Download Tomcat
get_url: url=http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61.tar.gz dest=/opt/apache-tomcat-7.0.61.tar.gz

- name: Extract archive
command: chdir=/usr/share /bin/tar xvf /opt/apache-tomcat-7.0.61.tar.gz -C /opt/ creates=/opt/apache-tomcat-7.0.61

- name: Symlink install directory
file: src=/opt/apache-tomcat-7.0.61 path=/usr/share/tomcat state=link

- name: Change ownership of Tomcat installation
file: path=/usr/share/tomcat/ owner=tomcat group=tomcat state=directory recurse=yes

- name: Configure Tomcat server
template: src=server.xml dest=/usr/share/tomcat/conf/
notify: restart tomcat

- name: Configure Tomcat users
template: src=tomcat-users.xml dest=/usr/share/tomcat/conf/
notify: restart tomcat

- name: Install Tomcat init script
copy: src=tomcat-initscript.sh dest=/etc/init.d/tomcat mode=0755

- name: Start Tomcat
service: name=tomcat state=started enabled=yes

- name: deploy iptables rules
template: src=iptables-save dest=/etc/sysconfig/iptables
when: "ansible_os_family == 'RedHat' and ansible_distribution_major_version == '6'"
notify: restart iptables

- name: insert firewalld rule for tomcat http port
firewalld: port=/tcp permanent=true state=enabled immediate=yes
when: "ansible_os_family == 'RedHat' and ansible_distribution_major_version == '7'"

- name: insert firewalld rule for tomcat https port
firewalld: port=/tcp permanent=true state=enabled immediate=yes
when: "ansible_os_family == 'RedHat' and ansible_distribution_major_version == '7'"

- name: wait for tomcat to start
wait_for: port=

这个特定的Ansible任务下载并安装Apache Tomcat以及相关的Java JDK 1.7,然后配置,启动和安装Tomcat。从该示例可以看到,Ansible驱动的文件可以包含Jinja模板,这简化了值的计算并使您的配置更加灵活。对于系统管理员和开发人员而言,YAML代码都易于读取和编写。这导致Ansible成为高级用户和新手用户都可以负担的配置管理系统的事实。

CM人偶代码示例


面向主题的语言Puppet基于Ruby,但是其语法更接近命令式C风格语言,如Perl,Java和C ++。这种方法是熟悉Ruby的开发人员和可能不熟悉这种语言的开发人员之间的中介。结果,您可能完全不需要了解Ruby就能有效地学习和使用Puppet DSL。
这是来自PuppetLabs MySQL Puppet Module存储库中的Puppet清单的示例,该库安装和配置MySQL客户端软件包:

# @summary
#     Installs and configures the MySQL client.
#
# @example Install the MySQL client
#     class {'::mysql::client':
#         package_name => 'mysql-client',
#         package_ensure => 'present',
#         bindings_enable => true,
#     }
#
# @param bindings_enable
#     Whether to automatically install all bindings. Valid values are `true`, `false`. Default to `false`.
# @param install_options
#     Array of install options for managed package resources. You must pass the appropriate options for the package manager.
# @param package_ensure
#     Whether the MySQL package should be present, absent, or a specific version. Valid values are 'present', 'absent', or 'x.y.z'.
# @param package_manage
#     Whether to manage the MySQL client package. Defaults to `true`.
# @param package_name
#     The name of the MySQL client package to install.
#
class mysql::client (
    $bindings_enable = $mysql::params::bindings_enable,
    $install_options = undef,
    $package_ensure = $mysql::params::client_package_ensure,
    $package_manage = $mysql::params::client_package_manage,
    $package_name = $mysql::params::client_package_name,
)  inherits mysql::params {
    
    include '::mysql::client::install'

    if $bindings_enable {
        class { 'mysql::bindings':
            java_enable => true,
            perl_enable => true,
            php_enable => true,
            python_enable => true,
            ruby_enable => true,
        }
    }

# Anchor pattern workaround to avoid resources of mysql::client::install to
# "float off" outside mysql::client
anchor { 'mysql::client::start': }
-> Class['mysql::client::install']
-> anchor { 'mysql::client::end': }
}

Puppet的一个重要优点是,与上面列出的命令式编程语言不同,Puppet DSL在某些方面类似于XML和上面的Ansible代码示例中的YAML代码都是声明性的。在两个代码示例中都确实跟踪了Puppet和Ansible的声明性方法。在编码方面,它们比Chef之类的工具相似且彼此更接近。但是,声明性语言Puppet还提供了类似Ruby的构造,例如条件表达式和迭代,这再次成为Ruby用户和不讲该语言的用户的折衷方案。

Ansible vs. Puppet:易于使用


对于开发团队来说,易用性应该是评估SCM的重要部分。鉴于Ansible开发人员将大量精力集中在系统的易用性上,因此没有竞争对手。配置,编程和管理节点为开发工程师和系统管理员提供了非常简单的界面。

这并不意味着Puppet难以使用,只是当您遵循建议的基础架构自动化方法时,该系统就会表现出自信。在这个领域中,Puppet非常强大,可以对每个资源进行显式建模,并为用户提供具有可在清单中有效使用的标准行为的模块。

在用户学习方面,两个平台都易于使用,但是Ansible却有一点优势。实现声明性YAML样式很容易,因此Ansible代码从来不会太复杂。同时,Puppet已经认识到与在同一源文件中组合数据和代码相关的一些问题。这导致了Puppet Hiera的出现,Puppet Hiera是一种使用YAML格式存储配置数据的键值对的存储解决方案。Hiera在简化和优化Puppet DevOps体验方面大有帮助。已证明YAML格式在配置管理中非常流行,SaltStack的Salt也使用此格式。
从语法检查到基础架构即代码的集成,这两个SCM均具有验证和测试CM的能力。

Ansible与Puppet:许可和实施成本





作为开源工具,Ansible和Puppet在许可策略上有很多共同点。

Ansible的开源版本是完全免费的。鼓励需要更多安全性,稳定性和可靠性保证的公司升级到Red Hat Linux附带的企业级产品Ansible Engine。Ansible Engine的许可费用通常为每个节点每年47.50美元至70美元,具体取决于您的首选配置。

如果您需要快速故障排除的技术支持,则应使用企业版。Ansible Tower大型企业管理工具作为服务包提供,并通过图形控制面板为您的公司提供更多培训,管理和作业计划功能。

像Ansible一样,开源Puppet版本是免费提供的。对于其他公司功能和技术支持,组织可以升级到Puppet Enterprise,每个节点每年的费用从112美元到199美元。Puppet Enterprise提供了一系列工具包,包括报告和监视企业基础结构的状态。

Ansible vs Puppet:社区


Puppet于2005年发布,是一种较旧的DevOps工具,因此它有更多时间来创建自己的社区和用户群。尽管如此,凭借其新方法,于2012年推出的Ansible能够吸引更多的受众,并创建了一个由开发爱好者和用户组成的充满活力的社区。 Puppet用户包括Uber,Salesforce和Paypal等公司,而Ansible社区包括Digital Ocean,9GAG和TypeForm等公司。

如果我们将开源产品开发的重要指标与GitHub上参与开发的贡献者数量进行比较,则Ansible拥有4,800多个贡献者,远远超过Puppet的527位产品开发者。近年来,Ansible的发展是如此之快,以至于它催生了一个独立的“银河” Ansible Galaxy存储库的创建。这意味着Ansible社区努力共享其代码,从而为产品的进一步开发做出了贡献。

同时,发展缓慢且稳定的Puppet社区创建了一个基础架构,以使其更容易找到满足您的SCM需求的解决方案。Puppet Forge提供了用于Puppet社区的常见配置管理任务的模块。

这两个系统均具有一流的工具,可通过命令行监视配置管理项目的生命周期。Puppet和Ansible都可以与其他广泛使用的DevOps系统很好地集成,例如Docker,Kubernetes和Jenkins,以及AWS和Azure云计算平台。

Ansible vs Puppet:哪个更好?


在这件事上,选择权是您的。 Ansible和Puppet的声明式样式意味着这些工具比其他配置管理系统有更多的共同点。但是,要做出最佳选择,您需要特别注意团队的需求与特定SCM的设计和优势如何结合在一起。
Ansible更适合对YAML样式的配置感兴趣并分享Ansible的哲学的人,即尽可能简单,同时快速且同时管理大量计算机,这些人更合适。此外,该理念侧重于使用现有的SSH功能,而不是创建用户代理。

Puppet更适合喜欢DSL的团队,后者以一致,重复的方式对系统资源进行建模。这正是Puppet DSL所做的事情,以及使大型团队可预测且容易实现的整个工具生态系统。

如果您确切地知道哪种配置管理原则最适合您的需求,那么在Puppet和Ansible之间进行选择对您来说就不是问题。

发现


为了方便您进行选择,我们建议您熟悉两种系统的主要优点和缺点。



一点广告:)


感谢您与我们在一起。你喜欢我们的文章吗?想看更多有趣的资料吗?通过下订单或向您的朋友推荐给开发人员的基于云的VPS,最低价格为4.99美元这是我们为您发明的入门级服务器 独特类似物:关于VPS(KVM)E5-2697 v3(6核)的全部真相10GB DDR4 480GB SSD 1Gbps从$ 19还是如何划分服务器?(RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

阿姆斯特丹的Equinix Tier IV数据中心的戴尔R730xd便宜2倍吗?在荷兰,我们有2台Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100电视戴尔R420-2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB-$ 99起!阅读有关如何构建基础设施大厦的信息。使用Dell R730xd E5-2650 v4服务器花费一欧元9000欧元的c类?

All Articles