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

使用 Ansible 构建云平台

使用 Ansible 构建云平台

diagram one

轮子是在公元前四千年发明的。现在,在第四个千年,我相信轮子是当时最热门的东西,只有最流行的新石器时代酷猫才有轮子。快进到今天,我们都同意轮子已经不是什么新鲜事。它已成为我们日常生活的一部分。轮子并不性感。如果我们想让轮子再次变得性感,我们只需要将一辆跑车与所有最新的设备和磁通电容器组合在一起,并涂上漂亮的 Ansible 红色,瞧!我们就有了值得谈论的东西。

就像跑车一样,Red Hat Ansible 自动化平台也具有将现有资源转变为更有趣事物的相同能力。它可以增强工具集并将它们进一步扩展到自动化工作流程中。

让我们以 Terraform 为例。Terraform 是一个经常用于基础设施即代码的工具。它是以可重复的方式跨多个大型公共云提供商(如 Amazon Web Services (AWS)、Microsoft Azure 和 Google Cloud Platform (GCP))配置基础设施时使用的优秀工具。许多组织每天都使用 Terraform 进行快速的基础设施配置,但如果我们将它与 Ansible 的强大功能结合起来,就会发现它可以构建成一个高效的工作流程。

不要替换工具 - 重用、增强和掌握它

正如我所说,Ansible 有能力增强现有工具并对其进行大修。如果组织已经使用 Terraform,那么浪费在构建其清单和配置上的所有工时将是令人遗憾的。相反,我们可以利用现有资源创建一个工作流程,该工作流程可以构建更多 Terraform 清单、自动化配置过程并提供一种可扩展的方法来触发配置后任务。有了 Ansible 的引领,我们能够使用 Terraform 扩展基础设施配置,并允许进行诸如配置即代码、应用程序部署和合规性自动化等操作。可能性无穷无尽,就像最新的德国汽车上的附件一样。

首先要考虑的是在将 Terraform 用作我们自动化的一部分时所需的自动化执行环境。我们的执行环境需要能够执行 Terraform 任务,因此我们需要确保 Terraform 实际上正在执行环境中运行。

我通过下载二进制文件并简单地将它们复制到一个基本执行环境中来实现这一点。

我还嵌入了一个 keep_secrets 文件,我们将与 Ansible vault 一起使用。

