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

使用 Ansible 和 Packer,从供应到编排

使用 Ansible 和 Packer,从供应到编排

Red Hat Ansible Automation Platform 可以帮助您编排、运营和管理您的混合云部署。在我的上一篇公共云博客中,我讨论了“自动化节省 AWS 账单费用的两种简单方法”,类似于 Ashton 的博客“将秩序带到云端:使用 Ansible 进行 AWS 的第二天运营”,我们都希望超越常见的公共云用例(例如资源供应和取消供应),转而关注自动化常见的运营任务。对于这篇博文,我想介绍 Ansible 技术营销团队如何使用 Ansible 编排演示和研讨会的管道,以及我们如何将其与使用 Packer 创建的自定义 AMI(Amazon Machine Images)集成。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 配置语言)文件中,我有一个 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 按需生成它们。按需生成意味着只要有人更改与任何预构建内容相关的 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 的更多博客,请告诉我们!