【AAP2.5】 Ansible Automation Platform2.5のインストールを試してみた

## はじめに
この記事は、Ansible Automation Platform (AAP)を初めてインストールした初心者の経験をまとめたものです。

個人的に詰まった点を書いているので、これからAAP2.5をインストールする方の参考になれば幸いです。

具体的にどこで詰まったか、どう解決したかについては、記事の最後で説明しています。

## 背景

2024/09/30にAAP2.5がリリースされました。

AAPをインストールしてみたいと考えていたところに、最新バージョンがリリースされたため、試してみました。

この記事ではRed Hatのインストールガイドに従ってインストールを実施します。
また、インストール方法は2.5より追加されたコンテナでのインストール方式を用います。

https://docs.redhat.com/ja/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/index

(コンテナでのインストールは単純にインストール方法が増えたって意味じゃなくて、将来的に従来のRPM版に置き換わるらしい)

https://docs.redhat.com/ja/documentation/red_hat_ansible_automation_platform/2.5/html/release_notes/new-features

## Ansible Automation Platform(AAP)とは

一応AAPについて、今回の主題はインストールなので簡単に説明。既に知ってる方は読み飛ばしてください。

Ansible Automation PlatformはRed Hatが提供する自動化プラットフォーム。

AAPには主に
- Automation Controller
- Automation Hub
- Event-Driven Ansible Controller
- Platform gateway

など様々なコンポーネントが含まれています。

#### とても簡単な説明
- Automation Controller
Ansible Playbookの実行方法を定義したテンプレートを用いてPlaybookを実行するコンポーネント。
WebUIからの実行はもちろん、API経由で実行することも可能。
　
- Automation Hub
Ansibleで使うコレクションを保管しておくリポジトリ。社内だけなど閉じた環境で管理したいときに使うコンポーネント。
　
- Event-Driven Ansible Controller
Event-Driven Ansible(EDA)は、Rulebookと呼ばれるyamlファイルでルールを定義しておき、ルールで定義したイベントが発生した時に指定したPlaybookを実行させることができるコンポーネント。(こいつが直接Playbookを実行するのではなくAutomation Controllerに実行命令を送る形)

　
- Platform gateway
AAP2.5より追加されたコンポーネント。
それぞれ独立していたContorollerやHubなどのWebUI、認証がPlatform gatewayに統合された。
Platform gatewayを入口としてAAPの様々なコンポーネントにアクセスするイメージ。

## 今回インストールするコンポーネントについて
上記のようにAAPには様々なコンポーネントが含まれていますが、必ずしも全てをインストールする必要はありません。

今回はAutomation Controllerをインストールします。

2.4以前であればAutomation Controller単体のインストールができましたが、前述した通り認証やWebUIはPlatform gatewayに統合されたためこちらもインストールする必要があります。

よって今回インストールするのはAutomation ControllerとPlatform gatewayの2つとなります。


## インストール環境について

今回はAWSのEC2で構築を行います。
詳細は以下の通り。

| OS           | インスタンスタイプ | ストレージ |　SG |
|--------------|--------------------|------------|----|
| RHEL 9.4     | m5.large           | 30GB       |TCP/22, TCP/443|

m5.largeでは推奨要件を下回ってますが、インストールと簡単なジョブテンプレートが実行できればいいので今回はこれで。

(と言うかRed Hatの言う推奨要件は1つのマシンにどれをインストールする時の推奨なんでしょうね。全部盛り？)

Red Hatの推奨要件

https://docs.redhat.com/ja/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/system_requirements

#### VPCの設定に関する注意
EC2で構築を行っている場合はVPCの「DNSホスト名」の設定が有効になっていることを確認してください。
具体的な理由は最後にまとめてます。
(VPC->対象VPCを選択->アクション->VPCの設定を編集->DNSの設定より変更可能)

## インストーラのダウンロード

インストーラをRed Hatのページよりダウンロードします。(アクセスにはRed Hatアカウントでのログインが必須)

下記ページより「Download」に進んでダウンロードしてください。

https://access.redhat.com/products/red-hat-ansible-automation-platform/


ページ上部にあるRHEL及びAAPのバージョンに注意。

バージョンごとにインストーラが異なるため、構築する環境に合ったものをダウンロードするようにしてください。

