我们希望听到您的意见!帮助我们深入了解 Ansible 生态系统的现状。
参加 2024 年 Ansible 项目调查

事件驱动 Ansible 入门

事件驱动 Ansible 入门

随着一项技术的进步,它扩展了其他技术的可能性,并为我们今天面临的挑战提供了明天的解决方案。AnsibleFest 2022 为我们带来了 Ansible 自动化的全新进步,这些进步既光彩夺目又极具创新意义。我指的是事件驱动 Ansible 开发者预览。

自动化使我们能够为我们的系统和技术提供速度和敏捷性,同时最大程度地减少人为错误。但是,当涉及到故障单和问题时,我们通常会采用传统的、人工的方法进行故障排除和信息收集。我们本质上是在减慢速度,并打乱我们的业务。我们必须收集信息,尝试我们的常见故障排除步骤,与不同的团队确认,最后,我们需要休息。

下图说明了一个包含许多人工步骤和交接的支撑生命周期

support lifecycle diagram

事件驱动 Ansible 的一个应用是在接近实时之前修复技术问题,或者至少触发故障排除和信息收集,以尝试找出停机的根本原因,同时您的支撑团队处理其他问题。

下图说明了事件驱动自动化如何在支撑生命周期中使用:更少的步骤,更快的平均恢复时间。

Event-Driven Ansible in the support lifecycle

事件驱动 Ansible 有可能改变我们对问题的响应方式,并照亮许多新的自动化可能性。那么,您如何使用事件驱动 Ansible 迈出下一步呢?

让我们开始吧!

事件驱动 Ansible 目前处于开发者预览版,但是我们没有理由不能安装 ansible-rulebook,它是事件驱动 Ansible 的 CLI 组件,并构建我们的第一个规则手册。事件驱动 Ansible 包含一个使用 Drools 构建的决策框架。我们需要一个规则手册来告诉系统要标记哪些事件以及如何响应这些事件。这些规则手册也是在 YAML 中创建的,并且像传统的 Ansible 剧本一样使用,因此这使得理解和构建我们需要的规则手册变得更容易。剧本和规则手册之间的一个关键区别是在规则手册中为了使事件驱动自动化方法起作用而需要的 If-this-then-that 编码。

规则手册由三个主要部分组成

  • 来源定义我们将使用哪个事件源。这些源来自源插件,这些插件已被构建以适应常见的用例。随着时间的推移,将会有越来越多的来源可用。目前已经提供了一些源插件,包括:webhooks、Kafka、Azure 服务总线、文件更改和 alertmanager。

  • 规则定义我们将从事件源中尝试匹配的条件。如果条件满足,那么我们可以触发一个操作。

  • 操作触发满足条件时需要发生的操作。一些当前的操作包括:run_playbook、run_module、set_fact、post_event 和 debug。

getting-started-with-event-driven-ansible

现在,让我们安装 ansible-rulebook 并从我们的第一个事件开始。

要安装 ansible-rulebook,我们可以安装我们的 Galaxy 集合,它包含一个用于安装我们所需的一切的剧本。

ansible-galaxy collection install ansible.eda

安装集合后,您可以运行 install-rulebook-cli.yml 剧本。这将安装您在命令行上使用 ansible-rulebook 入门所需的一切。目前,这在 Mac 和 Fedora 上受支持。

注意:现在,您也可以跳过上面的方法,并使用 pip 安装 ansible-rulebook,然后安装 ansible.eda 集合。如果您使用此方法,则需要 Java 11+,我们建议使用 openjdk。(如果您使用先前安装方法,则无需执行此步骤。)

pip install ansible-rulebook

ansible-galaxy collection install ansible.eda

如果您想为 ansible-rulebook 贡献代码,您也可以将以下 GitHub 存储库 分叉。此存储库还包含有关设置开发环境以及如何构建测试容器的说明。

让我们构建一个示例规则手册,该手册将从 webhook 触发一个操作。我们将查找 webhook 中的特定有效负载,如果 webhook 事件中满足该条件,则 ansible-rulebook 将触发所需的行动。以下是我们的示例规则手册

---
- name: Listen for events on a webhook
 hosts: all

 ## Define our source for events

 sources:
   - ansible.eda.webhook:
       host: 0.0.0.0
       port: 5000

 ## Define the conditions we are looking for

 rules:
   - name: Say Hello
     condition: event.payload.message == "Ansible is super cool!"

 ## Define the action we should take should the condition be met

     action:
       run_playbook:
         name: say-what.yml

