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

深入了解,红帽被评为 Forrester Wave 的领导者

深入了解:红帽被评为 Forrester Wave 的领导者

本周,我们宣布红帽被评为 2023 年第一季度 Forrester Wave 基础设施自动化领域的领导者。为了帮助从我们的角度解释这一结果,以下博客解答了一些最常见的问题。 

什么是 Forrester Wave?

"Forrester Wave™ 是一个指南,供考虑在技术市场中购买选项的买家参考,它基于我们的分析和意见。为了为所有参与者提供公平的过程,Forrester 遵循公开可用的方法,我们在所有参与供应商中一致地应用该方法 来源

Forrester 一直是人们自动化之旅中的支柱,红帽很荣幸能在这份 2023 年第一季度报告的结果中被认可为领导者。

结果如何?

红帽,特别是专注于 Ansible Automation Platform,已被评为领导者,在 2023 年第一季度 Forrester Wave™ 基础设施自动化报告中。 

请参阅以下图形,可以在 最终报告 中查看。

这对我们来说为什么重要?

我们认为 Forrester 是 IT 领域最受认可的技术分析公司之一,并且获得领导者排名进一步说明了红帽 Ansible Automation Platform 正在为希望将自动化作为其 IT 和 OT 资产战略组成部分的组织创造价值。 

Forrester Wave 是如何评判的?使用了哪些标准?

Forrester 使用了一种全面的方法来管理 Wave,采用经过深思熟虑的分阶段方法,历时数月。使用 Forrester Wave 方法,研究团队邀请供应商参与,主持初步启动和计划会议,提供评估标准,以书面和演示形式提交反馈,最后向供应商提供评分和反馈。

为什么一些流行的自动化解决方案未包含在 Wave 中?

根据 Forrester Wave 供应商参与政策 页面,供应商要么不符合条件,要么未满足纳入标准而被考虑。您会注意到,有些供应商确实有资格并且被邀请,但他们拒绝参与(在图形上用灰色圆圈表示)。







为 Terraform 提供 Ansible 的魔力

为 Terraform 提供 Ansible 的魔力

去年年底,我们推出了一款针对 Terraform 的 Red Hat Ansible 认证集合。这是自动化领域的重要一步,因为这两个工具确实非常适合在一起使用,并且利用 Ansible 协调企业中其他工具的能力使这一举措成为理所当然的选择。Terraform 凭借其基础设施即代码 (IaC) 配置和 Ansible 在配置即代码方面的优势,两者之间形成了协同效应,不容忽视——我们在一起才能更好!组织现在可以利用其现有的基础设施即代码清单,并通过 Terraform 和 Ansible 共同扩展其自动化。  

现在,在 Kyndryl 和 XLAB 合作伙伴的帮助下,我们又回到了这里,为基础设施即代码增添了更多价值和魔力——这一次,我们在 Red Hat Ansible 认证内容集合中增加了一个额外的功能:Terraform 的 Ansible 提供程序。

那么,该提供程序能帮助我们做什么呢?

如果没有提供程序,我们需要依靠不同云平台的清单插件,并使用过滤器从我们新“Terraform 化”的基础设施中获取实例信息。这使我们能够更新我们的清单,以便我们可以对这些主机运行自动化任务。这在工作流中非常流畅,尤其是在您使用带有工作流的自动化控制器时。但是,这种情况并非没有复杂性,而那些不使用自动化控制器的 Terraform 用户又该如何呢?我们如何利用 Ansible 并将这两个工具结合起来呢?Terraform 的 Ansible 提供程序可以帮助我们!

通过集合中的 Ansible 提供程序,我们可以在 main.tf 文件中定义 Ansible 清单的使用,并且一旦项目由 Terraform 初始化和构建,我们就可以从状态文件收集 Terraform 资源信息并将其推送到清单中。

让我们更仔细地看看

main.tf