また、インストール方式ごとにもインストーラが分かれているため、自身が行う方式の方を選ぶこと。

今回はコンテナを使用した方式でインストールするため以下を選択。

```Ansible Automation Platform 2.5 Containerized Setup```

#### Bundle版とは

名前の最後に「Bundle」と書かれているものはインストールに必要なパッケージやコンテナイメージをすべてインストーラに含んだものになります。インターネットへの疎通がないマシンでインストールを行う場合はそちらを選びましょう。

パッケージなどをすべて含むためサイズがデカい点に注意。

## インストール前の準備
- 名前解決について
AAPのインストール時に使用するパラメータではインストール対象のFQDNを指定します。そのため対象とするマシンの名前解決を行えるようにしておく必要があります。
　
注意：この時指定する名前として`localhost`は使用できません。
　
EC2を利用する場合は自動的にホスト名が解決できるようになるため設定は不要ですが、そうでない環境の場合はDNSで名前解決を行えるように設定しましょう。
今回使用したマシンのFQDNは以下
```ip-10-0-0-203.ap-northeast-1.compute.internal```
　
- dnfリポジトリの設定
これまたEC2では設定不要ですが、自前で用意したRHELの場合はdnfリポジトリの登録をしてください。
今回インストールを行ったマシンの`dnf repolist`は以下のようになっていました。
BaseOSとAppStreamが有効であればいいらしい。
    ```
    repo id                                                              repo name
    rhel-9-appstream-rhui-rpms                                           Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)
    rhel-9-baseos-rhui-rpms                                              Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)
    rhui-client-config-server-9                                          Red Hat Enterprise Linux 9 Client Configuration
    ```
　
- Ansible-coreのインストール
AAPのインストールにAnsibleを用いる点はRPM版と同じですが、コンテナ版では相違点としてAnsibleを事前にインストールしておく必要があります。
    ```
    sudo dnf -y install ansible-core
    ```
    インストールされたAnsibleは以下
    ```
    $ ansible --version
    ansible [core 2.14.14]
  config file = /home/ec2-user/templ/ansible-automation-platform-containerized-setup-2.5-1/ansible.cfg
  configured module search path = ['/home/ec2-user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /home/ec2-user/templ/ansible-automation-platform-containerized-setup-2.5-1/collections
  executable location = /usr/bin/ansible
  python version = 3.9.18 (main, Jan 24 2024, 00:00:00) [GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True
    ```
　
- インストーラの展開
Red Hatよりダウンロードしたインストーラファイルをマシンに配置します。
解凍して移動
    ```
    $ ls
    ansible-automation-platform-containerized-setup-2.5-1.tar.gz
    $ tar xfz ansible-automation-platform-containerized-setup-2.5-1.tar.gz
    $ cd ansible-automation-platform-containerized-setup-2.5-1
    [ansible-automation-platform-containerized-setup-2.5-1]$ ls
    ansible.cfg  collections  inventory  inventory-growth  README.md
    ```
#### 各ファイルについて
- `ansible.cfg`
インストール時に動作するAnsibleの設定を定義してあるファイル。
- `collections`
インストールやアンインストールを行うためのコレクションが入っているディレクトリ。
- `inventory` `inventory-growth`
インストールパラメータを指定するファイルの雛形。
- `README.md`
インベントリファイルで指定する値についての説明が記述されているファイル。

### インベントリファイルの編集
インストーラには`inventory`と`inventory-growth`の2つが入っていますが、これはサンプルとして記載されている値が違うだけなのでどちらを編集しても大丈夫です。
今回は単一マシンにインストールを行う構成であり、`inventory-growth`の方が目的に沿ったサンプルが書かれているためこちらをベースとします。

参考：デフォルトのインベントリファイル
<details><summary>inventory(クリックで展開)</summary>