如果我们看一下这个示例,我们可以看到规则手册的结构。我们的源、规则和操作已定义。我们正在使用 ansible.eda 集合中的 webhook 源插件,并且我们正在查找来自 webhook 的包含“Ansible is super cool”的消息有效负载。满足此条件后,我们将定义的操作将被触发,在本例中,它是触发一个剧本。

关于 ansible-rulebook 需要注意的一点是,它不像 ansible-playbook 那样运行一个剧本,并且一旦剧本完成,它就会退出。使用 ansible-rulebook,它将继续运行,等待事件并匹配这些事件。它只会在关闭操作时退出,或者如果事件源本身存在问题,例如,如果您正在使用 url-check 插件监控的网站停止工作。

构建好规则手册后,我们只需告诉 ansible-rulebook 将其用作规则集并等待事件

root@ansible-rulebook:/root# ansible-rulebook --rules webhook-example.yml -i inventory.yml --verbose

INFO:ansible_events:Starting sources
INFO:ansible_events:Starting sources
INFO:ansible_events:Starting rules
INFO:root:run_ruleset
INFO:root:{'all': [{'m': {'payload.message': 'Ansible is super cool!'}}], 'run': <function make_fn.<locals>.fn at 0x7ff962418040>}
INFO:root:Waiting for event
INFO:root:load source
INFO:root:load source filters
INFO:root:Calling main in ansible.eda.webhook

现在,ansible-rulebook 准备就绪,它正在等待事件匹配。如果 webhook 被触发,但有效负载与规则手册中的条件不匹配,我们可以在 ansible-rulebook 的详细输出中看到它

…
INFO:root:Calling main in ansible.eda.webhook
INFO:aiohttp.access:127.0.0.1 [14/Oct/2022:09:49:32 +0000] "POST /endpoint HTTP/1.1" 200 158 "-" "curl/7.61.1"
INFO:root:Waiting for event

但是,一旦我们的有效负载与我们正在查找的内容匹配,魔法就会发生,因此我们将模拟具有正确有效负载的 webhook

curl -H 'Content-Type: application/json' -d "{\"message\": \"Ansible is super cool\"}" 127.0.0.1:5000/endpoint

INFO:root:Calling main in ansible.eda.webhook
INFO:aiohttp.access:127.0.0.1 [14/Oct/2022:09:50:28 +0000] "POST /endpoint HTTP/1.1" 200 158 "-" "curl/7.61.1"
INFO:root:calling Say Hello
INFO:root:call_action run_playbook
INFO:root:substitute_variables [{'name': 'say-what.yml'}] [{'event': {'payload': {'message': 'Ansible is super cool'}, 'meta': {'endpoint': 'endpoint', 'headers': {'Host': '127.0.0.1:5000', 'User-Agent': 'curl/7.61.1', 'Accept': '*/*', 'Content-Type': 'application/json', 'Content-Length': '36'}}}, 'fact': {'payload': {'message': 'Ansible is super cool'}, 'meta': {'endpoint': 'endpoint', 'headers': {'Host': '127.0.0.1:5000', 'User-Agent': 'curl/7.61.1', 'Accept': '*/*', 'Content-Type': 'application/json', 'Content-Length': '36'}}}}]
INFO:root:action args: {'name': 'say-what.yml'}
INFO:root:running Ansible playbook: say-what.yml
INFO:root:Calling Ansible runner

PLAY [say thanks] **************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "Thank you, my friend!"
}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

INFO:root:Waiting for event

从上面的输出中可以看出,条件是从 webhook 中满足的,ansible-rulebook 随后触发了我们的操作,该操作是运行_剧本。我们定义的剧本随后被触发,并且一旦它完成,我们可以看到我们恢复到“等待事件”。

事件驱动 Ansible 为我们环境的更快解决和更强大的自动化观察打开了可能性。它有可能简化许多技术人员和睡眠不足的工程师的生活。目前的 ansible-rulebook 很容易学习和使用,并且图形用户界面 EDA-Server 将进一步简化这一点。

您接下来可以做什么?

无论您是开始您的自动化之旅还是经验丰富的资深人士,都有多种资源可以增强您的自动化知识




介绍事件驱动 Ansible 开发者预览

介绍事件驱动 Ansible 开发者预览

今天在 AnsibleFest 2022 上,Red Hat 宣布了针对事件驱动 Ansible 的激动人心的新开发者预览版。大多数客户都在朝着全面的端到端自动化迈进,并且在这个过程中有很多途径可供选择。事件驱动 Ansible 是一种增强和扩展自动化的全新方式。它提高了 IT 速度和敏捷性,同时实现了一致性和弹性。

