【Ansible】Amazon EC2でansible-navigatorを使いたい～第1章：実行環境イメージの作成～

## はじめに

[Red Hat Ansible Automation Platform Workshops][1]において、Ansibleの実行コマンドは、  
``ansible-navigator``になっています。  
``ansible-navigator``を使うようになった経緯は割愛しますが、``ansible-playbook``  
を使ってきた身としては知識のアップデートをする必要性がありそうです。  
そこで、Amazon EC2で``ansible-navigator``の環境構築を実施します。  
まずは、第1章として「実行環境イメージの作成」を実施します。

## TL;DR

- Ansibleの実行コマンドは、``ansible-playbook`` -> ``ansible-navigator``に変化
- Amazon EC2で``ansible-navigator``の環境構築が可能
- ``execution-environment.ymlは``の実行環境のイメージをビルドするために必要な``.yml``ファイル

## 前提

- Amazon EC2の使用方法がわかること
  - 別で構築したRHEL8のサーバーでも可能ですが、一部手順が異なる可能性があります

## 詳細

### 1. EC2インスタンスの作成・ログイン

1. AWSにログインし、サービス「EC2」を選択する
2. 以下の条件でEC2インスタンスを作成する
   - 名前
     - 任意の名前を指定
   - アプリケーションおよび OS イメージ (Amazon マシンイメージ)
     - Red Hat Enterprise Linux 8 (HVM), SSD Volume Type with support by Bansir
   - インスタンスタイプ
     - t2.micro
   - キーペア (ログイン)
     - 自分用のキーペアを指定
   - ネットワーク設定 > ファイアウォール (セキュリティグループ)
     - 自分のIPからSSH接続が可能になるように設定
3. ターミナルソフトなどを使用して、作成したインスタンスにログインする
    - ユーザー名: ec2-user
    - 認証方法: 秘密鍵を指定

### 2. podmanのインストール

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

   ```console
   $ sudo dnf install podman -y
   ```

2. podmanがインストールされたことを確認する

   ```console
   $ podman --version
   podman version 4.2.0
   ```

### 3. Python3.9のインストール

今回はpyenvにPython3.9をインストールして使用します。  
手順は、[GitHub > pyenv / pyenv][4]に準じます。

1. pyenvに必要なモジュールをインストールする

   - 必要なモジュールは[GitHub > pyenv / pyenv > Suggested build environment][5]を参照

   ```console
   $ sudo dnf install -y \
           gcc \
           make \
           zlib-devel \
           bzip2 \
           bzip2-devel \
           readline-devel \
           sqlite \
           sqlite-devel \
           openssl-devel \
           tk-devel \
           libffi-devel \
           xz-devel \
           patch \
           git
   ```

2. pyenvをGithubからクローンする

   ```console
   $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
   ```

3. ``~/.bashrc``を修正する

   ```console
   $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
   $ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
   $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
   ```

4. ``~/.bashrc``を読み込む

   ```console
   $ source ~/.bashrc
   ```


5. pyenvのバージョンを確認

   ```console
   $ pyenv --version
   pyenv 2.3.13-1-g86a4423b
   ```

6. Python 3.9.7をインストールする

   ```console
   pyenv install 3.9.7
   ```

7. Pythonのバージョンを切り替える

   ```console
   pyenv global 3.9.7
   pyenv rehash
   ```

7. Pythonのバージョンが切り替わったことを確認する

   ```console
   $ python --version
   Python 3.9.7
   ```

### 4. ansible-navigatorのインストール

1. pipを最新化する

   ```console
   $ pip install --upgrade pip
   ```

2. ansible-navigatorをインストールする

   ```console
   $ pip install ansible-navigator
   ```

3. ansible-navigatorがインストールされたことを確認する

   ```console
   $ ansible-navigator --version
   ansible-navigator 2.2.0
   ```

4. ansible-builder/ansible-runnerが存在することを確認する
   - ansible-navigatorをインストールすると、ansible-builderやansible-runnerもインストールされます

   ```console
   $ pip list
   Package             Version
   ------------------- --------
   ansible-builder     1.2.0
   ansible-navigator   2.2.0
   ansible-runner      2.3.1
   ～以下、略～
   ```

