はじめに
2021年頃からAnsible実行環境のコンテナ化が進んできています。今回は、Amazon EC2を用いて、GitLab Runner経由でAnsible実行環境のコンテナイメージを使用可能にするまでの流れを紹介します。
第2章では「Runnerの登録・実行」を実施します。
TL;DR
- GitLab Runner実行時に、Ansible実行環境のコンテナイメージを指定することが可能
- Ansible実行環境のコンテナイメージを使用することで、開発とプロダクション間の環境差分のリスクが減る
-
execution-environment.yml
には、OSパッケージ・Pythonモジュール・Collectionなどを指定する
前提条件
- GitLabの最低限の操作を理解していること(プロジェクトの作成・ファイルの編集)
- AWSにGitLabが構築済みであること(実際に操作する場合)
実行環境
- Red Hat Enterprise Linux: 9.2
- GitLab: v16.7.0-ee
- GitLab Runner: 16.7.0
- Python: 3.9.16
- Podman: 4.6.1
- Ansible Builder: 3.0.0
詳細
GitLab RunnerにおけるGroup Runnerを使用して、ec2-user
ユーザーが作成したAnsible実行環境のコンテナイメージを使えるようにします
1. Group用のToken作成
-
ブラウザからGitLabにログインする
- URL
- http://<GitLab Global IPv4 Address>
- user
- root
- password
- 設定したパスワード
- URL
-
画面左の[Groups]を選択する
-
[New Group]を選択する
-
[Create group] を選択する
-
以下の内容を入力し、[Create Group]を選択する
- Group name
- test_group
- Group URL
- http://<GitLab Global IPv4 Address>/test_group
- Visibility level
- Private
- Group name
-
作成されたGroup(
test_group
)画面左の、[Build] > [Runners]を選択する -
右上の
・・・
を選択し、Registration token
の下にあるGroup用のToken
をメモしておく(Runnerの登録時に使用する)
2. Podmanのインストール
-
ターミナルソフト(Tera Termなど)でサーバーにログインする
- IP Address
- <GitLab Global IPv4 Address>
- user
- ec2-user
RHEL9に対してRSA鍵でSSHログインする場合、Tera Termのバージョンは5以上にする必要がある
- IP Address
-
podmanをインストールする
$ sudo dnf install -y podman
-
podmanがインストールされたことを確認する
$ podman --version podman version 4.6.1
3. GitLab Runnerのインストール
Red Hat > Set up GitLab CI and GitLab Runner to configure Ansible automation controllerによると、RHEL 8ではDockerの代わりにPodmanを使用するようにGitLab Runnerを構成するのが合理的だそうです。RHEL 9でも同じ手順で可能でした。
-
GitLab Runnerのパッケージをリポジトリに追加する
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
-
GitLab Runnerをインストールする
$ sudo dnf install -y gitlab-runner
-
GitLab Runnerがインストールされたことを確認する
$ gitlab-runner --version Version: 16.7.0 ~以下、省略~
-
Podmanソケットを有効にして起動する
-
ec2-user
ユーザーの状態で以下のコマンドを実行することで、ec2-user
ユーザーが作成したAnsible実行環境のコンテナイメージを使えるようになる
$ systemctl enable --user --now podman.socket
-
-
Podmanソケットがリッスンしていることを確認する
$ systemctl status --user podman.socket ● podman.socket - Podman API Socket Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; preset: disabled) Active: active (listening) since Sat 2023-12-30 12:54:31 UTC; 46min ago Until: Sat 2023-12-30 12:54:31 UTC; 46min ago Triggers: ● podman.service Docs: man:podman-system-service(1) Listen: /run/user/1000/podman/podman.sock (Stream) CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/podman.socket
その際に、
Listenに書いてあるパス
をメモしておく(Runnerの登録で使用する)/run/user/1000/podman/podman.sock
-
ec2-user
ユーザーがログアウトした後も、Podmanソケットを利用可能にする- これを実行しない場合、EC2インスタンスを停止->開始した後に
ec2-user
ユーザーでログインし直さないとpodmanのサービスが起動せず、GitLab Runnerが失敗する
$ sudo loginctl enable-linger ec2-user
- これを実行しない場合、EC2インスタンスを停止->開始した後に
4. Ansible Builderのインストール
-
Python仮想環境を作成する
$ python3 -m venv ~/venv
-
Python仮想環境を起動する
$ source ~/venv/bin/activate
-
Ansible Builderをインストールする
$ pip install ansible-builder
-
Ansible Builderがインストールされたことを確認する
$ ansible-builder --version 3.0.0
5. Ansible BuilderによるAnsible実行環境のコンテナイメージの作成
-
ホームディレクトリ(/home/ec2-user)に移動する
cd ~
-
作業用のディレクトリを作成し、移動する
$ mkdir custom-ee && cd custom-ee
-
実行環境のコンテナイメージ用のファイルを作成する
-
execution-environment.yml
には、OSパッケージ・Pythonモジュール・Collectionなどを指定する
$ vi execution-environment.yml
--- version: 3 images: base_image: name: quay.io/centos/centos:stream9-minimal options: package_manager_path: /usr/bin/microdnf dependencies: python_interpreter: package_system: python3.11 python_path: /usr/bin/python3.11 ansible_core: package_pip: ansible-core==2.16.0 ansible_runner: package_pip: ansible-runner==2.3.0 python: - ansible-lint - yamllint galaxy: collections: - ansible.utils
-
-
Ansible実行環境のコンテナイメージを作成する
$ ansible-builder build -f execution-environment.yml -t ansible216:v1.0 -v 3
-
Ansible実行環境のコンテナイメージが作成されたことを確認する
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/ansible216 v1.0 XXXXXXXXXXXX About a minute ago 295 MB <none> <none> XXXXXXXXXXXX About a minute ago 298 MB <none> <none> XXXXXXXXXXXX About a minute ago 235 MB quay.io/centos/centos stream9-minimal XXXXXXXXXXXX 2 weeks ago 100 MB
6. Runnerの登録
-
Runnerを登録する
-
GitLab > GitLab Runner commandsによると、
--non-interactive
で一気にコマンド入力が可能 - ここで、前の手順でメモした
Group用のToken
を使用する
$ sudo gitlab-runner register \ --non-interactive \ --url 'http://<GitLab Private IPv4 Address>' \ --registration-token '<GitLab Group Token>' \ --executor 'docker' \ --docker-image centos:stream9-minimal \ --description 'runner test' \ --tag-list 'ansible_ee'
-
GitLab > GitLab Runner commandsによると、
-
config.tomlを編集する
$ sudo vi /etc/gitlab-runner/config.toml
- 以下の設定を追加
-
[[runners]]
セクションenvironment = ["FF_NETWORK_PER_BUILD=1"] clone_url = "http://<GitLab Private IPv4 Address>"
-
[runners.docker]
セクション- GitLab Runnerでは
ec-user
ユーザーで作成したAnsible実行環境のコンテナイメージを使用する - ここで、前の手順でメモした
Listenに書いてあるパス
を使用する
host = "unix:///run/user/1000/podman/podman.sock" pull_policy = "never"
- GitLab Runnerでは
-
- 以下の設定を追加
-
GitLab Runnerを再起動する
$ sudo gitlab-runner restart
7. CIパイプラインの実行
-
ブラウザからGitLabにログインする
- URL
- http://<GitLab Global IPv4 Address>
- user
- root
- password
- 設定したパスワード
- URL
-
ホーム画面での
Create a project
を選択する -
Create blank project
を選択する -
以下の内容を入力し、
Create project
を選択する- Project name
- test_project
- Project URL
- http://<GitLab Global IPv4 Address>/test_group/test_project
- Visibility Level
- Private
- Project Configuration
-
Initialize repository with a README
にチェック
-
- Project name
-
[Edit] > [Web IDE]を選択して、編集画面を開く
-
以下のような
.gitlab-ci.yml
を作成する--- default: image: localhost/ansible216:v1.0 stages: - stage_1 job_1: stage: stage_1 script: - ansible --version - ansible-galaxy collection list tags: - ansible_ee
-
変更内容をCommitして、Project(
test_project
)の画面に戻る -
画面左の[Build] > [Jobs]を選択する
- Job実行時のtag(
ansible_ee
)が確認できる
- Job実行時のtag(
-
最新のJobを選択し、成功していることを確認する
$ ansible --version ansible [core 2.16.0] config file = None configured module search path = ['/runner/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python3.11/site-packages/ansible ansible collection location = /runner/.ansible/collections:/usr/share/ansible/collections executable location = /usr/local/bin/ansible python version = 3.11.5 (main, Sep 7 2023, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] (/usr/bin/python3.11) jinja version = 3.1.2 libyaml = True $ ansible-galaxy collection list # /usr/share/ansible/collections/ansible_collections Collection Version ------------- ------- ansible.utils 3.0.0 Job succeeded
さいごに
- GitLab Runner実行時に、Ansible実行環境のコンテナイメージを指定することが可能であることがわかりました
- Ansible実行環境のコンテナイメージを使用することで、開発とプロダクション間の環境差分のリスクが減るはずなので積極的に活用しましょう
- 「あれ?同じPlaybookを実行しているのにエラーになるぞ?」ということが減るはずです
参考URL
-
GitLab > Manage runners
- GitLab Runnerにおけるタイプごとの設定方法
-
Red Hat > Set up GitLab CI and GitLab Runner to configure Ansible automation controller
- GitLab Runnerで Podman を使用する方法(1)
-
opensource > How to use Podman in GitLab Runners
- GitLab Runnerで Podman を使用する方法(2)
-
Ansible Builder Documentation > Execution Environment Definition
-
execution-environment.yml
の記載方法
-
-
GitLab > GitLab Runner commands
- gitlab-runnerコマンドの使い方