2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ansible】GitLab RunnerでAnsible実行環境のコンテナイメージを使いたい~第2章:Runnerの登録・実行~

Last updated at Posted at 2023-12-30

はじめに

2021年頃からAnsible実行環境のコンテナ化が進んできています。今回は、Amazon EC2を用いて、GitLab Runner経由でAnsible実行環境のコンテナイメージを使用可能にするまでの流れを紹介します。
第2章では「Runnerの登録・実行」を実施します。

TL;DR

  • GitLab Runner実行時に、Ansible実行環境のコンテナイメージを指定することが可能
  • Ansible実行環境のコンテナイメージを使用することで、開発とプロダクション間の環境差分のリスクが減る
  • execution-environment.ymlには、OSパッケージ・Pythonモジュール・Collectionなどを指定する

前提条件

実行環境

  • 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作成

  1. ブラウザからGitLabにログインする

    • URL
      • http://<GitLab Global IPv4 Address>
    • user
      • root
    • password
      • 設定したパスワード
  2. 画面左の[Groups]を選択する

  3. [New Group]を選択する

  4. [Create group] を選択する

  5. 以下の内容を入力し、[Create Group]を選択する

    • Group name
      • test_group
    • Group URL
      • http://<GitLab Global IPv4 Address>/test_group
    • Visibility level
      • Private
  6. 作成されたGroup(test_group)画面左の、[Build] > [Runners]を選択する

  7. 右上の・・・を選択し、Registration tokenの下にあるGroup用のTokenをメモしておく(Runnerの登録時に使用する)

    group_token.png

2. Podmanのインストール

  1. ターミナルソフト(Tera Termなど)でサーバーにログインする

    • IP Address
      • <GitLab Global IPv4 Address>
    • user
      • ec2-user

    :warning: RHEL9に対してRSA鍵でSSHログインする場合、Tera Termのバージョンは5以上にする必要がある

  2. podmanをインストールする

    $ sudo dnf install -y podman
    
  3. 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でも同じ手順で可能でした。

  1. GitLab Runnerのパッケージをリポジトリに追加する

    $ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
    
  2. GitLab Runnerをインストールする

    $ sudo dnf install -y gitlab-runner
    
  3. GitLab Runnerがインストールされたことを確認する

    $ gitlab-runner --version
    Version:      16.7.0
    ~以下、省略~
    
  4. Podmanソケットを有効にして起動する

    • ec2-userユーザーの状態で以下のコマンドを実行することで、ec2-userユーザーが作成したAnsible実行環境のコンテナイメージを使えるようになる
    $ systemctl enable --user --now podman.socket
    
  5. 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
    
  6. ec2-userユーザーがログアウトした後も、Podmanソケットを利用可能にする

    • これを実行しない場合、EC2インスタンスを停止->開始した後にec2-userユーザーでログインし直さないとpodmanのサービスが起動せず、GitLab Runnerが失敗する
    $ sudo loginctl enable-linger ec2-user
    

4. Ansible Builderのインストール

  1. Python仮想環境を作成する

    $ python3 -m venv ~/venv
    
  2. Python仮想環境を起動する

    $ source ~/venv/bin/activate
    
  3. Ansible Builderをインストールする

    $ pip install ansible-builder
    
  4. Ansible Builderがインストールされたことを確認する

    $ ansible-builder --version
    3.0.0
    

5. Ansible BuilderによるAnsible実行環境のコンテナイメージの作成

  1. ホームディレクトリ(/home/ec2-user)に移動する

    cd ~
    
  2. 作業用のディレクトリを作成し、移動する

    $ mkdir custom-ee && cd custom-ee
    
  3. 実行環境のコンテナイメージ用のファイルを作成する

    • 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
    
  4. Ansible実行環境のコンテナイメージを作成する

    $ ansible-builder build -f execution-environment.yml -t ansible216:v1.0 -v 3
    
  5. 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の登録

  1. 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'
    
  2. 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"
        
  3. GitLab Runnerを再起動する

    $ sudo gitlab-runner restart
    

7. CIパイプラインの実行

  1. ブラウザからGitLabにログインする

    • URL
      • http://<GitLab Global IPv4 Address>
    • user
      • root
    • password
      • 設定したパスワード
  2. ホーム画面でのCreate a projectを選択する

  3. Create blank projectを選択する

  4. 以下の内容を入力し、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にチェック
  5. [Edit] > [Web IDE]を選択して、編集画面を開く

    web_ide.png

  6. 以下のような.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
    
  7. 変更内容をCommitして、Project(test_project)の画面に戻る

    commit.png

  8. 画面左の[Build] > [Jobs]を選択する

    • Job実行時のtag(ansible_ee)が確認できる

    job.png

  9. 最新の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

関連記事


2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?