terraform {
  required_providers {                     #### ansible provider
    ansible = {
      version = "~> 0.0.1"
      source  = "terraform-ansible.com/ansibleprovider/ansible"
    }
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}


resource "ansible_host" "my_ec2" {          #### ansible host details
  name   = aws_instance.my_ec2.public_dns
  groups = ["nginx"]
  variables = {
    ansible_user                 = "ansible",
    ansible_ssh_private_key_file = "~/.ssh/id_rsa",
    ansible_python_interpreter   = "/usr/bin/python3"

main.tf 中使用提供程序允许我们指示我们希望使用 Ansible 清单,并允许我们为清单指定 Ansible 主机详细信息。然后,Terraform 可以初始化和规划项目并嵌入详细信息。如果我们查看生成的 Terraform 状态文件,我们可以看到定义的主机详细信息

terraform.tfstate                      #### Inside main.tf


"mode": "managed",
      "type": "ansible_host",
      "name": "my_ec2",
      "provider": "provider[\"terraform-ansible.com/ansibleprovider/ansible\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "groups": [
              "nginx"
            ],
            "id": "ec2-18-130-240-228.eu-west-2.compute.amazonaws.com",
            "name": "ec2-18-130-240-228.eu-west-2.compute.amazonaws.com",
            "variables": {
              "ansible_python_interpreter": "/usr/bin/python3",
              "ansible_ssh_private_key_file": "~/.ssh/id_rsa",
              "ansible_user": "ansible"
            }
          },

更深入地查看清单,我们可以看到插件已填充了 Terraform 状态文件中定义的资源的实例数据。

…inventory.yml
---
plugin: cloud.terraform.terraform_provider
ansible-inventory -i inventory.yml --graph --vars

@all:
  |--@nginx:
  |  |--ec2-18-130-240-228.eu-west-2.compute.amazonaws.com
  |  |  |--{ansible_python_interpreter = /usr/bin/python3}
  |  |  |--{ansible_ssh_private_key_file = ~/.ssh/id_rsa}
  |  |  |--{ansible_user = ubuntu}
  |--@ungrouped:

我们现在能够对该清单运行剧本,并在主机上自动化配置或其他配置后任务,而无需任何麻烦。

Step 1: terraform plan
Step 2: terraform apply

Deploying with Terraform


Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
++ ansible-playbook -i inventory.yml playbook.yml

PLAY [Install nginx on remote host] *****************************************************************************************

TASK [wait_for_connection] **************************************************************************************************
The authenticity of host 'ec2-18-130-240-228.eu-west-2.compute.amazonaws.com (18.130.240.228)' can't be established.
ECDSA key fingerprint is SHA256:jRqiAGPDzuYGe+l7jNsmQays2qb/C/SJqtnH6pc42ns.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
ok: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

TASK [setup] ****************************************************************************************************************
ok: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

TASK [Install nginx] ********************************************************************************************************
changed: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

TASK [Start nginx] **********************************************************************************************************
ok: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

PLAY RECAP ******************************************************************************************************************
ec2-18-130-240-228.eu-west-2.compute.amazonaws.com : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

当您使用 Terraform 进行部署,同时利用 Ansible 进行云操作(如应用程序部署和 CI/CD 管道、生命周期管理和执行、操作系统修补和维护)时,这个新提供程序非常有用。由于该提供程序是 Red Hat Ansible 认证内容集合的一部分,我们还可以获得持续的维护和支持!




Kubernetes 遇见事件驱动的 Ansible

Kubernetes 遇见事件驱动的 Ansible

在当今快节奏的世界中,每一秒都至关重要,能够及时应对活动可以决定是否能够满足消费者的需求和服务水平协议。这两者都是 事件驱动的 Ansible 的目标,它旨在通过响应满足特定条件的事件来进一步扩展基于 Ansible 的自动化的覆盖范围。这些事件可能来自各种来源,例如 HTTP 端点、队列或主题上的消息或公共云资源。Kubernetes 已成为在云原生架构中管理基础设施和应用程序的代名词,许多组织都依赖这些系统来运行其业务关键型工作负载。自动化和 Kubernetes 齐头并进,Ansible 已经在该生态系统中发挥作用。现在可以使用一项利用事件驱动 Ansible 框架的新功能,它扩展了 Ansible 和 Kubernetes 之间的集成,以便可以根据 Kubernetes 集群中发生的事件和操作触发 Ansible 自动化活动。

事件驱动的 Ansible 使用称为规则手册的概念进行设计,规则手册包含三个主要组件

  • 操作 - 触发资产的执行,包括 Ansible 剧本或模块
  • 规则 - 确定接收到的事件是否与某些条件匹配
  • 来源 - 来自外部实体的事件的来源,这些事件在 Ansible 事件框架中被使用和处理

有广泛的解决方案生态系统可用于从 Ansible 管理 Kubernetes,这主要通过 kubernetes.core 集合 提供。该集合包含从管理 Kubernetes 集群中资源的机制到对 Helm 包管理器支持以及利用 Kubernetes 集群作为清单源的所有内容。现在,通过 Kubernetes 和事件驱动 Ansible 框架的集成提供了可用功能。事件源允许使用源自 Kubernetes 集群的更改,这些更改可用于触发自动化以响应和根据接收到的内容和配置的规则采取行动。让我们探讨如何利用这种新创建的功能来进一步加强 Kubernetes 和 Ansible 之间的集成。

与事件驱动的 Ansible 和 Kubernetes 相关的资产位于 Ansible Galaxy 中的 sabre1041.eda 集合 中。确保将执行 Ansible 自动化的控制节点安装并配置了必要的工具。这包括 Ansible Core、与事件驱动的 Ansible 相关的工具以及包含事件驱动的 Ansible Kubernetes 集成的集合。请参阅 Ansible Core事件驱动的 Ansible 的相关文档,了解目标操作系统和安装方法。

安装并配置 Ansible Core 和事件驱动的 Ansible 后,通过执行以下命令安装 sabre1041.eda 集合

ansible-galaxy collection install sabre1041.eda

此集合还要求安装 Python requests 包,这可以通过执行以下命令来实现

pip install requests

现在所有先决条件工具都已满足,可以将注意力转向如何配置规则手册以利用 Kubernetes 集成。事件驱动 Ansible 架构中的事件在规则手册的源部分中配置。可以在规则手册中指定一个或多个源,从而能够配置强大的条件和操作集。

下面显示了一个利用集合中 k8s 事件源插件的基本规则手册

- name: Listen for newly added ConfigMap resources
  hosts: all
  sources:
    - sabre1041.eda.k8s:
        api_version: v1
        kind: ConfigMap
        namespace: default
  rules:
    - name: Notify
      condition: event.type == "ADDED"
      action:
        debug:

k8s 插件的建模方式类似于 kubernetes.core 集合中的 k8s 模块,因此任何熟悉此模块的人在使用此 k8s 源插件时都会感到宾至如归。

此规则手册的逻辑如下

  1. 连接到远程 Kubernetes 集群并使用默认命名空间中发生的 ConfigMap 资源的更改
  2. 每当 Kubernetes 集群中发生更改时,k8s 源插件都会将类型和内容包含到事件对象中

  3. 仅当事件的 type 属性等于 "ADDED"(每当将 ConfigMap 添加到集群时)时,执行调试操作,该操作将打印出事件和任何其他关联的变量。

虽然此规则手册监视特定命名空间中的更改,但可以通过省略源插件中命名空间参数的使用来支持监视整个 Kubernetes 集群中的更改。如果禁止访问默认命名空间,请随时选择另一个允许访问的命名空间。

为了演示此规则手册的使用,将前面提供的內容添加到一个名为 k8s-eda-demo.yaml 的新规则手册文件中。此外,请确保本地机器已通过身份验证到 Kubernetes 集群,或自定义插件参数以指定应使用的 Kubernetes 集群的位置。请参阅插件文档以了解可用选项。

在一个名为 inventory 的文件中创建一个简单的清单,内容如下所示

localhost

运行规则手册以开始使用以下命令使用事件

ansible-rulebook -i inventory --rulebook k8s-eda-demo.yaml --verbose

在规则手册监视默认命名空间中的 ConfigMap 更改时,在默认命名空间中创建一个新的 ConfigMap 以演示事件是否正在被正确捕获。可以通过使用 Kubernetes CLI (kubectl) 执行以下命令来完成此任务

kubectl create configmap -n default eda-example --from-literal=message="Kubernetes Meets Event-Driven Ansible"

观察以下内容已在执行 ansible-rulebook 命令的窗口中捕获并显示。

kwargs:
{'facts': {},
 'hosts': ['all'],
 'inventory': 'localhost',
 'project_data_file': None,
 'ruleset': 'Listen for newly added ConfigMap resources',
 'source_rule_name': 'Notify',
 'source_ruleset_name': 'Listen for newly added ConfigMap resources',
 'variables': {'event': {'resource': {'apiVersion': 'v1',
                                      'data': {'message': 'Kubernetes Meets '
                                                          'Event-Driven '
                                                          'Ansible'},
                                      'kind': 'ConfigMap',
                                      'metadata': {'creationTimestamp': '2022-12-25T17:40:43Z',
                                                   'managedFields': [{'apiVersion': 'v1',
                                                                      'fieldsType': 'FieldsV1',
                                                                      'fieldsV1': {'f:data': {'.': {},
                                                                                              'f:message': {}}},
                                                                      'manager': 'kubectl-create',
                                                                      'operation': 'Update',
                                                                      'time': '2022-12-25T17:40:43Z'}],
                                                   'name': 'eda-example',
                                                   'namespace': 'default',
                                                   'resourceVersion': '119407',
                                                   'uid': '2862db59-8990-4a37-9433-50dcfbaa6d71'}},
                         'type': 'ADDED'},
               'fact': {'resource': {'apiVersion': 'v1',
                                     'data': {'message': 'Kubernetes Meets '
                                                         'Event-Driven '
                                                         'Ansible'},
                                     'kind': 'ConfigMap',
                                     'metadata': {'creationTimestamp': '2022-12-25T17:40:43Z',
                                                  'managedFields': [{'apiVersion': 'v1',
                                                                     'fieldsType': 'FieldsV1',
                                                                     'fieldsV1': {'f:data': {'.': {},
                                                                                             'f:message': {}}},
                                                                     'manager': 'kubectl-create',
                                                                     'operation': 'Update',
                                                                     'time': '2022-12-25T17:40:43Z'}],
                                                  'name': 'eda-example',
                                                  'namespace': 'default',
                                                  'resourceVersion': '119407',
                                                  'uid': '2862db59-8990-4a37-9433-50dcfbaa6d71'}},
                        'type': 'ADDED'}}}

如上所示,与 Kubernetes 集群中新创建的 ConfigMap 和事件关联的详细信息已被捕获。

确认 Kubernetes 源插件已成功捕获事件后,让我们演示如何在一个 Ansible Playbook 中使用这些事件。创建一个名为 k8s-eda-demo-playbook.yaml 的新文件,内容如下。

- hosts: localhost
  connection: local
  tasks:
    - ansible.builtin.debug:
        msg: "ConfigMap in namespace '{{ event.resource.metadata.namespace }}' with name '{{ event.resource.metadata.name }} ‘{{ event.type | capitalize }}’ with the message ‘{{ event.resource.data.message}}'"

此 playbook 演示了如何获取捕获事件中包含的属性。type 属性将显示“Added”,因为 playbook 仅在创建 ConfigMap 时才会执行。可以通过引用事件上的 resource 属性来访问 ConfigMap 对象本身。然后可以遍历 ConfigMap 的标准 Kubernetes 清单,例如命名空间、名称以及特定的数据值

更新 k8s-eda-demo.yaml 文件中规则手册的内容,以调用新创建的 playbook,而不是简单地打印出内容,方法是使用如下所示的 run_playbook 操作

- name: Listen for newly added ConfigMap resources
  hosts: all
  sources:
    - sabre1041.eda.k8s:
        api_version: v1
        kind: ConfigMap
        namespace: default
  rules:
    - name: Execute Playbook
      condition: event.type == "ADDED"
      action:
        run_playbook:
          name: k8s-eda-demo-playbook.yaml

再次执行 k8s-eda-demo-playbook.yaml 规则手册以开始列出添加到默认命名空间的 ConfigMap。

ansible-rulebook -i inventory --rulebook k8s-eda-demo.yaml --verbose

删除并重新创建 ConfigMap 以触发 playbook。

kubectl delete configmap -n default eda-example

kubectl create configmap -n default eda-example --from-literal=message="Kubernetes Meets Event-Driven Ansible"

观察 playbook 已被触发并产生类似于以下内容的输出

TASK [ansible.builtin.debug] ***************************************************
ok: [localhost] => {
    "msg": "ConfigMap in namespace 'default' with name 'eda-example ‘Added’ with the message ‘Kubernetes Meets Event-Driven Ansible'"
}

虽然此示例仅打印出与接收到的事件内容相关的简单消息,但它演示了如何利用 Kubernetes 集成启用的功能。通过将 Kuberentes 作为事件源并集成到事件驱动的 Ansible 生态系统中,它成为一个重要的集成,有助于支持利用 Kubernetes 来维护其业务关键组件并根据需要触发自动化的组织。