介绍在 GitHub Actions 上使用自制工具“ansible-ci-module”来引入在LXD上的ansible CI

1. 概括

在GitHub Actions上,解释了可以准备LXD/LXC环境。

我们介绍了在LXD/LXC上引入Ansible角色的CI工具”ansible-ci-module”。

关于ansible-ci-module的使用方法,我们分别在“在本地环境中使用”和“在GitHub Actions上使用”这两种情况下进行了解释。

在使用「GitHub Actions」时,我们准备了一个用于演示的角色存储库,并在其中介绍了将ansible-ci-module引入的流程。

2. 背景 – (背景)

2.1. 引入Ansible CI的意义

Ansible 是一個可以將各種中間件的安裝和配置步驟以程式碼的形式描述的工具。只需按照步驟書進行執行,基本上中間件應該能正常運作。

为了实现这一点,需要执行ansible的操作确认,但人工操作并不能保证能始终以相同的方式进行操作确认。由于ansible的执行本身非常耗时,所以每次修改代码都在多个环境和场景中进行操作确认将非常耗时,而且容易引发错误。

通过使用 CI 服务,可以省去这些麻烦,并且通过向他人展示 CI 结果,可以简单地解释 ansible 的操作测试已得到很好的处理。

2.2. 将仓库命名为ansible-ci-module的意义是什么?

Ansible CI的代码在大多数角色中都是相似的。因此,我们希望将其作为一个仓库进行管理,并使其可以作为子模块使用。

使用 LXD 而不是 Docker 的原因是什么?

在许多Ansible CI的示例中,使用Docker容器作为基础,将Ansible注入并进行操作验证。

然而,Ansible通常适用于虚拟机或物理机的部署,而Docker是应用程序容器,因此并非总能实现预期的持续集成(例如,在Docker容器中不能使用systemctl等限制存在)。

作为解决这个问题的方法, 可以使用 LXD/LXC 这个系统容器. 由于它是系统容器, 所以几乎可以与虚拟机一样使用.

此外,LXD/LXC 并非虚拟机,因此可以在 GitHub Actions 上运行,无需依赖其他服务如 Travis CI。

3. 介绍Ansible CI模块

首先,让我介绍一下用于ansible CI的工具”ansible-ci-module”。

通過將此工具新增為ansible角色庫,您可以為想要導入CI的庫提供基礎設施CI。主要可實現以下功能:

    • ansible-lint による linting (デフォルト)

 

    • ansible role の流し込み CI (デフォルト)

 

    testinfra によるテスト (設定の必要あり)

构成要素主要包括以下几个方面。

    • ansible

 

    • ansible-lint (ansible コードに対して linting する)

 

    • molecule (ansible の CI 用フレームワーク)

 

    • molecule-lxd (LXD/LXC を molecule から操作するためのドライバ)

 

    tox (python モジュールの複数バージョンのテストをサポートするテストツール)

基本上是在 README.md 文件中总结了使用方法,但我也想在这篇文章中涉及一些基本部分。

4. 本地环境编辑

由于本篇文章的目标是在GitHub Actions上运行CI,因此不需要本地环境。但是,对于首次使用本篇文章中的工具的人来说,他们经常不知道从哪里入手,因此我建议首先准备本地工作环境。

4.1. 安装

前提:

首先,需要安装必要的工具作为前提。

    • python (>= 3.6)

 

    • LXD/LXC 環境の用意

 

    tox のインストール (pip などでインストール)
## 必要な deb パッケージのインストール
$ sudo apt update
$ sudo apt install lxd lxd-tools qemu-block-extra python3 python3-pip python3-setuptools

## LXD の初期設定
$ sudo lxd init --auto
$ sudo usermod -aG lxd $(whoami)

## tox のインストール
$ pip3 install tox

因为已经多次讨论了LXD/LXC的必要性,所以我们将省略此部分。

tox 是一个测试工具,用于支持对 Python 库的多个版本进行测试。例如,

    • ansible のバージョンごとに CI をしたい (ansible 2.9, 2.10 など).

 

    OS のバージョンごとに CI をしたい (ubuntu18.04, ubuntu20.04 など).

在这些情况下,可以使用tox来更轻松地配置矩阵工作。

4.1.2. 安装 ansible-ci 模块

将此存储库作为子模块添加到 role 目录中。

$ git submodule add https://github.com/link-u/ansible-ci-module.git

在添加角色后,目录结构将如下所示。

<role directory>/
├── defaults/...
├── tasks/...
├── ...
│
└── ansible-ci-module/  ## サブモジュールとして追加した ansible-ci-module リポジトリ

4.2. 如何使用

本文将介绍README中的”5. 使用方法(基础篇)”。

如果您按照到此为止的设置,即使不进行任何定制,也可以使用以下的公司形象设计。

    • ansible-lint による linting

 

    LXD コンテナへの ansible の流し込み CI

4.2.1. 关于 tox 的配置文件

tox的设置预先准备在<角色目录>/ansible-ci-module/tox.ini中。
预先准备的tox.ini如下所示。

$ cat ansible-ci-module/tox.ini
[tox]
minversion = 3.6
envlist = {ubuntu1804,ubuntu2004}-ansible{28,29}

[testenv]
basepython = python3
deps =
    wheel
    molecule
    molecule-lxd
    testinfra
    ansible28: ansible>=2.8,<2.9
    ansible29: ansible>=2.9,<2.10
    ansible-lint

setenv =
    ubuntu1804: MOLECULE_DISTRO = bionic
    ubuntu2004: MOLECULE_DISTRO = focal

    ansible28: ANSIBLE_VER = ansible28
    ansible29: ANSIBLE_VER = ansible29

