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




使用 Ansible 和 GitOps 管理容器化应用程序的生命周期

使用 Ansible 和 GitOps 管理容器化应用程序的生命周期

将 GitOps 与 Ansible 相结合的一大优势在于,您可以简化容器化应用程序的自动化交付和生命周期。

借助 GitOps 的功能,我们可以

  • 标准化应用程序的配置。
  • 继承配置版本控制带来的优势。
  • 轻松跟踪配置设置的更改,从而更轻松地解决问题。
  • 为我们的应用程序提供单一的事实来源。

将上述功能与 Ansible 相结合,您将拥有实现容器化应用程序在任何自动化位置的配置一致性所需的一切。

这引出了一个问题:“我们如何将 Ansible 和 GitOps 相结合来管理容器化应用程序的生命周期?”

很简单,通过创建一个与我的应用程序存储库中的 Git webhook 关联的 Ansible 工作流程。

您可能想知道什么是 Git webhook?

Git webhook 被定义为一种方法,用于在存储库上发生特定操作时,向外部 Web 服务器传递通知。

例如,当存储库更新时,这可能会触发一个事件,该事件可以触发 CI 构建、部署环境,或者在本例中,修改容器化应用程序的配置。

webhook 提供了在 Web 上跨应用程序执行指定命令的功能。自动化控制器提供了与 GitHub 和 GitLab 的 webhook 集成,但在本博客中,我们将与 GitHub 集成。

在本博客的以下部分,我将提供以下步骤的逐步过程:

  • 设置您的 Git webhook(使用 GitHub)。
  • 设置一个通过您的 GitHub 存储库中的推送事件触发的 Ansible 工作流程。

创建 GitHub 个人访问令牌

GitHub 个人访问令牌 (PAT) 是将 Ansible 工作流程与您的 Git 存储库关联所需的凭据之一。

生成一个用于与自动化控制器一起使用的个人访问令牌 (PAT)。

  1. 在您的 GitHub 帐户的个人资料设置中,单击**设置**。
  2. 在“个人设置”下方,单击**开发者设置**。
  3. 在“开发者设置”中,单击**个人访问令牌**。
  4. 从“个人访问令牌”屏幕中,单击**生成新令牌**按钮。
  5. 出现提示时,输入您的 GitHub 帐户密码以继续。
  6. 在**注释**字段中,输入有关此 PAT 将用于什么的简短描述。
  7. 在**过期**下拉菜单中,选择**无过期时间**。
  8. 在**范围**字段中,自动化控制器 webhook 仅需要 repo 范围访问权限,除了邀请之外。有关其他范围的信息,请单击表格上方的链接以访问文档。

example personal access token

单击页面底部的**生成令牌**按钮。

在准备好 PAT 后,下一步是创建一个 Git 存储库,当对该存储库进行更改时,它将由我们的 GitHub webhook 触发。

在本博客中,我将使用我的应用程序演示存储库。您可以随意使用自己的存储库或分叉此存储库以进行后续操作。

熟悉应用程序演示存储库

应用程序演示存储库非常简单,因为它包含

  • container_playbook.yml
  • group_vars/all.yml
  • requirements.yml

container_playbook.yml 是一个简单的剧本,它创建一个颜色容器,在特定端口启动它,并设置两个环境变量,APP_COLORtree

container_playbook.yml的示例

---
- name: Playbook to setup prereqs
  hosts: all
  become: true
  tasks:
    - name: Create a color container
      containers.podman.podman_container:
        name: colors
        image: docker.io/mmumshad/simple-webapp-color:latest
        state: started
        network: host
        ports:
            - "{{ host_port }}:{{ container_port }}"
        env:
            APP_COLOR: "{{ color }}"
            tree: "{{ tree }}"

group_vars/all.yml是存储我的 Podman 容器修改的位置,这些修改将触发容器的更改。

group_vars/all.yml文件的示例

color: "BLUE"
tree: "trunk"
host_port: 8080
container_port: 8080

最后,我们有requirements.yml文件,它确保我们有 containers.podman 集合可供剧本使用。

requirements.yml的示例

collections:
- name: containers.podman

在存储库就位,GitHub PAT 设置后,接下来的步骤涉及创建我们的 Red Hat Ansible 自动化平台资源,这些资源将在应用程序演示存储库中发生 GitHub 推送事件时被触发。

创建我们的 Ansible 自动化平台资源

在我的自动化控制器仪表板中,我首先需要创建我的凭据资源,以确保当我创建新的项目、工作流程和作业模板时,它们都可以轻松地附加我的应用程序演示 PAT 凭据。