```
# This is the AAP enterprise installer inventory file
# Please consult the docs if you're unsure what to add
# For all optional variables please consult the included README.md
# or the Red Hat documentation:
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation

# This section is for your AAP Gateway host(s)
# -----------------------------------------------------
[automationgateway]
gateway1.example.org
gateway2.example.org

# This section is for your AAP Controller host(s)
# -----------------------------------------------------
[automationcontroller]
controller1.example.org
controller2.example.org

# This section is for your AAP Execution host(s)
# -----------------------------------------------------
[execution_nodes]
hop1.example.org receptor_type='hop'
exec1.example.org
exec2.example.org

# This section is for your AAP Automation Hub host(s)
# -----------------------------------------------------
[automationhub]
hub1.example.org
hub2.example.org

# This section is for your AAP EDA Controller host(s)
# -----------------------------------------------------
[automationeda]
eda1.example.org
eda2.example.org

[redis]
gateway1.example.org
gateway2.example.org
hub1.example.org
hub2.example.org
eda1.example.org
eda2.example.org

[all:vars]

# Common variables
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-general-inventory-variables
# -----------------------------------------------------
registry_username=<your RHN username>
registry_password=<your RHN password>

# AAP Gateway
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-gateway-variables
# -----------------------------------------------------
gateway_admin_password=<set your own>
gateway_pg_host=externaldb.example.org
gateway_pg_database=<set your own>
gateway_pg_username=<set your own>
gateway_pg_password=<set your own>

# AAP Controller
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-controller-variables
# -----------------------------------------------------
controller_admin_password=<set your own>
controller_pg_host=externaldb.example.org
controller_pg_database=<set your own>
controller_pg_username=<set your own>
controller_pg_password=<set your own>

# AAP Automation Hub
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-hub-variables
# -----------------------------------------------------
hub_admin_password=<set your own>
hub_pg_host=externaldb.example.org
hub_pg_database=<set your own>
hub_pg_username=<set your own>
hub_pg_password=<set your own>

# AAP EDA Controller
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#event-driven-ansible-controller
# -----------------------------------------------------
eda_admin_password=<set your own>
eda_pg_host=externaldb.example.org
eda_pg_database=<set your own>
eda_pg_username=<set your own>
eda_pg_password=<set your own>
```

</details>


<details><summary>inventory-growth(クリックで展開)</summary>

```
# This is the AAP growth installer inventory file
# Please consult the docs if you're unsure what to add
# For all optional variables please consult the included README.md
# or the Red Hat documentation:
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation

# This section is for your AAP Gateway host(s)
# -----------------------------------------------------
[automationgateway]
aap.example.org

# This section is for your AAP Controller host(s)
# -----------------------------------------------------
[automationcontroller]
aap.example.org

# This section is for your AAP Automation Hub host(s)
# -----------------------------------------------------
[automationhub]
aap.example.org

# This section is for your AAP EDA Controller host(s)
# -----------------------------------------------------
[automationeda]
aap.example.org

# This section is for the AAP database
# -----------------------------------------------------
[database]
aap.example.org

[all:vars]

# Common variables
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-general-inventory-variables
# -----------------------------------------------------
postgresql_admin_username=postgres
postgresql_admin_password=<set your own>

registry_username=<your RHN username>
registry_password=<your RHN password>

redis_mode=standalone

# AAP Gateway
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-gateway-variables
# -----------------------------------------------------
gateway_admin_password=<set your own>
gateway_pg_host=aap.example.org
gateway_pg_password=<set your own>

# AAP Controller
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-controller-variables
# -----------------------------------------------------
controller_admin_password=<set your own>
controller_pg_host=aap.example.org
controller_pg_password=<set your own>

# AAP Automation Hub
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#ref-hub-variables
# -----------------------------------------------------
hub_admin_password=<set your own>
hub_pg_host=aap.example.org
hub_pg_password=<set your own>

# AAP EDA Controller
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/containerized_installation/appendix-inventory-files-vars#event-driven-ansible-controller
# -----------------------------------------------------
eda_admin_password=<set your own>
eda_pg_host=aap.example.org
eda_pg_password=<set your own>
```

</details>

今回インストールに使用したinventoryファイルは以下になります。
```
[automationgateway]
ip-10-0-0-203.ap-northeast-1.compute.internal ansible_connection=local

[automationcontroller]
ip-10-0-0-203.ap-northeast-1.compute.internal ansible_connection=local

[database]
ip-10-0-0-203.ap-northeast-1.compute.internal ansible_connection=local

[all:vars]
postgresql_admin_username=postgres
postgresql_admin_password=test1234

registry_username=hoge
registry_password=fuga

redis_mode=standalone

gateway_admin_password=test1234
gateway_pg_host=ip-10-0-0-203.ap-northeast-1.compute.internal
gateway_pg_password=test1234

controller_admin_password=test1234
controller_pg_host=ip-10-0-0-203.ap-northeast-1.compute.internal
controller_pg_password=test1234

controller_license_file=<license_file_path>
```

