使用 Ansible 和 Packer,从供应到编排
使用 Ansible 和 Packer,从供应到编排
Red Hat Ansible Automation Platform 可以帮助您编排、运营和管理您的混合云部署。在我的上一篇公共云博客中,我讨论了“自动化节省 AWS 账单费用的两种简单方法”,类似于 Ashton 的博客“将秩序带到云端:使用 Ansible 进行 AWS 的第二天运营”,我们都希望超越常见的公共云用例(例如资源供应和取消供应),转而关注自动化常见的运营任务。对于这篇博文,我想介绍 Ansible 技术营销团队如何使用 Ansible 编排演示和研讨会的管道,以及我们如何将其与使用 Packer 创建的自定义 AMI(Amazon Machine Images)集成。Packer 是一款开源工具,允许 IT 运营人员标准化和自动化构建系统映像的过程。
对于我们的一些 Ansible.com 上的自定进度的交互式动手实验,我们可以快速在几秒钟内启动映像。在一个示例自动化管道中,我们将
- 供应虚拟实例。
- 使用 Ansible Automation Platform 安装应用程序;就我而言,我实际上是在安装我们的产品 Ansible Automation Platform(这是否有点太“元”了?)。
- 应用程序安装完成后,设置实验指南,预加载自动化控制器的一些作业模板,创建清单和凭据,甚至设置 SSL 证书。
虽然这很快,但加载可能需要几分钟,而网络用户不太可能耐心等待。Netflix 时代意味着人们希望获得即时满足!安装自动化控制器可能需要 5 到 10 分钟,所以我需要一种更快的部署方法。
我可以将我们正常的 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,然后继续执行。任何我可以提前做的事情,我都可以预构建到映像中。这意味着在启动时(或有时称为“即时自动化”)需要执行的自动化更少。新流程如下所示
这两个过程(构建映像和提供演示环境)实际上是相互独立的。根据预构建映像需要执行的频率,我们可以在自动化控制器中安排它,甚至可以通过 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 的更多博客,请告诉我们!