通过完全自动化必要但例行的任务,您和您的团队将有更多时间专注于有趣的工程挑战和新创新。例如,如果您不再需要暂停重要工作来手动将技术细节添加到服务单中,会怎么样?或者处理用户密码重置请求?或者重置路由器作为第一个故障排除步骤?使用事件驱动 Ansible,您可以大幅减少日常工作中的摩擦,腾出更多时间来处理重要项目,并获得一些工作与生活的平衡。

为什么是开发者预览版?

事件驱动 Ansible 技术由 Red Hat 开发,并在 GitHub 上作为开发者预览版提供。社区的输入至关重要。由于我们正在构建一个解决方案来最好地满足您的需求,因此我们提供了一个机会让您为这些需求代言。我们要求技术提供商和最终用户尝试一下,并告诉我们您的想法。您可以通过多种方式提供反馈 - 在 GitHub 中发表评论、在我们的 2022 年 11 月 16 日的办公时间 期间,或通过 [email protected] 邮箱。

事件驱动自动化是生态系统的一部分

任何事件驱动解决方案都必须能够在多供应商环境中工作。因此,我们要求技术合作伙伴不仅尝试事件驱动 Ansible 开发者预览版,而且开始构建 Ansible 内容集合,以便我们的解决方案相互补充,并使联合客户更快、更容易地使用它们。

旨在简化

事件驱动 Ansible 旨在简化和灵活,就像我们今天在 Red Hat Ansible 自动化平台中提供的那样。对于事件驱动 Ansible,我们的意思是?

到目前为止,大多数事件驱动和“自我修复”自动化项目交付起来都很复杂且耗时,因为很大一部分解决方案是为满足单一需求而定制开发的。例如,当出现某些活动模式时自动关闭网络防火墙,然后通知相关团队。这是一个很棒且必不可少的解决方案 - 仅针对此一个需求。

事件驱动 Ansible 的设计旨在更灵活,并提供更快、更经济高效的方式来启动跨任何用例的全新自动化项目。通过编写 Ansible 规则手册(类似于 Ansible 剧本,但更面向“if-then”场景),并允许事件驱动 Ansible 订阅事件侦听源,您的团队可以更快、更容易地在整个组织中自动化各种任务。

想象一下一个活动扳手:一个可以轻松调节以适应不同尺寸螺栓的工具。这里也是同样的理念——一个可以满足各种 IT 自动化需求的自动化工具。

什么是事件驱动型 Ansible?

事件驱动型 Ansible 是一种高度可扩展、灵活的自动化功能,可与其他软件供应商的监控工具等事件源协同工作。在一个自动修复用例中,这些供应商工具会监控您的 IT 解决方案并识别“事件”,例如中断。事件驱动型 Ansible 将您团队关于如何针对识别出的事件(例如我们示例中的中断)采取行动的技术信息记录为 Ansible Rulebooks 中的规则。当此事件(中断)发生时,事件驱动型 Ansible 会将规则与“事件”(中断)匹配,并自动实施规则手册中记录的更改或响应以处理事件。在我们示例中的中断情况下,这可能是一个操作,例如重置或重新启动未响应的资产。

EDA diagram

事件驱动型 Ansible 模型中有三个主要构建块:源、规则和操作,它们在完成上述工作流中起着关键作用。

  • 是第三方供应商工具,提供事件。它们定义和识别事件发生的位置,然后将它们传递给事件驱动型 Ansible。当前源支持包括 Prometheus、Sensu、Red Hat 解决方案、Webhook 和 Kafka,以及自定义的“自备”源。
  • 规则 通过 Ansible Rulebooks 记录您希望对事件进行的处理。它们使用熟悉的类似 YAML 的结构,并遵循“如果这样,那么那样”模型。Ansible Rulebooks 可以调用 Ansible Playbooks 或具有直接模块执行功能。
  • 操作 是事件发生时执行 Ansible Rulebook 指令的结果。

关于集成的更多信息

事件驱动型 Ansible 允许您订阅源,监听事件,然后对这些事件采取行动。目前,我们已经创建了许多可以使用的源插件。

我们通过为 Webhook 和 Kafka 提供事件源插件,使来自合作伙伴技术的事件成为可能。许多合作伙伴工具可以使用 Kafka 和 Webhook 来集成到事件驱动型 Ansible 生态系统中。一旦事件驱动型 Ansible 从这些源接收到事件,它就可以根据您在 Ansible Rulebooks 中指定的指令,为它们分配规则。技术提供商还可以开发事件源插件,这些插件将他们的工具与事件驱动型 Ansible 更直接地集成,并通过内容集合进行分发。