passenv =
    LANG
    HOME
    MOLECULE_DISTRO
    ANSIBLE_VER
    MOLECULE_SCENARIO

commands =
    python3 ./scripts/molecule_test.py

4.2.2. 如何使用 tox 命令

本模块将介绍使用 tox 命令的基本方法。

确认CI矩阵任务的方法

$ tox -c ansible-ci-module/tox.ini --listenvs
ubuntu1804-ansible28
ubuntu1804-ansible29
ubuntu2004-ansible28
ubuntu2004-ansible29

执行 CI 的方法

## 全パターン CI を実行
$ tox -c ansible-ci-module/tox.ini

## ubuntu2004-ansible29 を指定して CI を実行
$ tox -c ansible-ci-module/tox.ini -e ubuntu2004-ansible29

5. GitHub Actions 编辑

本文介绍了在GitHub Actions上执行CI的方法。

5.1. 安装

5.1.1. 安装ansible-ci-module

与本地版本一样,将该代码库作为子模块添加到角色目录中。

$ git submodule add https://github.com/link-u/ansible-ci-module.git

在将角色添加到后,目录结构将如下所示。

<role directory>/
├── defaults/...
├── tasks/...
├── ...
│
└── ansible-ci-module/  ## サブモジュールとして追加した ansible-ci-module リポジトリ

5.1.2. 配置GitHub Actions所需的工作流文件

要使用GitHub Actions,您需要将工作流文件放置在存储库的根目录(本例中为<角色目录>)下,路径为.github/workflows/<文件名>.yml。

可以使用任何文件名,在本文中我们将其保存为ansible-ci.yml。
实际上,可以直接使用ansible-ci-module子模块中提供的示例,将其复制到指定的目录中。

$ cd <role directory>/
$ mkdir -p .github/workflows/
$ cp ansible-ci-module/github_workflow_samples/ansible-ci.yml .github/workflows/

设置后会是以下类似的目录结构。

<role directory>/
├── defaults/...
├── tasks/...
├── ...
│
├── ansible-ci-module/       ## サブモジュールとして追加した ansible-ci-module リポジトリ
└── .github/
    └── workflows/
        └── ansible-ci.yml   ## ワークフローファイル

这个工作流文件的内容如下所示。

name: ansible ci

on:
  push:
    branches:
      - "**"
    tags:
      - v*

jobs:
  create-matrix:
    runs-on: ubuntu-20.04
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - name: Install pip3 and tox
        run: |
          sudo apt update
          sudo apt -y install python3 python3-pip python3-setuptools
          sudo pip3 install tox

      - uses: actions/checkout@v2
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Create tox env list
        id: set-matrix
        run: |
          MATRIX=$(python3 ansible-ci-module/scripts/matrix.py)
          echo "::set-output name=matrix::${MATRIX}"

  ansible-ci:
    needs: create-matrix
    runs-on: ubuntu-20.04
    strategy:
      matrix: ${{ fromJson(needs.create-matrix.outputs.matrix) }}
      fail-fast: False
    steps:
      - name: Install LXD and CI tools
        run: |
          sudo apt update
          sudo apt install lxd lxd-tools qemu-block-extra python3 python3-pip python3-setuptools

      - name: Configure LXD
        run: |
          sudo lxd init --auto

      - name: Install tox using python3-pip
        run: |
          sudo pip3 install tox

      - uses: actions/checkout@v2
        with:
          submodules: recursive
          fetch-depth: 0

      - name: ansible-ci
        run: |
          if [ -f ./tox.ini ]; then
            sudo MOLECULE_SCENARIO=${{ matrix.scenario }} tox -e ${{ matrix.tox_env }} -c tox.ini
          else
            sudo MOLECULE_SCENARIO=${{ matrix.scenario }} tox -e ${{ matrix.tox_env }} -c ansible-ci-module/tox.ini
          fi

在这个工作流程中,大致可以分为以下两个任务。

    • create-matrix

 

    ansible-ci

使用create-matrix来配置GitHub Actions的矩阵作业,该作业数量由tox –listenvs列举。

在Ansible CI中,通过create-matrix同时并行执行由矩阵作业构建的任务。

5.2. 实际引入

你好,Ansible!我准备了一个专门用于部署带有文本文件”Hello, ansible!”的演示的ansible角色。

我会按照本文中所述的步骤,为这个角色添加CI。

## role ディレクトリに移動
cd ansible-roles_hello-demo

## ansible-ci-module をサブモジュールとして追加
$ git submodule add https://github.com/link-u/ansible-ci-module.git

## GitHub Actions のワークフローファイルを用意
$ mkdir -p .github/workflows/
$ cp ansible-ci-module/github_workflow_samples/ansible-ci.yml .github/workflows/

你可以通过点击这个链接来查看 GitHub Actions 的作业状态。
https://github.com/y-hashida/ansible-roles_hello-demo/actions

我会去检查其中之一 https://github.com/y-hashida/ansible-roles_hello-demo/actions/runs/410675108。

2020-12-09_v2.png
2020-12-09_v4.png

6. 总结

我在GitHub Actions上解释了可以准备LXD/LXC环境。

再者,我介绍了在LXD/LXC上使用ansible角色的CI工具“ansible-ci-module”,并将其使用方式分为“在本地环境使用”和“在GitHub Actions上使用”两种情况进行解释。

最后,我解释了如何在GitHub Actions上使用,准备了一个演示用的角色存储库,并介绍了如何在其中引入ansible-ci-module。

我刚才的解释可能有点长,但是如果你能设定一个目标来尝试运行”5.2. 实际部署”的步骤,就能够真正体会到使用ansible-ci变得容易的感觉。

广告
将在 10 秒后关闭
bannerAds