木偶盐厨师合奏:比较Ansible,SaltStack,Chef和Puppet

今天,我们将讨论什么是SCM,并通过棱镜来讲述一些故事,我们将考虑Ansible,SaltStack,Chef和Puppet,为特定任务选择最佳选择。


该材料基于EPAM Systems首席系统工程师Andrei Filatov在我们的10月DevOops 2017大会上的报告的笔录。

什么是单片机,它与什么一起吃?




什么是单片机? 首先,它允许我们的基础架构从状态A通过执行一些代码来执行状态B,实际上不是DevOps工程师的许多开发人员都认为事情是以某种“自动”方式发生的。在基础设施上。

“自动”方法实现了我们的SCM(系统配置管理)。 这是为了什么 主要是为了构建可重复且一致的基础结构。 SCM很好地扩展了CI / CD流程。 由于这是代码,因此可以将其存储在任何版本控制系统中:Git,Mercurial。 开发和维护非常简单。

最后是一个封闭的自动化周期:从创建基础架构到部署基础架构和部署代码,所有工作都可以自动完成。

什么是单片机:Ansible




考虑我们的申请人。 第一个是Ansible。 它具有无代理架构,如果我们谈论的是开放源代码版本,它是用Python编写的,它具有类似Yaml的DSL,由于它是用Python编写的模块,因此很容易扩展,它非常简单且轻巧。 Ansible的入门门槛最低-您可以教任何人。

有一种经验,一个不了解Python,不了解SCM的人在短短两天内进入Ansible并已经开始做某事。
以下是ChatOps的示例:Slack中的通知程序。 看到Yaml的Ansible代码并不新鲜。

- block: - name: "SlackNotify : Deploy Start" local_action: module: slack token: "{{ slack_url }}" attachments: - title: "Deploy to {{ inventory_hostname }} has been Started" text: "<!here> :point_up_2:" color: "#551a8b" - include: configure.yml tags: - configure - include: remote-fetch.yml tags: - remote - include: assets.yml 



什么是单片机:厨师




Chef是一个客户端-服务器体系结构,有一个Chef服务器和一个Chef客户端。 用Ruby编写的基于搜索的配置具有Ruby DSL。 因此,在您的食谱和食谱中,您可以使用Ruby的全部功能,但我不建议您这样做。 Chef在所有SCM中拥有庞大的社区和最大的工具集。 这是Chef代码的样子,这是Jetty部署。

 # # Cookbook Name:: dg-app-edl # Recipe::fe # node.normal[:jetty][:home] = "/usr/share/jetty" node.normal[:jetty][:group] = "deploy" include_recipe "dg-auth::deploy" include_recipe "newrelic::repository" include_recipe "newrelic::server-monitor" include_recipe "dg-jetty::jetty9" include_recipe "newrelic::java-agent" directory "edl" do action :create owner group "deploy" mode "0775" path "/usr/share/where/edl" recursive true end 



什么是SCM:SaltStack




SaltStack既具有可使用Salt-SSH以推模式工作的无代理架构,又具有存在Salt-master和Salt-minion时的客户端-服务器架构。 重点是实时自动化,开箱即用地并行执行所有进程,并用Python编写。 这也是一种Yaml语言,其代码与Ansible非常相似。

 #ntp-packages: pkg.installed: - pkgs: - ntp - ntpdate #/etc/ntp.conf: file: - managed - source: salt://common/ntpd/ntp.conf - template: jinja - mode: 644 #/etc/sysconfig/ntpd: file: - managed - source: salt://common/ntpd/ntpd - template: jinja - mode: 644 #ntp-service: service.running: - name: ntpd 



什么是SCM:人偶




我们最后的竞标者是木偶。 它还具有客户端服务器架构,例如Chef,该配置不是基于搜索,而是基于用Ruby编写的Puppet-master附带的“事实”,具有类似Ruby的DSL。 但是,Puppet成员不允许在清单中使用纯Ruby代码。 这既是加号也是减号。 这是Puppet清单代码的样子:

 class { 'mysql::server' : root_password => 'password' } mysql::db{ ['test', 'test2', 'test3']: ensure => present, charset => 'utf8', require => Class['mysql::server'], } mysql::db{ 'test4': ensure => present, charset => 'latin1', } mysql::db{ 'test5': ensure => present, charset => 'binary', collate => 'binary', } 

实践中的供应链管理


非军事环境中的SaltStack


