たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

ansible-builder ansible-runner 入門 builder編

はじめに

こんにちは たそ(@taso_int)です。
12月の中旬に差し掛かろうとしています。
年末に積んでる本を消化したいところです。
昨日AZ900無事受かりました。ちょっと不安でしたが8割ぐらいとれてましたね。
ansible-builderとAnsible-runnerについて
キャッチアップの一環で入門的なものを書いていこうと思います。
今回はbuilder編になります。

ansible-builderとanisble-runnerについて

Ansible Automation Platform 2.1(次以降AAP)がリリースされ、
実行環境(execution environment 次以降ee)が
venv(pythonの仮想環境)からコンテナへと変更されました。
そのためeeのコンテナを作成するansible-builderが必要となります。
またコンテナ上でplaybookを実行させるansible-runnerが必要となります。
どの環境でも同じものを動かすことができるコンテナのメリットを採用している
と考えられます。

ドキュメント

builder

ansible-builder.readthedocs.io

runner

ansible-runner.readthedocs.io

環境

AWS RHEL8
python 3.9.6
ansible-builder 1.0.1
ansible-runner 2.1.1
podman 3.3.1

インストール方法

コンテナのツールであるdockerもしくはpodmanが必要になります。
今回はRHELを使用しているのでpodmanをインストールします。

sudo dnf install -y @container-tools 

pipを使ってanisble-builderとanible-runnerをインストールします。

pip install anisble-builder
pip install ansible-runner

これで以上となります。
Ansibleはeeで入れることになるのでインストールは必要ありません。

eeコンテナの作成

インストールし終わったらeeのコンテナの作成をします。
AAPとの連携がわかってないので、フォルダー配置がわかってないです。
コンテナ用のフォルダーを作成します。
フォルダーの構成はこんな感じです。

XXX
├── ansible.cfg # ansible.cfg
├── execution-environment.yml # コンテナの設定ファイル
├── bindep.txt # dnfでインストールする一覧(今回は使わない)
├── requirements.txt # pipでインストールもの一覧
└── requirements.yml # ansible galaxyでインストールするもの一覧

execution-environment.yml

コンテナの設定ファイルになります。
以下が記入例となります。

---
version: 1

build_arg_defaults:
  EE_BASE_IMAGE: 'quay.io/ansible/ansible-runner:stable-2.12-devel'

ansible_config: 'ansible.cfg' # collection をAutomation Hubからもってくるときの認証情報

dependencies:
  galaxy: requirements.yml # galaxyでインストールする一覧
  python: requirements.txt # pipでインストールする一覧
  system: bindep.txt #dnfでインストールする一覧

additional_build_steps: #コンテナを作成でのオプション
  prepend: |
    RUN pip3 install --upgrade pip setuptools
  append:
    - RUN ls -la /etc
    - ENV AZURE_SUBSCRIPTION_ID=""
    - ENV AZURE_CLIENT_ID=""
    - ENV AZURE_SECRET=""
    - ENV AZURE_TENANT=""

軽い解説をしたいと思います。

EE_BASE_IMAGE

これはeeのAnsible環境(2.9~2.12まである)になります。
コンテナイメージレジストリ

quay.io

コンテナイメージレジストリから自分の使いたい環境を引っ張る形になります。
これらのレジストリは更新されてしまうため時間が経つと変化が起こる可能性があります。
そのためイメージのハッシュ値を指定することで、
そのハッシュ値のイメージを変更なしに使用することが可能です。
例 Ansible2.9のハッシュ値を指定

EE_BASE_IMAGE: 'quay.io/ansible/ansible-runner@sha256:14c06cf54c0f9b090d0c189c0eeb76db2a29f3fd630cb272cc9752ce6c21a6e7

そのイメージのAnsibleのバージョンが見たい場合はpodmanで調べることが可能です。

[ec2-user@ip-172-31-22-9 ~]$ podman run -it quay.io/ansible/ansible-runner:stable-2.12-devel ansible --version
ansible [core 2.12.1.post0]
  config file = None
  configured module search path = ['/home/runner/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  ansible collection location = /home/runner/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.8.8 (default, Aug 25 2021, 16:13:02) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
  jinja version = 2.10.3
  libyaml = True

ansible.cfg

いつもならplaybookのフォルダーに入れたりしますが、
ここで設定することで置く必要がなくなります。
今回はdiffのcontext(デフォルトは3行)を1行にする設定を入れておきます。
訂正
collectionをAutomation Hubからもってくるときの認証情報を指定するanisble.cfgで、
Ansible自体の設定ではありませんでした。
@akira6592さんありがとうございます。

参考 access.redhat.com

dependencies

dependenciesは指定ファイルに書かれているリストをインストールします。
例 requirements.txt

ansible[azure]
pywinrm
paramiko
netaddr

例 requirements.yml

---
collections:
  - name: azure.azcollection
  - name: ansible.windows
  - name: cisco.ios

additional_build_steps

prependがメインビルドの前、appendはメインビルド後で
追加のコマンドを指定することができます。
今回はAzureのデプロイに関する自動化を実行するので、
サービスプリンシパル(AWSのアクセスシークレットキー的なもの)を環境変数として追加します。

作成する

上記のファイル一式を用意したらeeのコンテナを作成します。

ansible-builder build --t eetest --verbosity 3

runnerの設定でコンテナの名前を指定するので--tagを付けることをお勧めします。
--verbosity 3でコンテナの作成ログを確認することができます。

appendで設定した環境変数が確認できますね。

[3/3] STEP 8/11: ENV AZURE_SUBSCRIPTION_ID=""
[3/3] STEP 9/11: ENV AZURE_CLIENT_ID=""
[3/3] STEP 10/11: ENV AZURE_SECRET=""
[3/3] STEP 11/11: ENV AZURE_TENANT=""
[3/3] COMMIT eetest
Successfully tagged localhost/eetest:latest

podmanでコンテナが作成されているか確認しましょう。

(venv) [ec2-user@ip-172-31-22-9 test]$ podman images
REPOSITORY                       TAG                IMAGE ID      CREATED         SIZE
localhost/eetest                 latest             e0fe27474668  7 minutes ago   1.12 GB
<none>                           <none>             f2555b8fd8dc  9 minutes ago   1.12 GB
<none>                           <none>             e8fea866ba54  11 minutes ago  786 MB
quay.io/ansible/ansible-runner   stable-2.12-devel  f36649c10f20  8 hours ago     763 MB
<none>                           <none>             0ef5110917a3  4 days ago      762 MB
<none>                           <none>             b0e87c7a7760  5 days ago      767 MB
quay.io/ansible/ansible-runner   latest             4284ef892283  5 days ago      762 MB
quay.io/ansible/ansible-builder  latest             6ccdd35188d4  5 days ago      655 MB

作られてはいますがnoneが気になりますね。
コンテナの知識があまりないのでここら辺が分かる方は教えてほしいです。
コンテナの勉強がしたい…
おすすめコンテンツがあれば教えてください。

実行するとcontextというディレクトリが生成されます。
(builderのオプションで生成場所の指定も可能)
そこに今回利用したファイルのバックアップやコンテナファイルが保存されます。

これでeeのコンテナが作れたので次はrunnerでplaybookを実行したいと思います。
こちらはrunner編で解説します。
ここまでお疲れ様でした。

参考ブログ

参考にさせて頂いたブログを紹介します。

zaki-hmkc.hatenablog.com

usage-automate.hatenablog.com

rheb.hatenablog.com