在自动化控制器仪表板中:

  1. 在**资源**>**凭据**下,单击蓝色的**添加**按钮。
  2. 提供一个**名称**,例如“应用程序演示 PAT”。
  3. 选择**GitHub 个人访问令牌**作为**凭据类型**。
  4. 在**类型详细信息**中,使用先前从 GitHub 生成的令牌添加秘密。
  5. 单击**保存**。

在应用程序演示 PAT 凭据就位后,我需要另一个凭据来访问将运行 Podman 容器的主机。在本例中,它是一个 AWS 实例。

为了访问此主机,我将创建一个新的凭据,其中存储我的 AWS 私钥。

  1. 在**资源**>**凭据**下,单击蓝色的**添加**按钮。
  2. 提供一个**名称**,例如“我的 AWS 私钥”。
  3. 选择**机器**作为**凭据类型**。
  4. 在**类型详细信息**中,在文本区域中添加**SSH 私钥**。
  5. 单击**保存**。

在凭据就位后,我需要创建一个清单,其中存储我的 AWS 实例的详细信息。

要添加我的 AWS 实例的详细信息,我将创建一个清单文件。

  1. 在**资源**>**清单**下,单击蓝色的**添加**>**添加清单**按钮。
  2. 提供一个**名称**,例如“应用程序演示清单”。
  3. 单击**保存**。
  4. 在**资源**>**清单**下,单击**应用程序演示清单**。
  5. 单击标签为**主机**的选项卡,然后单击**添加**按钮。
  6. 提供一个**名称**,例如“应用程序演示主机”。

在**变量**中,提供以下 YAML

---
ansible_host:
ansible_user: ec2-user

在凭据和清单资源设置好后,我将创建我的应用程序演示项目。此项目的目的是创建一个工作流程,该工作流程包含一个作业模板,该模板会在应用程序演示存储库发生更新时自动运行。

这确保了我对 Git 存储库中的 Podman 容器设置进行更改时,container_playbook.yml 会运行以进行相应的更改。

在自动化控制器仪表板中

  1. 在**资源**>**项目**下,单击蓝色的**添加**按钮。
  2. 提供一个**名称**,例如“应用程序演示项目”。
  3. 选择**默认**作为组织。
  4. 选择**默认执行环境**作为**执行环境**。
  5. 选择**Git**作为**源代码控制凭据类型**。
  6. 在**类型详细信息**中,添加**源代码控制 URL**(您的 GitHub 存储库)。
  7. 在**选项**中,选择**清理**、**删除**、**在启动时更新修订版本**。
  8. 单击**保存**。

接下来,创建工作流程模板。

  1. 在**资源**>**模板**下,单击蓝色的**添加**>**添加工作流程模板**。
  2. 提供一个**名称**,例如“应用程序演示工作流程”。
  3. 在**选项**中,选中**启用 webhook**。
  4. 在**webhook 详细信息**中,选择**GitHub**作为**webhook 服务**。
  5. 在**webhook 详细信息**中,选择先前创建的 GitHub PAT 令牌作为**webhook 凭据**,例如“应用程序演示 PAT”。
  6. 单击**保存**。
  7. 在**请单击“启动”按钮以开始**窗口中,单击右上角的**保存**。
  8. 复制**webhook URL**和**webhook 密钥**,因为它们将在稍后使用。

为应用程序演示存储库启用 GitHub webhook

在创建了 Ansible 自动化平台工作流程模板,并准备了包含所需文件的 GitHub 存储库后,下一步是为我们的存储库启用 webhook,例如app_demo

  1. 在您的 GitHub 存储库的主页上,选择**设置**选项卡。
  2. 在**设置**选项卡中,选择**webhook**。
  3. 在**webhook**部分中,选择**添加 webhook**按钮。
  4. 输入**有效负载 URL**(工作流程的 webhook URL)。
  5. 将**内容类型**下拉菜单更改为application/json
  6. 输入**秘密**(工作流程的 webhook 密钥)。
  7. 保持默认设置以使用推送事件,然后单击**添加 webhook**按钮。

默认情况下,GitHub 在传递有效负载时会验证 SSL 证书。如果您的自动化控制器 SSL 证书未签名,请确保禁用 SSL 验证。

创建应用程序演示作业模板

App Demo 任务模板会在每次 Git 仓库更新时自动运行 **container_playbook.yml** 文件。

