AWX on ARM64(Raspberry Pi)

# はじめに
GithubのAWXリポジトリを見ていて、こんなプルリクエストがあることに気付きました。
[ARM image build support #7607](https://github.com/ansible/awx/pull/7607)
手元にRaspberry Pi 4B(4GB版）があるので、この上でAWXを動かしてみます。

# 環境
イメージビルドをRaspberry Piでやると時間がかかりそうだったので、AWSのA1インスタンスを利用しました。

ビルド環境：Ubuntu Server 20.04 LTS (AWS EC2 a1.xlarge)
実行環境：Ubuntu Server 20.04 LTS (Raspberry Pi 4B 4GB)+  k3s v1.18.6+k3s1

#イメージビルド
###必要なパッケージのインストール

```bash
$ sudo apt update
$ sudo apt install -y docker.io python3-docker ansible make npm
```

###Dockerサービス起動

```bash
$ sudo systemctl start docker.service
$ sudo systemctl status docker.service
```

###dockerグループにユーザー追加

```bash
$ sudo gpasswd -a $USER docker
```

グループへの追加が完了したら一度ログアウトし、再度ログインし直しましょう。


###Githubからclone
13.0.0をベースに、ARMビルド用のコミットだけをCherry pickで反映していきます。

```bash
$ git clone https://github.com/agaffney/awx.git
$ cd ~/awx/
$ git checkout refs/tags/13.0.0
$ git cherry-pick 0b841e6
```

このままだとビルドに失敗してしまうのでちょっと修正。
npmの依存関係周りがエラーになるようなので、npm installを実行して解消させます。

```
$ cd ~/awx/awx/ui/
$ npm install
```

###ビルド準備
inventoryファイルにDockerリポジトリの情報を書いておくと、ビルド完了後にPushまでやってくれます。
今回はGitlabのリポジトリにアップロードしました。

```bash
$ cd ~/awx/installer/
$ vi inventory
```
以下を追記しておきます。

```
docker_registry=registry.gitlab.com
docker_registry_repository=ussvgr/awx-arm64
docker_registry_username=ussvgr
```
ビルド用のPlaybookも一点修正しておきます。
gather_factsをtrueへ変更。

```bash
$ vi build.yml
```
```diff
 ---
 - name: Build AWX Docker Images
   hosts: all
-  gather_facts: false
+  gather_facts: true
   roles:
     - {role: image_build}
     - {role: image_push, when: "docker_registry is defined"}
```

###Dockerイメージビルド
ビルド時にDockerレジストリのパスワード（今回はGitlab）をオプションで与えて実行します。

```bash
$ ansible-playbook -i inventory -e docker_registry_password=<Gitlabのパスワード> build.yml 
```

a1.xlargeで大体40〜50分程度かかりました。

#Raspberry Piへインストール
Kubernetes(k3s)環境が整っている状態から始めます。

###Githubからclone
ビルド環境と同様にCherry pickしていきます。

```bash
$ git clone https://github.com/agaffney/awx.git
$ cd ~/awx/
$ git checkout refs/tags/13.0.0
$ git cherry-pick 0b841e6
```

###Inventoryファイルのカスタマイズ
Kubernetes環境にインストールするための設定を記載していきます。
tower_package_name に前項でビルドしたイメージのリポジトリを記載します。
また、メモリ4GBのRaspberry Piではデフォルトの要求スペックで起動することができないため、Inventoryファイルにてスペックを切り詰めていきます。

```diff
@@ -18,8 +18,8 @@ dockerhub_base=ansible
 # openshift_pg_emptydir=True
 
 # Kubernetes Install
-# kubernetes_context=test-cluster
-# kubernetes_namespace=awx
+kubernetes_context=default
+kubernetes_namespace=awx
 # Optional Kubernetes Variables
 # pg_image_registry=docker.io
 # pg_serviceaccount=awx
@@ -27,6 +27,9 @@ dockerhub_base=ansible
 # pg_persistence_storageClass=StorageClassName
 # pg_cpu_limit=1000
 # pg_mem_limit=2
+pg_persistence_storageClass=local-path
+pg_cpu_limit=500
+pg_mem_limit=0.5
 
 # Kubernetes Ingress Configuration
 # You can use the variables below to configure Kubernetes Ingress
@@ -56,6 +59,19 @@ dockerhub_base=ansible
 # redis_mem_limit=3
 # management_cpu_limit=2000
 # management_mem_limit=2
+task_cpu_request=500
+task_mem_request=1
+task_cpu_limit=1000
+task_mem_limit=1.5
+web_cpu_request=200
+web_mem_request=0.5
+web_cpu_limit=1000
+web_mem_limit=1
+redis_cpu_request=200
+redis_mem_request=0.5
+redis_cpu_limit=500
+redis_mem_limit=0.5
 
 # Common Docker parameters
 awx_task_hostname=awx
@@ -76,7 +92,7 @@ docker_compose_dir="~/.awx/awxcompose"
 # docker_registry=172.30.1.1:5000
 # docker_registry_repository=awx
 # docker_registry_username=developer
+tower_package_name=registry.gitlab.com/ussvgr/awx-arm64/awx
 
 # Set pg_hostname if you have an external postgres server, otherwise
 # a new postgres service will be created
```
###（オプション）コンテナイメージの事前ダウンロード
ウチの環境だけかもしれませんが、コンテナイメージの展開に時間が掛かりすぎて、デプロイ用Playbookの実行がタイムアウトエラーとなってしまいました。
以下コマンドで事前にダウンロードしておくとスムーズかもしれません。

```bash
＄ sudo k3s ctr images pull registry.gitlab.com/ussvgr/awx-arm64/awx:13.0.0
```

###デプロイ
以下のコマンドを実行し暫く待ち、エラーが出てなければOKです。

```bash
＄ ansible-playbook -i inventory install.yml
```

###確認

ポート番号を確認し、

```bash
$ kubectl get svc -n awx
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
awx-postgresql-headless   ClusterIP   None            <none>        5432/TCP       26m
awx-postgresql            ClusterIP   10.43.109.78    <none>        5432/TCP       26m
awx-web-svc               NodePort    10.43.165.240   <none>        80:32686/TCP   25m
```

ブラウザでhttp://\[Raspberry PiのIPアドレス]：[ポート番号(上記例だと32686)]にアクセスすると、
![スクリーンショット 2020-07-24 15.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/2660d7ac-ac5a-afe3-61d4-5e6c497c79e7.png)
アングリーポテトがお出迎えしてくれます。

#おわりに
Raspberry Pi １台だけだとリソース的に心許ないですが、何とか動くには動きそうです。
小規模な実験環境などには使えるのではないでしょうか。

ビルド済みのDockerイメージは[こちら](https://gitlab.com/ussvgr/awx-arm64/container_registry/)で公開していますので、試してみたい方は上記の「Raspberry piへインストール」の項から進めてみてください。