AWX on ARM64(Raspberry Pi)


はじめに

GithubのAWXリポジトリを見ていて、こんなプルリクエストがあることに気付きました。
ARM image build support #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

イメージビルド

必要なパッケージのインストール

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

Dockerサービス起動

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

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

$ sudo gpasswd -a $USER docker

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

Githubからclone

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

$ 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のリポジトリにアップロードしました。

$ cd ~/awx/installer/
$ vi inventory

以下を追記しておきます。

docker_registry=registry.gitlab.com
docker_registry_repository=ussvgr/awx-arm64
docker_registry_username=ussvgr

ビルド用のPlaybookも一点修正しておきます。
gather_factsをtrueへ変更。

$ vi build.yml
 ---
 - 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)をオプションで与えて実行します。

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

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

Raspberry Piへインストール

Kubernetes(k3s)環境が整っている状態から始めます。

Githubからclone

ビルド環境と同様にCherry pickしていきます。

$ 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ファイルにてスペックを切り詰めていきます。

@@ -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の実行がタイムアウトエラーとなってしまいました。
以下コマンドで事前にダウンロードしておくとスムーズかもしれません。

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

デプロイ

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

$ ansible-playbook -i inventory install.yml

確認

ポート番号を確認し、

$ 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)]にアクセスすると、

アングリーポテトがお出迎えしてくれます。

おわりに

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

ビルド済みのDockerイメージはこちらで公開していますので、試してみたい方は上記の「Raspberry piへインストール」の項から進めてみてください。