在您的自动化控制器仪表盘中创建任务模板

  1. 在 **资源** > **模板** 下,点击蓝色 **添加** > **添加任务模板**。
  2. 提供 **名称**,例如 App Demo 任务。
  3. 选择 **运行** 作为 **任务类型**。
  4. 选择 **App Demo 库存** 作为 **库存**。
  5. 选择 **App Demo 项目** 作为 **项目**。
  6. 选择**默认执行环境**作为**执行环境**。
  7. 选择 **container_playbook.yml** 作为 **剧本**。
  8. 选择 **凭据** 并选择 **我的 AWS 私钥**。
  9. 在 **选项** 中,选择 **启用 Webhook**。
  10. 选择 **GitHub** 作为 **Webhook 服务**。
  11. 选择您之前创建的 GitHub PAT 令牌作为 **Webhook 凭据**,例如 App Demo PAT。
  12. 单击**保存**。

更新已创建的 App Demo 工作流

之前,已创建 App Demo 工作流。此工作流的目的是确保 App Demo 项目始终同步,并且只要对 App Demo 仓库进行更改,App Demo 任务就会运行容器剧本。

  1. 在 **资源** > **模板** 下,选择您的模板,例如 **App Demo 工作流**。
  2. 在 **详细信息** 部分,选择 **可视化** 选项卡,并点击绿色 **开始** 按钮。
  3. 对于 **节点类型**,选择 **项目同步**,选择相应的项目(例如 **App Demo 项目**),然后点击 **保存**。
  4. 将鼠标悬停在 **App Demo 项目** 上,然后选择加号 "+" 符号。
  5. 在 **添加节点** 窗口中,选择 **成功时** 作为该节点应执行的时间,然后点击 **下一步**。
  6. 选择 **App Demo 任务** 作为 **节点类型**,然后点击 **保存**。
  7. 返回 **可视化** 界面后,点击右上角的 **保存** 按钮。

验证 App Demo 设置

要测试一切是否正常工作,请前往运行 Podman 容器的主机。到达那里后,可以运行以下 podman ps 命令

$ sudo podman ps
CONTAINER ID  IMAGE  COMMAND     CREATED   STATUS    PORTS      NAMES

注意:第一次运行 podman ps 时,您应该没有运行的容器,因为您还没有运行 App Demo 工作流。

转到您的 App Demo GitHub 仓库,修改 **app_demo/group_vars/all.yml** 文件,将 **color: "BLUE"** 更改为 **color: "YELLOW"**,然后将更改推送到 Git 仓库。

转到您的自动化控制器仪表盘,您应该看到 App Demo 工作流正在运行。完成后,在您的主机上,验证容器是否已应用更改。

$ ssh -i </path/to/private-key.pem> ec2-user@<IP>


$ sudo podman exec -it colors env

PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM=xterm
container=podman
PYTHON_VERSION=3.7.0
PYTHON_PIP_VERSION=18.0
LANG=C.UTF-8
GPG_KEY=0D96DF4D4110E5C43FBFB17A2A347FA6AA65421D
APP_COLOR=YELLOW
tree=trunk
HOME=/root

注意 Podman 容器现在正在运行,并且颜色为 YELLOW。

回到 App Demo 仓库,将颜色从 YELLOW 更改为 GREEN,然后将更改推送到 Git 仓库。

自动化控制器仪表盘将运行 App Demo 工作流,完成后,您可以重新运行主机上的相同 exec 命令,并看到颜色已更改为 GREEN。

$ ssh -i </path/to/private-key.pem> ec2-user@<IP>

$ sudo podman exec -it colors env

PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM=xterm
container=podman
PYTHON_VERSION=3.7.0
PYTHON_PIP_VERSION=18.0
LANG=C.UTF-8
GPG_KEY=0D96DF4D4110E5C43FBFB17A2A347FA6AA65421D
APP_COLOR=GREEN
tree=trunk
HOME=/root

结论

本练习的目的是展示 Ansible 和 GitOps 的强大功能。它们可以为您的容器化应用程序提供关键的自动化功能。

虽然在演示中我们对应用程序进行了简单的颜色值更改,但想象一下,我们可以将这种功能应用于

  • 由于安全威胁而修补应用程序。
  • 将应用程序更新到较新版本。
  • 管理边缘的容器化应用程序。

所有这些还没有提到从以下方面继承的优势

  • 标准化应用程序配置。
  • 继承配置版本控制的优势。
  • 轻松跟踪配置设置的更改,使问题修复更加容易。
  • 为我们的应用程序提供单一的事实来源。

这两个工具一起提供的用例和功能是无限的。