还支持开源插件。这些插件使事件驱动型 Ansible 能够处理许多不同的事件。它们包括:

  • Kafka 用于事件流
  • Webhook
  • watchdog,一个文件系统监视器
  • url_check 用于检查 URL 的状态
  • Range,一个事件生成插件
  • File,从 YAML 加载事实
  • 路线图集成支持从云服务提供商进行处理

除了所有这些使事件能够触发操作的集成之外,重要的是要注意 Red Hat Ansible Automation Platform 不需要在接收自动操作的目标解决方案上存在代理。这对于无法托管代理的技术(例如边缘设备或网络路由器)来说很方便和理想——并且使事件驱动型 Ansible 成为一个更易于部署的解决方案。

从小处着手,放眼未来:推荐的用例

Red Hat 通常建议采用“从小处着手,放眼未来”的方法来提高您的自动化成熟度,事件驱动型 Ansible 也不例外。我们认为 IT 服务管理是一个很好的起点,我们建议您寻找经常重复的简单任务,以便看到最大的收益。

您可以使用事件驱动型 Ansible Rulebooks 来增强服务票证,对票证和问题进行基本修复,以及管理您每天收到的各种最终用户请求,例如密码重置。

此外,您可以在所有常见区域中(您今天自动化的区域——基础设施、网络、云、安全和边缘)自动执行用例,以进行服务管理和其他任务。一旦您掌握了基础知识,增加 Ansible Rulebooks 的数量、范围和复杂性就轻而易举了。

入门并分享反馈

首先查看此 网页,您将在其中找到有关事件驱动型 Ansible 的更多详细信息,并且可以访问其他资源,例如自定进度的实验室、操作说明视频以及有关此解决方案的更多详细信息。您还会找到我们第一次办公室时间活动的注册链接,您可以在其中提问并了解技巧和方法。

在您熟悉了一些知识后,使用在 这里 找到的开发人员预览代码。总之,您的基本步骤将是下载并安装来自 GitHub 存储库的事件驱动型 Ansible,配置事件源,以便事件驱动型 Ansible 订阅,编写您的 Ansible Rulebook(s) 并开始监听事件。

作为社区项目,我们希望您通过 GitHub 评论、我们的办公室时间或通过电子邮件 [email protected] 向我们提供反馈。

展望事件驱动型 Ansible 的未来

虽然这项技术是一个社区项目,但我们有更大的想法来塑造这种能力,以满足您的需求。此外,我们希望将来将事件驱动型 Ansible 集成到 Red Hat Ansible Automation Platform 中作为一个组件。使用 Red Hat Ansible Automation Platform,您可以访问该平台提供的所有功能,包括 RBAC 和其他控制,以及更灵活地使用单个自动化平台,用于通过 Ansible Playbooks 手动启动的自动化,以及用于通过 Ansible Rulebooks 完全自动执行的操作。

我希望这能很好地概述事件驱动型 Ansible。










使用 Ansible 和 Packer,从配置到编排

使用 Ansible 和 Packer,从配置到编排

Red Hat Ansible Automation Platform 可以帮助您编排、运营和管理您的混合云部署。在我的上一篇公共云博客中,我谈论了“自动化可以节省 AWS 账单的两种简单方法”,与 Ashton 的博客“让云井然有序:使用 Ansible 在 AWS 中进行第 2 天运营”类似,我们都希望跳出配置和取消配置资源的常见公共云用例,而是关注自动执行常见的运营任务。在这篇博客文章中,我想介绍 Ansible 技术营销团队如何使用 Ansible 编排演示和工作坊的管道,以及我们如何将其与使用 Packer 创建的自定义 AMI(Amazon Machine Image)集成。Packer 是一个开源工具,允许 IT 运营人员标准化和自动化构建系统映像的过程。

对于我们的一些 Ansible.com 上的自定进度的交互式动手实验,我们可以快速启动映像,只需几秒钟。在一个示例自动化管道中,我们将

  1. 配置一个虚拟实例。
  2. 使用 Ansible Automation Platform 安装应用程序;就我而言,我实际上是在安装我们的产品 Ansible Automation Platform(太自我了)。
  3. 在应用程序安装后,设置实验室指南,在自动化控制器中预加载一些作业模板,创建清单和凭据,甚至设置 SSL 证书。

虽然速度很快,但加载可能需要几分钟,而网络用户不太可能耐心地等待。Netflix 时代意味着人们想要即时满足!安装自动化控制器可能需要 5 到 10 分钟,所以我需要一种更快的部署方法。

cloud automation pipeline diagram

