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.tomlvolumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"] を設定してgitlab-runnerを再起動して解消しました。

成功したらGitlab registryに登録されます

pushに成功したら以下のように登録されます。ワイワイ。(画像から得られる情報量が大して無い)

ansible_builder_on_gitlab_runner_001

タグ名はブランチ名から勝手に生成されたので ansible-ee-terraform になっていますね。

ansible_builder_on_gitlab_runner_002

Note

ここでのファイルサイズはpull時のダウンロードサイズ。今回作ったAnsible EEの場合はextractしたら多分1GBくらいになります。

終わり

独自のAnsible EEイメージを作ってGitlab registryに置けるようにしました。
Ansible AWXで利用するコンテナイメージとして使える準備が整いそうです。

まぁ...その前にAWX 17.0.1を卒業しないといけないんですが...