Gitlab RunnerでAnsible EEをansible-buildする
Posted on 2022/10/23(Sun) 00:27 in technical
GitlabのContainer registryを自己署名認証局で使用する
前回(という名のついさっき) GitlabのContainer registryを自己署名認証局で使用する 設定をしました。
今度はGitlab runnerで自分用のカスタムAnsible EEイメージ(中にTerraformの指定バージョンバイナリを入れておきたい)を作って、Gitlab registryにpush出来るようにします。
ansible-builderの設定
ベースになるイメージは https://quay.io/repository/ansible/ansible-runner?tab=tags から適当に選びます。
ansible-builder.readthedocs.io を見ながら ansible-builderに必要なファイルをざっと作ります。
- execution-environment.yml: ansible-builderコマンドで読み込むファイル。必須。
- ansible.cfg: 無くてもいいけど、いつか編集したくなる気がするので追加しておく。
- requirements.txt: 無くてもいいけど、いつか編集したくなる気がするので空ファイルを足しておく。
- requirements.yml: 必須。とりあえず
community.general
だけ入れておく。 - bindep.txt: 必要に応じて追加する。今回はunzipパッケージを追加したかったのでそれだけ書いておく。
$ vi execution-environment.yml # 後述
$ cat <<_EOL_ > ansible.cfg
[defaults]
host_key_checking = False
_EOL_
$ touch requirements.txt
$ cat <<_EOL_ > requirements.yml
---
collections:
- name: community.general
version: 5.7.0
source: https://galaxy.ansible.com
_EOL_
$ echo 'unzip' > bindep.txt
execution-environment.yml
は以下のように書いてみた。
---
version: 1
build_arg_defaults:
EE_BASE_IMAGE: quay.io/ansible/ansible-runner:stable-2.12-devel
ansible_config: ansible.cfg
dependencies:
galaxy: requirements.yml
python: requirements.txt
system: bindep.txt
additional_build_steps:
prepend:
- RUN echo ${PATH}
append: |
RUN curl -LO https://releases.hashicorp.com/terraform/1.2.9/terraform_1.2.9_linux_amd64.zip \
&& unzip terraform_1.2.9_linux_amd64.zip \
&& rm terraform_1.2.9_linux_amd64.zip \
&& mv terraform /usr/local/sbin/ \
&& terraform -v
これで terraform 1.2.9 がインストール済みのAnsible EEコンテナが出来るはずです。
単体の動作確認は省略。
試す場合はDockerインストール済みの環境で ansible-builder build --tag ansible/ee:2.12-custom --container-runtime docker --verbosity 3
とかで試します。
.gitlab-ci.yml の作成
- ansible-builder実行に関する話
image: docker:latest
を指定するとalpineベースのコンテナが降ってくるのでpython3を入れてansible-builderをscriptでインストールします
- うちの環境固有の話
tags: [docker]
を書くとexecutor = "docker"
なGitlab runnerに割り当てられます
- その他
- Gitlabがデフォルトで吐いてくるテンプレートが大体そのままで、rulesは自分がよく使ってる基本系を入れました
$CI_REGISTRY_USER
/"$CI_REGISTRY_PASSWORD"
/$CI_REGISTRY
の3点はGitlabが自動的に設定するので、環境変数を自分で設定する必要はありません
というわけで、上記を踏まえて以下のように書いてcommit & push したらGitlabのWeb UIで Merge request を作成します。
default:
tags:
- docker
# Use the official docker image. Probably its alpine based image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
# Default branch leaves tag empty (= latest tag)
# All other branches are tagged with the escaped branch name (commit ref slug)
script:
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
tag=""
echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
else
tag=":$CI_COMMIT_REF_SLUG"
echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
fi
- apk update && apk add python3
- python3 -m venv /opt/.venv
- /opt/.venv/bin/pip install ansible-builder
- cd append-terraform && /opt/.venv/bin/ansible-builder build --tag $CI_REGISTRY_IMAGE${tag} --container-runtime docker --verbosity 3 && cd -
- docker push "$CI_REGISTRY_IMAGE${tag}"
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- .gitlab-ci.yml
- append-terraform/**/*
Fix: dial tcp: lookup docker: Try again
エラーで引っかかったのでGitlab Runnerの設定を見直します。
$ docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
error during connect: Post "http://docker:2375/v1.24/auth": dial tcp: lookup docker: Try again
Gitlab issue #4566 に沿って /etc/gitlab-runner/config.toml
に volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
を設定してgitlab-runnerを再起動して解消しました。
成功したらGitlab registryに登録されます
pushに成功したら以下のように登録されます。ワイワイ。(画像から得られる情報量が大して無い)
タグ名はブランチ名から勝手に生成されたので ansible-ee-terraform
になっていますね。
Note
ここでのファイルサイズはpull時のダウンロードサイズ。今回作ったAnsible EEの場合はextractしたら多分1GBくらいになります。
終わり
独自のAnsible EEイメージを作ってGitlab registryに置けるようにしました。
Ansible AWXで利用するコンテナイメージとして使える準備が整いそうです。
まぁ...その前にAWX 17.0.1を卒業しないといけないんですが...