我可以做的是将我们的常规 Ansible 自动化管道与 Packer 相结合,并预先构建云实例,以便它们已经安装了应用程序,并且配置并准备在启动后立即运行。Packer 将在您的公共云(Azure、AWS、GCP)上配置一个特定的机器映像,运行您需要的命令和更改,然后发布一个新的映像,其中包含您对基本映像所做的所有更改。就我而言,我以相同的方式使用 Ansible。在我的 packer HCL(HashiCorp Configuration Language)文件中,我有一个 Ansible 配置程序

 provisioner "ansible" {
      command = "ansible-playbook"
      playbook_file = "pre_build_controller.yml"
      user = "ec2-user"
      inventory_file_template = "controller ansible_host={{ .Host }} ansible_user={{ .User }} ansible_port={{ .Port }}"
      extra_arguments = local.extra_args

    }

Red Hat Ansible 技术营销示例可以在 Github 上找到

这个简单的配置程序插件正在执行 Ansible Playbook pre_build_controller.yml。我还可以使用 Ansible Automation Platform 来编排整个过程,通过启动 Packer,然后继续执行。我能提前做的事情,我都可以预先构建到映像中。这意味着我在启动时需要执行的自动化操作更少(或者有时被称为“即时自动化”。)新流程如下所示:

create pre-built image diagram

这两个过程,构建映像和提供演示环境,实际上是相互独立的。根据预先构建的映像需要执行的频率,我们可以在自动化控制器中对其进行调度,甚至可以通过 Webhook 按需生成它们。按需生成意味着,只要有人更改与任何 pre_build 相关的 Ansible Playbook,我们就可以让 Ansible Automation Platform 立即创建新映像,甚至对其进行测试!

共享和复制云实例

创建预先构建的 AMI 后,我们需要确保可以在多个区域以及其他帐户中使用它。对于公共市场实例,您可以使用一些很酷的自动化技巧,例如使用 ec2_ami_info 模块 进行动态查找,但我们现在实际上已经创建了私有 AMI,可以将其复制到其他区域,或共享到其他 AWS 帐户,以便他们可以访问这些预先构建的映像。为了解决这个问题,我们可以使用自动化,我已经为 ansible_cloud.share_ami 创建了一个 Ansible 内容集合。

此集合目前有两个可用的角色,可以帮助云管理员进行复制和共享。

复制

此角色将从一个区域复制 AMI 到任何其他指定的区域。这意味着您可以使用 Packer 只创建一次,然后让 Ansible 负责将其复制到任何其他区域,并为您返回每个区域的新 AMI 列表。

- name: copy ami
    include_role:
      name: ansible_cloud.share_ami.copy
    vars:
      ami_list: "{{ my_ami_list }}"
      copy_to_regions: "{{ my_copy_to_regions }}"

您的变量文件看起来像这样

my_ami_list:
  ap-northeast-1: ami-01334example
  ap-southeast-1: ami-0b3f3example
  eu-central-1: ami-03a5732example
  us-east-1: ami-01da94de9cexample
my_copy_to_regions:
  - us-west-1
  - us-east-2

在这种情况下,将有四个 AMI 复制到 us-west-1 和 us-east-2,并返回新的 AMI 标识符到您的终端窗口或自动化控制器控制台。

共享

此角色将从一个帐户和区域共享 AMI 到另一个帐户(在同一区域)。这使您能够将预先构建的 AMI 非常快地共享到您想要的任何帐户。

- name: share ami
  include_role:
    name: ansible_cloud.share_ami.share
  vars:
    user_id_list: "{{ account_list }}"
    ami_list: "{{ my_ami_list }}"

您的变量文件看起来像这样

my_ami_list:
  ap-northeast-1: ami-01334example
  ap-southeast-1: ami-0b3f3example
  eu-central-1: ami-03a5732example
  us-east-1: ami-01da94de9cexample
  us-east-2: ami-009f8b2c6dexample
account_list:
  - "11463example"
  - "90073example"
  - "71963example"
  - "07923example"

这将把这五个 AMI 共享到列出的四个帐户。还有两个可选的变量用于共享 AMI,new_ami_name 和 new_tag,它们将命名(例如,添加标签名称:“您输入的任何内容”)并添加硬编码的 ansiblecloud 标签(例如,添加标签 ansiblecloud:“您输入的任何内容”)。这可以进一步定制,以便在您的 AMI 中添加您想要的任意数量的标签,以帮助跟踪它们。

new_ami_name: "RHEL 8.6 with automation controller"
new_tag: "my test"

现在,您可以看到 Ansible Automation Platform 和 Packer 可以轻松无缝地协同工作以完成云自动化任务的众多方式之一。如果您想了解有关 Ansible 和 Packer 或 Ansible 和 Terraform 的更多博客文章,请告诉我们!