首先,我想分享一个用SaltStack编写的项目。 这是我们以前的项目,也是最新鲜的痛苦,而最新鲜的痛苦永远是最痛苦的。 我们的客户从事数据存储-这是用于将数据存储在GPFS,GlusterFS上的铁制服务器的生产,但是是定制版本。 他来完成以下任务:

  1. 创建一个USB / DVD安装程序。 您需要创建一个用于安装所有内容的介质。 对于居住在封闭区域的客户客户,服务器通常没有Internet。 我们需要打包一个ISO,发送给现场工程师,他们将在现场部署所需的一切。
  2. 部署产品集群。 客户拥有多个大型产品,我们必须能够以集群模式进行部署。
  3. 使用CLI实用程序管理,配置和维护群集。 我们的框架应帮助现场工程师管理集群。

客户有几个要求。 首先,他拥有大量的Python专业知识,实际上只有C和Python开发人员。 客户立即说:“我们要SaltStack”,别无选择。

我们要面对什么? 客户在安装中有几种产品,所有产品都必须与Salt-Masters一起使用。 但是我们面临着扩展多主站配置的问题。 例如,在NODE Info(特定服务器的状态)中,我们选择了两个主设备配置的毫秒数,选择三个主设备的秒数,选择五个主设备的秒数,则从未等待操作完成。 MultiMaster是一个很好的功能,但扩展性不佳。

我们遇到的第二个问题是团队合作:SaltStack具有Runner和Module。 模块是在机器端运行在Salt Minion上的扩展。 Runner在服务器端运行。 我们经常会发生争执:如何做Runner和做什么模块。

然后我们从cache.mine遇到了一个小惊喜:

 ime = ImeActions() id = __grains__['id'] if id == ime.master_id: ret = __salt__['mine.get'](id, 'ime_actions.make_bfs_uuid') ime_dict = ret.get(id, None) if not ime_dict: try: result = __salt__['mine.send']('ime_actions.make_bfs_uuid') except Exeption, e: log.error("Failed to generate uuid: {0}.".format(str(e))) result = False else: 

我们有一个用C编写的实用程序。我们运行它,它将生成一个随机ID。 它必须在集群中的所有参与者之间都是唯一的,我们需要在主服务器上执行一次此操作,然后在计算机之间分发它。 我们为此使用了cache.mine。 事实证明,他没有重新启动。



“种族状况。” 并行化是好的,但是在基本配置状态下。协调流程进入状态。如果发生长进程,则sls正在运行。 通过超时,他认为国家虽然已经在运行,但已经完成了,并正在尝试启动下一个国家。 发生错误。 并且此问题尚未解决。


您可以查看GitHub

除了SaltStack,我们还能使用什么?

DMZ环境中的SaltStack




  • 非军事区 厨师包很棒,木偶也一样。 使用Ansible,问题是-如果没有塔,则无法从我们的节点以“拉”模式启动配置,而这必须在非军事区完成。
  • CLI框架(在Python中)。 Chef和Puppet不太适合,但是如果您没有限制只使用Python,则可以用Ruby编写并使用Chef或Puppet API。 Ansible工具包不支持此功能。
  • 集群管理。 Chef也非常适合管理集群,Puppet也是如此,而Ansible最初是为管理Amazon上的集群而编写的。

大型动态环境中的厨师


客户提出了将所有资源整合到一个云中的任务-这就是Openstack。 在此之前,一切零散:Rackspace Cloud中的某些东西,专用服务器或其专用数据中心上的东西。

他们想要完全动态的资源管理,并且还希望他们的应用程序可以根据需要增加容量。 也就是说,我们需要一个完整的动态基础架构和一个上下完全动态的环境。

为了正确构建CD过程,您需要一个完全自动化的环境。 我们为他们创建了SDLC-软件开发生命周期,并将其应用到SCM中。 它们不仅通过了应用程序的集成测试,还通过了基础架构的集成测试。

因此,当我们遇到问题时,我们像Netflix的家伙一样,应该能够杀死有缺陷的资源,并将新鲜有保证的工人恢复到原来的位置。

我们遇到了什么问题:

  1. 在2013年,使用Chef 10进行了缓慢的搜索。 我们开始搜寻,走遍了所有的汽车,而且花了永远。 我们尝试使用命名约定以及选择和搜索fqdn来解决该问题。 这缩小了搜索范围,从而加快了搜索范围。

    但是某些操作需要在整个环境中完成。 因此,搜索从一开始就运行了一次,结果存储在属性中,然后使用Ruby过滤了结果:我们解析了所需的片段并做了所需的工作。

     if !Chef::Config[:solo] search(:node, "fqdn:*metro-#{node[:env]}-mongodb*").each do |mongo| @mongodbs << mongo.fqdn end else @mongodbs = ["lvs-metro-#{node[:env]}-mongodb3001.qa.example.com"] end 

    底线:使用命名约定,运行一次搜索,使用Ruby过滤所需的结果。
  2. 使用“ node.save”是不安全的,请当心。 我们在部署MySQL集群时遇到了这个问题,并在未完整配置的MySQL节点上的配方中使用了node.save。 在放大时,某些应用程序给出了500错误。 原来,我们在错误的时间保存了该节点:将其保存到Chef服务器,UI上的Chef客户端在此处拾取未在运行模式之前配置的新节点。
  3. 缺乏“散布”会杀死厨师服务器。 Splay是Chef客户端参数,使用它可以在客户端转到服务器进行配置时设置范围。 在繁重的负载下,当您需要同时部署多个节点时,这不会杀死服务器。