#### 設定したパラメータについて

- `[automationgateway] [automationcontroller] [database]`
ここではPlatform gateway, Automation Controller, Postgresqlをインストールするホストについて記述します。
インストール対象をFQDNで指定します。
この時、インストール対象がローカルホストである場合は接続オプションで`ansible_connection=local`としてあげることで、ローカルホストに対して無駄にSSHで接続することを避けられます。
　 
- `[all:vars]`
ここでは各種サービスの設定について記述します。
    - `redis_mode`
redisの構成を指定するオプション。
`inventory-growth`で最初から定義されているstandaloneのまま変更無し。
    - `postgresql_admin_username` `postgresql_admin_password`
postgresqlのadminユーザ名とパスワードを指定。
    - `registry_username` `registry_password`
Red Hatアカウントのユーザ名とパスワードを指定。
    - `*_admin_password`
    各コンポーネントのadminユーザのパスワードを指定します。
    - `*_pg_host` `*_pg_password`
    postgresqlのホスト名とパスワードを指定します。
    今回はRDBも同一ホスト内に立てているため自ホストのFQDNを指定しています。


今回HubとEDAはインストールしないため、サンプルに記述のあるHubとEDAの項目は消しています。
項目を消すと警告文が出ますがインストールに問題はありません。

また、インストールと同時にライセンス適用を行うため、`controller_license_file`を記述していますがこれは必須ではありません。指定しない場合、インストール後初回ログイン時にライセンス適用が求められます。
controller_license_fileではライセンスファイルのパスを相対パスではなく、絶対パスで指定する必要があるので注意してください。

今回は指定していない他のパラメータについてはREADMEを参照してください。

## インストール
AAPのインストールはAnsibleで行われます。以下のコマンドでインストール。
インベントリファイルは自身で編集したものを指定してください。
```
ansible-playbook -i inventory-growth ansible.containerized_installer.install
```

<details><summary>※ちなみに：アンインストールを行う場合は(クリックで展開)</summary>

最後の`install`を`uninstall`に変更して実行します。
```
ansible-playbook -i inventory-growth ansible.containerized_installer.uninstall
```

</details>

インストールするコンポーネントにもよりますが、上記のインベントリで実行した際は11分ほどかかりました。(HubとEDAも一緒に入れた時は20分近くかかった...)

インストール成功時のリザルト
```　
PLAY RECAP *********************************************************************************************************************************
ip-10-0-0-203.ap-northeast-1.compute.internal : ok=392  changed=134  unreachable=0    failed=0    skipped=120  rescued=0    ignored=0   
localhost                  : ok=16   changed=0    unreachable=0    failed=0    skipped=19   rescued=0    ignored=0   
```

一応どんなコンテナが作成されたのかも確認します。

```
$ podman ps
CONTAINER ID  IMAGE                                                                         COMMAND               CREATED         STATUS         PORTS       NAMES
a18a727152bf  registry.redhat.io/rhel8/postgresql-15:latest                                 run-postgresql        40 minutes ago  Up 40 minutes              postgresql
c7001c208799  registry.redhat.io/rhel8/redis-6:latest                                       run-redis             39 minutes ago  Up 39 minutes              redis-unix
32acd10fbf43  registry.redhat.io/rhel8/redis-6:latest                                       run-redis             39 minutes ago  Up 39 minutes              redis-tcp
8fb3f05574f6  registry.redhat.io/ansible-automation-platform-25/gateway-proxy-rhel8:latest  /usr/bin/envoy --...  39 minutes ago  Up 38 minutes              automation-gateway-proxy
0d4a7b49688c  registry.redhat.io/ansible-automation-platform-25/gateway-rhel8:latest        /usr/bin/supervis...  39 minutes ago  Up 37 minutes              automation-gateway
caf84f8fc784  registry.redhat.io/ansible-automation-platform-25/receptor-rhel8:latest       /usr/bin/receptor...  37 minutes ago  Up 37 minutes              receptor
6fcc1d101a0a  registry.redhat.io/ansible-automation-platform-25/controller-rhel8:latest     /usr/bin/launch_a...  37 minutes ago  Up 33 minutes              automation-controller-rsyslog
290c1ef99427  registry.redhat.io/ansible-automation-platform-25/controller-rhel8:latest     /usr/bin/launch_a...  36 minutes ago  Up 33 minutes              automation-controller-task
d43f6b6c1d1f  registry.redhat.io/ansible-automation-platform-25/controller-rhel8:latest     /usr/bin/launch_a...  36 minutes ago  Up 33 minutes              automation-controller-web
```
コンテナとしてまとまっているためAAPを構成する要素としてどんなものがあるか分かりやすいですね。(理解できたとは言ってない)