### 5. 実行環境の設定ファイル作成

[Ansible Builder ガイド][2]を参考にして、実行環境の設定ファイルを作成します。  
作業用ユーザー（/home/ec2-user）のディレクトリ配下に、以下のようなファイルを作成します。

- :file_folder: /home/ec2-user/ansible_test
  - :page_facing_up: execution-environment.yml
  - :page_facing_up: ansible.cfg
  - :page_facing_up: requirements.yml
  - :page_facing_up: requirements.txt

1. 作業用ディレクトリを作成する

   ```console
   $ mkdir ~/ansible_test
   $ cd ~/ansible_test
   ```

2. execution-environment.ymlを作成する
   - ``EE_BASE_IMAGE``に実行環境の元となるイメージを[Red Hat Quay.io > ansible / ansible-runner][3]から選択します

   ```console
   $ vi execution-environment.yml
   ```

   ```yaml:execution-environment.yml
   ---
   version: 1

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

   ansible_config: 'ansible.cfg'

   dependencies:
     galaxy: requirements.yml
     python: requirements.txt

   additional_build_steps:
     prepend: |
       RUN whoami
       RUN cat /etc/os-release
     append:
       - RUN echo This is a post-install command!
       - RUN ls -la /etc
   ```

3. ansible.cfgを作成する

   ```console
   $ vi ansible.cfg
   ```

   ```ini:ansible.cfg
   [defaults]
   host_key_checking = False
   ```

4. requirements.ymlを作成する
   - Ansible Collectionsは必要に応じて追加してください

   ```console
   $ vi requirements.yml
   ```

   ```yaml:requirements.yml
   ---
   collections:
     - community.general
   ```

5. requirements.txtを作成する
   - ここでは、ansible-navigatorとjmespathをインストールします。これらは第2章で使用します
     - ansible-lint: ansible-navigator経由でlintを使用したいのでインストールしておく
     - jmespath: 変数の抽出に使いやすいのでインストールしておく

   ```console
   $ vi requirements.txt
   ```

   ```txt:requirements.txt
   ansible-lint==5.4.0
   jmespath
   ```

6. 実行環境イメージを作成する
   - 実行が完了すると、自動で``context``フォルダが作成されます

   ```console
   $ ansible-builder build -f execution-environment.yml -t ansible-test:v0.0.1 -v 3
   ```

7. 実行環境イメージが作成されたことを確認する
   - 実行環境イメージの名前とTAGが一致していれば問題ありません

   ```console
   $ podman images
   REPOSITORY                                 TAG                 IMAGE ID      CREATED         SIZE
   localhost/ansible-test                     v0.0.1              03fe7ddbce84  10 seconds ago  1.12 GB
   ～以下、省略～
   ```

## さいごに

- 第1章では、ansible-navigatorを使用する第一歩として実行環境イメージを作成しました
- 第2章では、実際にansible-navigatorを使ってplaybookを実行します

## 参考URL

- [Red Hat Ansible Automation Platform Workshops][1]
  - 初心者向けのAnsible Workshopサイト
- [Red Hat Customer Portal > Ansible Builder ガイド][2]
  - 実行環境の設定方法
- [Red Hat Quay.io > ansible / ansible-runner][3]
  - 実行環境の作成に利用可能なコンテナレジストリ
- [GitHub > pyenv / pyenv][4]
  - pyenvのHome
- [GitHub > pyenv / pyenv > Suggested build environment][5]
  - pyenvに必要なモジュールの一覧
- [【Ansible】Amazon EC2でansible-navigatorを使いたい～第2章：ansible-navigatorの実行～][6]
  - 次の記事

---

[1]: https://aap2.demoredhat.com/
[2]: https://access.redhat.com/documentation/ja-jp/red_hat_ansible_automation_platform/2.1/html-single/ansible_builder_guide/index
[3]: https://quay.io/repository/ansible/ansible-runner?tab=tags
[4]: https://github.com/pyenv/pyenv
[5]: https://github.com/pyenv/pyenv/wiki#suggested-build-environment
[6]: https://qiita.com/masa2223/items/f97c00bd62f76d89dbf9