我们希望听到您的声音!帮助我们了解 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 只需要存储库范围的访问权限,邀请除外。有关其他范围的信息,请点击表格上方的链接访问文档。

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 文件,它确保我们在剧本中可以使用容器。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 存储库,下一步就是为我们的存储库(例如,app_demo)启用 Webhook。

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

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

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

应用程序演示作业模板在每次更新 Git 存储库时都会自动运行container_playbook.yml 文件。

要创建自动化控制器仪表板中的作业模板

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

更新创建的应用程序演示工作流程

之前已经创建了应用程序演示工作流程。此工作流程的目的是确保应用程序演示项目始终保持同步,并且应用程序演示作业会在每次更改应用程序演示存储库时运行容器剧本。

  1. 在“资源”>“模板”下,选择您的模板,例如应用程序演示工作流程
  2. 在“详细信息”部分中,选择“可视化工具”选项卡,然后点击绿色的“开始”。
  3. 对于“节点类型”,选择“项目同步”,然后选择相应的项目,例如应用程序演示项目,然后点击“保存”。
  4. 将鼠标悬停在“应用程序演示项目”上,然后选择加号“+”符号。
  5. 在“添加节点”窗口中,选择“成功时”作为应执行此节点的时间,然后点击“下一步”。
  6. 选择“应用程序演示作业”作为“节点类型”,然后点击“保存”。
  7. 返回到“可视化工具”后,选择右上角的“保存”按钮。

验证应用程序演示设置

要测试一切是否正常工作,请前往运行 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"` 并  推送您的更改。

前往您的自动化控制器仪表板,您应该会看到 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 容器现在正在运行,并且颜色为黄色。

返回 App Demo 仓库,将颜色从黄色改为绿色,并推送您的更改。

自动化控制器仪表板将运行 App Demo 工作流程,完成后,您可以重新运行来自主机的相同 exec 命令,并查看颜色现在已更改为绿色。

$ 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 的强大功能。两者结合,可以为您的容器化应用程序提供关键的自动化功能。

虽然在演示中我们对应用程序进行了简单的颜色值更改,但想象一下,如果我们将此应用于以下场景:

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

所有这些甚至都没有提到以下继承的优势:

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

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