各コンテナの役割については名前から何となく予想できますが、細かい説明ができるほど理解が進んでないので宿題とさせてください。

　
インストールが成功するとブラウザからアクセスが可能になります。※httpsでアクセスすること
ユーザ名はadmin、パスワードはgateway_admin_passwordで指定したやつ。
![login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902042/c792831c-0b60-3e1f-bdc6-3e5af665ef4d.jpeg)



インストール時にライセンスを適用していない場合は、初回アクセス時に適用を促されます。

ログインすると ~~いつもの…(？)~~ ダッシュボードにアクセスできます。
![dashboard.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902042/07168c42-d4cb-7e1a-bc2e-44196d6594b7.jpeg)
ちなみにAutomation HubやEDAもインストールした場合、左側のメニューに項目が追加されます。
![dashbord_full_tli.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902042/0211096d-8f44-004b-d65a-3b9028cdaffb.jpeg)



## 動作テスト

動作テストとしてAAPインストール時に自動的に作成されるジョブテンプレートを実行してみます。

Automation Execution → テンプレート → Demo Job Template → 起動

テンプレートを起動を押下
![result_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902042/fe479a59-dab9-4064-2cc3-34cb5cde37dd.jpeg)



成功！


## 詰まった点
私がAAP2.5をインストールする際に苦労した点を残します。
- インベントリファイルのパラメータについて
サンプルの`inventory`ファイルには`[execution_nodes]`や`[redis]`の項目が有り、これらに何を入れればいいのか、これは必須なのか分からず少し時間を食いました。
READMEを読めばどれが必須なのかは記載があったので、最初にドキュメントを読む癖を付ける必要性を改めて感じました...
　

- VPCにおけるDNSの設定について
インストール前の説明でVPCのDNS設定について注意と書いた点です。
これはAAPのインストールパラメータで使用するFQDNとして、EC2に自動的に割り振られるプライベートDNSのFQDNを記述した場合に限る話です。

    VPCの「DNSホスト名」を有効にしていない場合、AAPインストール時にコンテナ間で通信を行うタスク*で名前解決が行えずエラーになってしまいます。
そのため、FQDNの名前解決を可能にするために「DNSホスト名」の設定を有効にしておく必要がありました。
*具体的にはautomation-gatewayとautomation-gateway-proxyが通信を試行するタスク：TASK [ansible.containerized_installer.automationgateway : Ensure automation gateway is ready]

    DNSホスト名の説明は、マネジメントコンソール上だと以下のように書かれており、パブリックIPアドレスにだけ関するもののように記載があります。
![vpc_dns.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902042/37d09fee-469f-bfd7-3c92-3d20716718a3.jpeg)

    一方、ドキュメントには
    >属性の両方が true に設定されている場合、次のようになります。
    > - パブリック IP アドレスを持つインスタンスは、対応するパブリック DNS ホスト名を受け取ります。
    > - Amazon Route 53 Resolver サーバーは、Amazon が提供するプライベート DNS ホスト名を解決できます。

    とちゃんとプライベートDNSホスト名についても言及がありました。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/AmazonDNS-concepts.html





## おわりに

今回はAAP2.5をインストールしてみました。


AAPをインストールしたことがなかったのでインベントリファイルで何を指定したらいいのかであったり、そもそもAAPってController以外に何があるのか分かっていない部分があり苦労しました。

次があればAAPを構成する要素がどう仕事をしているのか宿題にしたことを調べたいと思います。

## 参考ブログ

https://zaki-hmkc.hatenablog.com/entry/2024/06/09/172737

https://tekunabe.hatenablog.jp/entry/2024/09/24/ansible_aap24_containerized_aap

https://qiita.com/Shmwa2/items/bd53ca1b504e8b8f04af