[---
version: 1

build_arg_defaults:
    EE_BASE_IMAGE: < BASE EE >

dependencies:
  galaxy: requirements.yml
  python: requirements.txt
  system: bindep.txt

additional_build_steps:
  prepend: |
    ADD terraform /sbin
    ADD keep_secrets /opt
  append:
    - RUN echo This is a post-install command!
    - RUN ls -la /etc

将我的执行环境推送到我的私有自动化中心后,我们就可以开始构建了!

我将使用三个文件,通过 Terraform 进行配置,并使用一个简单的用例。

  • main.tf - 这里包含我需要的所有基础设施配置信息
  • variables.tf - 这里将包含我在 main.tf 文件中使用和引用的所有变量
  • cloud-init.conf - 我使用 cloud-init 来注入配置信息,例如要创建的用户和要添加到 authorized_keys 的 SSH 密钥 - 这样我的自动化控制器就可以连接并执行其操作。

我们部署云基础设施所需的所有组件都是这些清单的一部分 - 这就是我们的基础设施即代码。使用 Terraform 部署它们使我们能够快速轻松地销毁所有配置的基础设施。这可以通过不将任何配置工件留在云平台上并加快整个生命周期来带来益处。

要创建这些清单,我们可以使用 Jinja 模板并在我们的自动化工作流程中使用调查。Ansible 自动化平台中的调查使我们能够向自动化消费者提供输入数据的可能性,我们可以在自动化中使用这些数据。

diagram two

这意味着创建所有基础设施即代码组件实际上成为我们团队的动态机制,使整个过程变得更加容易。使用 Jinja 模板,我创建了变量清单,然后 main.tf 将使用所有这些组件来构建和规划部署。

main.j2 > Summarized Example


resource "aws_instance" "ioc_basic" {
  for_each      = data.aws_subnet_ids.production.ids
  ami           = "${var.ami_number}"
  instance_type = "${var.instance_type}"
  subnet_id     = each.value
  key_name   = "${var.terraform_prov}"
  user_data = file("./cloud-init.conf")
  tags = {
      Name = "${var.instance_names}"

 variables.j2 > Summarized Example


variable "ami_number" {
  default = "{{ ami_number }}"
}
variable "secret_key" {
  default = "{{ secret_key }}"
}
variable "instance_names" {
  default = "{{ instance_names }}"
}
variable "instance_type" {
  default = "{{ instance_type }}"
}

配置基础设施

diagram three

提供调查数据后,我们可以让 Ansible 为 Terraform 创建一个项目文件夹。这应该存储在可靠来源中,在我的示例中,我使用的是 Git 存储库。拥有项目文件夹后,我们将创建 Terraform 构建和部署基础设施所需的所有清单和配置。Ansible 自动化平台具有模块,我们可以使用这些模块从我们的剧本中触发所有 Terraform 操作,它将在构建过程中触发 Terraform 初始化此项目文件夹,以确保它安装了正确的配置器。

我目前正在使用 AWS;但是,如果您想为 Terraform 提供对多个提供商的访问权限,这将很简单,只需为其创建一个 Jinja2 模板,并为用户提供工作流程调查中的选项即可。在我们的剧本中,我们现在只需使用 Terraform 模块即可触发 IoC 清单的初始化、规划和部署。

- name: Creating Terraform IoC
  block:
   - name: Initialize Terraform Provider
     community.general.terraform:
       project_path: /{{ working_dir }}/{{  my_terraform_build }}
       state: absent
       force_init: true

    - name: Deploy Terraform Instance
      community.general.terraform:
        project_path: /{{ working_dir }}/{{ my_terraform_build }}
        state: present
      register: deployed_tf

Terraform 部署基础设施后,它将创建一个状态文件,用于存储您管理的基础设施配置并映射资源。如果要修改基础设施,我们将重复使用状态文件。但是,它也可以用作有关该实例的信息来源,用于配置后任务。例如,如果需要更改负载均衡器,则此文件是我们利用的简单信息来源。由于我们的执行环境是短暂的,因此在加密这些状态文件后,我们将将其推送到我们的构建存储库。

现在,Terraform 不仅擅长创建基础设施,还擅长销毁基础设施。它简化了整个过程,并很好地清理了内容。我们将需要用于取消配置基础设施的变量清单,因此最好将这些清单和我们的状态文件放在我们的构建存储库中,这样不仅可以稍后销毁实例,还可以重复使用此配置或修改基础设施。由于这些文件将包含敏感信息,因此我们可以在将它们推送到我们的可靠来源之前,使用 Ansible 使用嵌入到执行环境中的密钥文件对这些文件进行加密。

轮子正在转动,但是现在呢?

Ansible 自动化平台使我们能够使用动态清单插件,因此我们将使用相关插件来更新清单,以适应我们新配置的主机。这里真正酷的一点是,我们可以提供我们在 Terraform 清单文件中需要的标签,并且在 Ansible 中,我们可以使用过滤器缩小清单主机,专门查找这些标签。

 example

regions:
  - "eu-west-2"

keyed_groups:
  - tag:Environment: terraform_dev

filters:
  instance-state-name: running

动态清单源中的这些过滤器使自动化控制器能够仅收集与这些条件匹配的实例,并简化配置后的进一步任务。配置过程的最后一部分是创建和更新用于终止我们创建的实例的调查。为此,我们使用 Ansible 创建一个包含 Terraform 存储库中所有项目列表的列表,并将此列表传递给创建调查规范,我们在每次运行创建或销毁作业时更新此规范。

销毁基础设施

diagram four

由于我们使用 Terraform 配置了基础设施,因此取消配置它非常简单。正如我之前提到的,当 Terraform 创建基础设施时,它会建立一个可靠的来源,可以轻松地用它来取消配置基础设施。我们可以使用自动化工作流程从我们的存储库中获取正确的 Terraform 构建详细信息,对可能受到影响的任何外部系统(如负载均衡器)进行更改,然后触发 Terraform 从我们的剧本中销毁它创建的实例。

- name: Destroy Terraform Instance
  community.general.terraform:
    project_path: /{{ working_dir }}/{{ my_terraform_build }}
    state: absent

启动引擎!配置后

我们使用 Ansible 和 Terraform 创建了一种可更新的方法来构建和销毁基础设施。为了进一步扩展自动化并完成部署工作负载、系统加固和合规性的重要工作,我们只需要依赖 Ansible。Ansible 自动化平台使我们能够创建自动化工作流程,这些工作流程向我们展示自动化步骤的视觉逻辑进程,并使我们能够将任务组合到端到端流程中。这不仅是查看和检查自动化流程的好方法,而且我发现它有助于确定可能的改进,或者在步骤失败或遇到问题时,可能将回滚功能添加到流程中。

process diagram

是时候用 Terraform 构建您的云,将基础设施即代码和配置即代码与我们集中的 Ansible 自动化平台整合在一起了!