AWX を AWX Operator で macOS にインストールする

AWX 19.4.0 を macOS Big Sur 11.6 にインストールした手順の記録。

## 環境
* macOS Big Sur 11.6
* Docker Desktop 4.1.0
* Docker Engine 20.10.8
* minikube 1.23.2
* AWX Operator 0.14.0
* AWX 19.4.0

[INSTALL.md](https://github.com/ansible/awx/blob/19.4.0/INSTALL.md) によれば、AWX 18.0 以降は [AWX Operator](https://github.com/ansible/awx-operator) を使ったインストールが推奨される。 [^install] [^install_docker]

[^install]: <q cite="https://github.com/ansible/awx/blob/19.4.0/INSTALL.md">Starting in version 18.0, the AWX Operator is the preferred way to install AWX.</q> <cite>[awx/INSTALL.md at 19.4.0 · ansible/awx](https://github.com/ansible/awx/blob/19.4.0/INSTALL.md)</cite>

[^install_docker]: <q cite="https://github.com/ansible/awx/blob/19.4.0/INSTALL.md">AWX can also alternatively be installed and run in Docker, but this install path is only recommended for development/test-oriented deployments, and has no official published release.</q> <cite>[awx/INSTALL.md at 19.4.0 · ansible/awx](https://github.com/ansible/awx/blob/19.4.0/INSTALL.md)</cite>

## 準備

### Docker Desktop のインストール
```bash
brew install --cask docker
```

Docker の使用メモリがデフォルトで 2GB (2.5GB?) なので 4.25GB に増やす。
Docker > Settings > Resources > ADVANCED > Memory > 4.25GB > Apply & Restart



### Minikube のインストール
```bash
brew install minikube
```
[INSTALL.md](https://github.com/ansible/awx/blob/19.4.0/INSTALL.md) では [Minikube](https://kubernetes.io/ja/docs/setup/learning-environment/minikube/) を使ってインストールしているので踏襲。

## AWX のインストール

### Kubernates クラスタの起動
```bash
minikube start --cpus=2 --memory=4g --addons=ingress
```
<details><div>

```
😄  Darwin 11.6 上の minikube v1.23.2
✨  dockerドライバーが自動的に選択されました。他の選択肢:  vmware, virtualbox, ssh
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🚜  イメージを Pull しています...
💾  Kubernetes v1.22.2 のダウンロードの準備をしています
    > gcr.io/k8s-minikube/kicbase: 355.40 MiB / 355.40 MiB  100.00% 1.77 MiB p/
    > preloaded-images-k8s-v13-v1...: 511.84 MiB / 511.84 MiB  100.00% 2.31 MiB
🔥  docker container (CPUs=4, Memory=6144MB) を作成しています...
🐳  Docker 20.10.8 で Kubernetes v1.22.2 を準備しています...
    ▪ 証明書と鍵を作成しています...
    ▪ Control Plane を起動しています...
    ▪ RBAC のルールを設定中です...
🔎  Kubernetes コンポーネントを検証しています...
💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
    ▪ イメージ gcr.io/k8s-minikube/storage-provisioner:v5 を使用しています
    ▪ イメージ k8s.gcr.io/ingress-nginx/controller:v1.0.0-beta.3 を使用しています
    ▪ イメージ k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0 を使用しています
    ▪ イメージ k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0 を使用しています
🔎  ingress アドオンを検証中です...
🌟  有効なアドオン: storage-provisioner, default-storageclass, ingress
🏄  完了しました！ kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました
```
</div></details>

[INSTALL.md](https://github.com/ansible/awx/blob/19.4.0/INSTALL.md) では 4CPU 6GB を指定しているが、Ansible Tower の Requirements によれば 2CPU 4GB が下限。 [^cpu] [^memory]

[^cpu]: <q cite="https://docs.ansible.com/ansible-tower/latest/html/installandreference/requirements_refguide.html">**2 CPUs minimum** for Automation Platform installations.</q> <cite>[5. Requirements — Ansible Tower Installation and Reference Guide v3.8.4](https://docs.ansible.com/ansible-tower/latest/html/installandreference/requirements_refguide.html)</cite>

[^memory]: <q cite="https://docs.ansible.com/ansible-tower/latest/html/installandreference/requirements_refguide.html">**4 GB RAM minimum** for Automation Platform installations</q> <cite>[5. Requirements — Ansible Tower Installation and Reference Guide v3.8.4](https://docs.ansible.com/ansible-tower/latest/html/installandreference/requirements_refguide.html)</cite>

### ノードの確認
```bash
minikube kubectl -- get nodes
```
<details><div>

```
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubectl: 50.63 MiB / 50.63 MiB [---------------] 100.00% 3.20 MiB p/s 16s
```
```
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   16m   v1.22.2
```
</div></details>

### kube-apiserver 通信の確認
```bash
minikube kubectl -- get pods -A
```
<details><div>

```
NAMESPACE       NAME                                        READY   STATUS      RESTARTS      AGE
ingress-nginx   ingress-nginx-admission-create--1-j8vd6     0/1     Completed   0             17m
ingress-nginx   ingress-nginx-admission-patch--1-tz4bn      0/1     Completed   1             17m
ingress-nginx   ingress-nginx-controller-69bdbc4d57-b8qsz   1/1     Running     0             17m
kube-system     coredns-78fcd69978-5qzg2                    1/1     Running     0             17m
kube-system     etcd-minikube                               1/1     Running     0             17m
kube-system     kube-apiserver-minikube                     1/1     Running     0             17m
kube-system     kube-controller-manager-minikube            1/1     Running     0             17m
kube-system     kube-proxy-7kb98                            1/1     Running     0             17m
kube-system     kube-scheduler-minikube                     1/1     Running     0             17m
kube-system     storage-provisioner                         1/1     Running     1 (17m ago)   17m
```
</div></details>

### AWX Operator リポジトリのクローン
```bash
git clone https://github.com/ansible/awx-operator.git
```
<details><div>

```
Cloning into 'awx-operator'...
remote: Enumerating objects: 5651, done.
remote: Counting objects: 100% (2749/2749), done.
remote: Compressing objects: 100% (986/986), done.
remote: Total 5651 (delta 1856), reused 2389 (delta 1664), pack-reused 2902
Receiving objects: 100% (5651/5651), 1.39 MiB | 2.87 MiB/s, done.
Resolving deltas: 100% (3212/3212), done.
```
</div></details>

### チェックアウト
```bash
cd awx-operator
git checkout 0.14.0
```
<details><div>

```
Note: switching to '0.14.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 9e9457c Fix release workflow
```
</div></details>

### デプロイ
```bash
export NAMESPACE=awx
make deploy
```
<details><div>

```
cd config/manager && /Users/bezeklik/Workspace/awx-operator/bin/kustomize edit set image controller=quay.io/ansible/awx-operator:0.14.0
cd config/default && /Users/bezeklik/Workspace/awx-operator/bin/kustomize edit set namespace awx
/Users/bezeklik/Workspace/awx-operator/bin/kustomize build config/default | kubectl apply -f -
namespace/awx created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
serviceaccount/awx-operator-controller-manager created
role.rbac.authorization.k8s.io/awx-operator-leader-election-role created
role.rbac.authorization.k8s.io/awx-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created
```
</div></details>

### 確認
```bash
alias kubectl="minikube kubectl --"
kubectl get pods -n $NAMESPACE
```
<details><div>

```
NAME                                              READY   STATUS              RESTARTS   AGE
awx-operator-controller-manager-6f68ddbf4-s7ztr   2/2     Running             0          79s
```
</div></details>

STATUS が ImagePullBackOff となって先に進まない場合は 0.14.0 などバージョンを指定する。

### 設定
```bash
kubectl config set-context --current --namespace=$NAMESPACE
```
<details><div>

```
Context "minikube" modified.
```
</div></details>

### 設定
```bash
kubectl apply -f awx-demo.yml
```
<details><div>

```
awx.awx.ansible.com/awx-demo created
```
</div></details>

### ログの確認
```bash
kubectl logs -f deployments/awx-operator-controller-manager -c manager
```

### 確認
```bash
kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
```
<details><div>

```
NAME                    READY   STATUS    RESTARTS   AGE
awx-demo-d46576-9wdzq   4/4     Running   0          7m2s
awx-demo-postgres-0     1/1     Running   0          7m10s
```
</div></details>

### 確認
```bash
kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
```
<details><div>

```
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
awx-demo-postgres   ClusterIP   None           <none>        5432/TCP       7m24s
awx-demo-service    NodePort    10.98.118.93   <none>        80:32080/TCP   7m18s
```
</div></details>

## 

### サービスの起動
```bash
minikube service awx-demo-service --url -n $NAMESPACE
```
<details><div>

```
🏃  Starting tunnel for service awx-demo-service.
|-----------|------------------|-------------|------------------------|
| NAMESPACE |       NAME       | TARGET PORT |          URL           |
|-----------|------------------|-------------|------------------------|
| awx       | awx-demo-service |             | http://127.0.0.1:61197 |
|-----------|------------------|-------------|------------------------|
http://127.0.0.1:61197
❗  Dockerドライバーをdarwin上で動かしているため、実行するにはターミナルを開く必要があります。
```
</div></details>

### admin パスワードの確認
```bash
kubectl get secret awx-demo-admin-password -o jsonpath="{.data.password}" | base64 --decode
```
<details><div>

```
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
```
</div></details>


## アンインストール
### AWX インスタンスの削除
```bash
kubectl delete awx awx-demo
```
```
awx.awx.ansible.com "awx-demo" deleted
```
### クラスタの削除
```bash
minikube delete
```
```
🔥  docker の「minikube」を削除しています...
🔥  コンテナ "minikube" を削除しています...
🔥  /Users/bezeklik/.minikube/machines/minikube を削除しています...
💀  クラスタ "minikube" の全てのトレースを削除しました。
```