我们可以代替厨师使用什么?



  • 动态配置 SaltStack之所以完美,是因为它具有可在任何地方完美集成的SaltCloud。 Puppet具有类似的功能,但只有在Puppet Enterprise中才能使用。 如果该公司“生活”在亚马逊上,那么Ansible非常适合;如果有其他原因,您可以将其绑定到替代方案中,但是这样做并不方便。
  • SDLC。 Chef拥有从Test Kitchen到选择集成测试工具的所有内容。 SaltStack提供了所有可用的Python工具,现在Puppet拥有了所有功能。 Ansible具有角色规范,您可以使用Chef's Test Kitchen,但这不是本机工具。
  • 资源替换。 在Chef中一切都很好,在SaltStack中,您可以将SaltCloud完成所需的状态,在Puppet工具中仅适用于企业版,而Ansible仅适用于Amazon。

主厨的EPAM私有云


在AWS OpsWorks出现一年半之前,我们希望通过集成Chef创建一个高级Amazon CloudFormation,以便不仅可以部署资源,而且可以配置资源。

第二项全局任务是创建服务目录,以便客户和用户可以使用CLI来部署完全可用的LAMP堆栈。



我们选择了Chef,但是该项目必须支持不同的SCM。 我们从内置的Chef-Server开始,用户也可以使用自己的Chef-Server,该服务器托管在他们的某个位置。 也就是说,我们没有访问用户资源和笔记本电脑的权限,但是无论如何它都能正常工作。



任何SCM均可用于实施CloudFormation + OpsWork,每个人都适用。 要创建目录,除SaltStack之外的每个人都会做得很好。 SaltStack有其细微差别:要找到一个非常了解SaltStack并且可以创建服务并填写目录的专家,这非常困难。

SCM在EPAM中的普及




这些是EPAM中SCM受欢迎程度的统计数据。 SaltStack远远落后。 首先,Ansible是最简单的且具有较低的进入门槛。 当我们尝试在市场上找到具有SCM知识的人时,市场看起来几乎一样。

与Ansible合作


使用Ansible时可以给的提示:
  1. 使用“加速”,它的配置速度比SSH(对于el6)快2到6倍。 对于其他所有人,都有“流水线”。 为实现向后兼容性,已将其关闭,但重新打开流水线非常容易,我建议您这样做。
  2. 使用'with_items'

     - name: project apt dependencies installed apt: name: "{{ item }}" become: yes with_items: - build-essential - acl - git - curl - gnupg2 - libpcre3-dev - python-apt - python-pycurl - python-boto - imagemagick - libmysqlclient-dev # needed for data import 

    在此示例中,我们安装了软件包,该方案可用于创建用户和类似操作。
  3. 仔细使用'local_action'和'delegated'。 第一个可以让您获得类似于SaltStack Runner的功能,第二个可以将任务委派给特定的计算机。

     - name: create postgresql database postgresql_db: name: "{{ database_name }}" login_host: "{{ database_host }}" login_user: "{{ database_master_user }}" login_password: "{{ database_master_password }}" encoding: "UTF-8" lc_collate: "en_US.UTF-8" lc_ctype: "en_US.UTF-8" template: "template0" state: present delegate_to: "{{ groups.pg_servers|random}}" 

    这是数据库创建的一部分。 如果没有最后一行,则该操作将执行几次,而第二次尝试创建同一数据库。
  4. 使用标签优化您的角色和性能。 这样可以大大减少交货时间。

结论


对我来说,Ansible是我的最爱。 SaltStack非常好,非常灵活,但是需要Python知识,没有它们,SaltStack最好不要使用。 厨师是完成任何任务和任何规模的万能灵丹妙药,但比Ansible需要更多知识。 谁在使用Puppet-我不知道。 原则上,它与Chef非常相似,但有其细微差别。
分钟的广告。 如果您喜欢DevOops会议的这份报告-请注意,新的DevOops 2018将于10月14日在圣彼得堡举行,其计划中将会有很多有趣的事情。 该网站已经有第一批发言人和报告。

Source: https://habr.com/ru/post/zh-CN416763/


All Articles