Ansible AWXをAWXオペレーターを使用して、minikube上に構成  (Fedora+minikube+(Virtualbox or Docker))

以下のガイドに従い、minikube上にAWXの構成を試みた。
いくつか引っかかった箇所やバグがあったため、備忘として残す。

#### 2021/07/01更新

- 起動できなくなっていたのはfedora, minikubeをバージョンアップしたことで解消
- 手順も更新されていたので反映



# 実施した手順

- Installing AWX
    - https://github.com/ansible/awx/blob/devel/INSTALL.md#installing-awx
    - https://translate.google.com/translate?sl=en&tl=ja&u=https://github.com/ansible/awx/blob/devel/INSTALL.md%23installing-awx




およびバグ対応(2021/03/19現在) => 04/08付でこのissueはclose 

- Ansible AWX - Fresh Install - No administrator password created.
    - https://github.com/ansible/awx/issues/9728


#### 2021/07/01更新時

- https://github.com/ansible/awx-operator#basic-install


## 環境

- ThinkPad: L540
- memory: 16GB
- OS: fedora 32 (最新のfefora 33 は virtalbox が未対応であったため)
- minikube: 1.18.1
- virtualbox: 6.1.18 もしくは docker: 20.10.5 (何れかを minikube のドライバーとして使用)


#### 2021/07/01更新時
- Fedora 34 (Workstation Edition)
- minikube v1.21.0
- Docker 20.10.7

#### minikubeのバージョンアップ

https://minikube.sigs.k8s.io/docs/start/

```
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
$ sudo rpm -Uvh minikube-latest.x86_64.rpm
```



## ThinkPadのBIOS設定

virtalboxを動作させるには、BIOS画面にてセキュアブートを無効化する必要があった。
(実施時にはfedora, virtalbox導入後に変更している。)

参考

- セキュアブートが有効になっているときの Linux オペレーティングシステムの制限
    - https://support.lenovo.com/sk/ja/solutions/ht103400
- ThinkPad X1 Carbon 2017のFedora27にVirtualBoxをインストールしようとしてハマった
    - https://aoishi.hateblo.jp/entry/2018/03/21/125814

# OSの選択と導入

導入の容易さからfedora workstation を選択。
fedora 33でなく32を選択したのは、 virtualboxの対象がfedora 32までであったため。

windows上にFedora Media Writerを導入し、ここから一旦8GBのUSBメモリーに導入用のfedoraを導入。この際にfedoraのバージョンとして、デフォルトでは33だが、32を選択可能であった。
そのUSBメモリーからPCを起動し、最終的なUSB接続のSSDにfedoraを導入。
これで、起動時に選択メニューから起動OSを選択可能となるし、USB SSDを外せば綺麗な素のwindowsとして起動できる。

https://getfedora.org/ja/workstation/download/

# 追加設定

ここでは、selinuxとfirewallを無効化して試している。


# 追加モジュール

virtualbox: 6.1.18  (centos向けのrpmを選択)

VBoxManage --versionにて、以下のメッセージが表示されたので、追加でkernel-develを導入。
(先にBIOS設定変更を行い、後からfedoraを導入していれば、追加導入は不要であった可能性あり。)

```

[hiro@localhost vagrant]$ VBoxManage --version
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (5.10.22-100.fc32.x86_64) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/vboxconfig

         You will not be able to start VMs until this problem is fixed.
6.1.14r140239

[hiro@localhost vagrant]$ sudo /sbin/vboxconfig
[sudo] hiro のパスワード:
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-5.10.22-100.fc32.x86_64
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-5.10.22-100.fc32.x86_64

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.  If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.

```

```
[hiro@localhost vagrant]$ sudo dnf install kernel-devel
依存関係が解決しました。
=========================================================================================================================================================================
 パッケージ                                アーキテクチャー                    バージョン                                     リポジトリー                         サイズ
=========================================================================================================================================================================
インストール:
 kernel-devel                              x86_64                              5.10.22-100.fc32                               updates                               14 M

トランザクションの概要
=========================================================================================================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 14 M
インストール後のサイズ: 53 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
kernel-devel-5.10.22-100.fc32.x86_64.rpm                                                                                                 1.5 MB/s |  14 MB     00:09
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
...
```

もしくはdocker CEを導入

# minikubeの導入、AWXの起動

```

[hiro@localhost minikube]$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13.6M  100 13.6M    0     0  1946k      0  0:00:07  0:00:07 --:--:-- 2965k

[hiro@localhost minikube]$ sudo rpm -ivh minikube-latest.x86_64.rpm
[sudo] hiro のパスワード:
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:minikube-1.18.1-0                ################################# [100%]

```

# virtualbox編

```
[hiro@localhost minikube]$ minikube start --cpus=4 --memory=8g --addons=ingress
😄  Fedora 32 上の minikube v1.18.1
✨  virtualboxドライバーが自動的に選択されました
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🔥  virtualbox VM (CPUs=4, Memory=8192MB, Disk=20000MB) を作成しています...
🐳  Docker 20.10.3 で Kubernetes v1.20.2 を準備しています...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ Using image us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.40.2
    ▪ Using image jettech/kube-webhook-certgen:v1.2.2
    ▪ Using image jettech/kube-webhook-certgen:v1.3.0
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v4
🔎  Verifying ingress addon...
🌟  有効なアドオン: storage-provisioner, default-storageclass, ingress
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
```

明示的にvirtualboxを指定するには

```
minikube start --driver=virtualbox --cpus=4 --memory=8g --addons=ingress
```

とする

```
[hiro@localhost minikube]$ minikube kubectl -- apply -f https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubectl: 38.37 MiB / 38.37 MiB [---------------] 100.00% 10.88 MiB p/s 4s
clusterrole.rbac.authorization.k8s.io/awx-operator created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator created
serviceaccount/awx-operator created
deployment.apps/awx-operator created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
```

ここで、minikube kubectlにて、-fなどハイフン付きのオプションを正しくハンドリングさせるには、それより前に、--を付けて展開を抑止する必要がある。

- discussion: minikube kubectl #4684
    - https://github.com/kubernetes/minikube/issues/4684



```
[hiro@localhost minikube]$ minikube kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
awx-operator-7c78bfbfd-ngj4c   1/1     Running   0          58s
```


```

[hiro@localhost minikube]$ cat <<EOC > myawx.yml
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
spec:
  tower_ingress_type: Ingress
EOC
```

```

[hiro@localhost minikube]$ minikube kubectl apply -- -f myawx.yml
awx.awx.ansible.com/awx created
```


```

[hiro@localhost minikube]$ minikube kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
awx-5ffbfd489c-hrrwn           3/3     Running   0          3m31s
awx-operator-7c78bfbfd-ngj4c   1/1     Running   0          12m
awx-postgres-0                 1/1     Running   0          3m37s
```
2021/04/11時点ではREADYが3/3ではなく4/4となっていた。


本来はここで、管理パスワードを表示できるはずだったのだが、この記事の時点ではバグがあり、表示されない。(2021/03/19現在)
__=> 2021/04/08付でissueはcloseしていてパスワードが表示される__

```
[hiro@localhost minikube]$ minikube kubectl -- get secret awx-admin-password -o jsonpath='{.data.password}' | base64 --decode
Error from server (NotFound): secrets "awx-admin-password" not found
```

原因および暫定対応は以下の通り。

- Ansible AWX - Fresh Install - No administrator password created.
    - https://github.com/ansible/awx/issues/9728

コンテナにログインし、awx-manage createsuperuserコマンドによりユーザーとパスワードを設定する。
ここで、上にも述べた通り、-itなどを引数として渡すため、それより前に--を付与している。


```

[hiro@localhost minikube]$ minikube kubectl exec -- -it awx-5ffbfd489c-hrrwn -c awx-web bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bash-4.4$ 
bash-4.4$ awx-manage createsuperuser
Username (leave blank to use 'awx'): 
Email address: 
Password: 
Password (again): 
Superuser created successfully.
bash-4.4$ 
bash-4.4$ exit
command terminated with exit code 130
[hiro@localhost minikube]$ 
```

メッセージから
minikube kubectl exec -- -it awx-5ffbfd489c-hrrwn -c awx-web -- bin/bash
の方が良い

ここでは、UsernameはブランクのままEnterとし、awxとしている。
Email addressは特に指定していない。
Password, Password(again)は表示されていないが、同じ適当なパスワードを入力している。


```
[hiro@localhost minikube]$ minikube service awx-service --url
http://192.168.99.100:32036
```

その後、上の出力 (この例では http://192.168.99.100:32036 ) にブラウザーで接続し、上で指定したユーザー名とパスワードを入力することでAWXコンソールにログインできることを確認している。

# docker編

## virtualboxを使用した環境を破棄


```
[hiro@localhost minikube]$ minikube delete 
🔥  virtualbox の「minikube」を削除しています...
💀  クラスタ "minikube" の全てのトレースを削除しました。
```


## dockerを起動、有効化
```
[hiro@localhost minikube]$ sudo systemctl start docker

[hiro@localhost minikube]$ sudo systemctl enable docker
```

## ユーザーをdocker groupに追加
```
[hiro@localhost minikube]$ minikube start --driver=docker
😄  Fedora 32 上の minikube v1.18.1
✨  設定を元に、 docker ドライバを使用します

💣  Exiting due to PROVIDER_DOCKER_NEWGRP: "docker version --format -" exit status 1: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version: dial unix /var/run/docker.sock: connect: permission denied
💡  提案: Add your user to the 'docker' group: 'sudo usermod -aG docker $USER && newgrp docker'
📘  ドキュメント: https://docs.docker.com/engine/install/linux-postinstall/

[hiro@localhost minikube]$ sudo usermod -aG docker $USER && newgrp docker
```
## dockerを使って再作成

```
[hiro@localhost minikube]$ minikube start --driver=docker --cpus=4 --memory=8g --addons=ingress
😄  Fedora 32 上の minikube v1.18.1
✨  設定を元に、 docker ドライバを使用します
❗  Your cgroup does not allow setting memory.
    ▪ More information: https://docs.doInfo.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🔥  docker container (CPUs=4, Memory=8192MB) を作成しています...
🐳  Docker 20.10.3 で Kubernetes v1.20.2 を準備しています...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ Using image us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.40.2
    ▪ Using image jettech/kube-webhook-certgen:v1.2.2
    ▪ Using image jettech/kube-webhook-certgen:v1.3.0
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v4
🔎  Verifying ingress addon...
🌟  有効なアドオン: storage-provisioner, default-storageclass, ingress
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
```

デフォルトのdriverをdockerとするには minikube config set driver docker とする。
https://minikube.sigs.k8s.io/docs/drivers/docker/


#### 2021/07/01更新

```
$ minikube start --addons=ingress --cpus=4 --cni=flannel --install-addons=true
😄  Fedora 34 上の minikube v1.21.0
✨  dockerドライバーが自動的に選択されました。他の選択肢:  podman, virtualbox, ssh, none
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🚜  イメージを Pull しています...
💾  Kubernetes v1.20.7 のダウンロードの準備をしています
    > preloaded-images-k8s-v11-v1...: 492.20 MiB / 492.20 MiB  100.00% 6.29 MiB
    > gcr.io/k8s-minikube/kicbase...: 359.09 MiB / 359.09 MiB  100.00% 4.53 MiB
🔥  docker container (CPUs=4, Memory=12288MB) を作成しています...
🐳  Docker 20.10.7 で Kubernetes v1.20.7 を準備しています...
    ▪ 証明書と鍵を作成しています...
    ▪ Control Plane を起動しています...
    ▪ RBAC のルールを設定中です...
🔗  Configuring Flannel (Container Networking Interface) ...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ イメージ k8s.gcr.io/ingress-nginx/controller:v0.44.0 を使用しています
    ▪ イメージ gcr.io/k8s-minikube/storage-provisioner:v5 を使用しています
    ▪ イメージ docker.io/jettech/kube-webhook-certgen:v1.5.1 を使用しています
    ▪ イメージ docker.io/jettech/kube-webhook-certgen:v1.5.1 を使用しています
🔎  ingress アドオンを検証中です...
🌟  有効なアドオン: default-storageclass, storage-provisioner, ingress
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  完了しました！ kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました

$ sudo dnf install -y kubernetes-client
...

$ rpm -q kubernetes-client
kubernetes-client-1.20.5-1.fc34.x86_64
```


以下virtualboxケースと同様

```
[hiro@localhost minikube]$ minikube kubectl -- apply -f https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml
clusterrole.rbac.authorization.k8s.io/awx-operator created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator created
serviceaccount/awx-operator created
deployment.apps/awx-operator created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
```

この
https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml
は、その後、
https://github.com/ansible/awx/blob/devel/INSTALL.md#installing-awx に対する4/22のcommit edaec8dfbb6f80fc524fc75ca42720304b1f6a4fにおいて
https://raw.githubusercontent.com/ansible/awx-operator/<*tag*>/deploy/awx-operator.yaml
とされた。<*tag*>は、
https://github.com/ansible/awx-operator/tags
から選択可能。この文章を記載した時点では0.6.0, 0.7.0, 0.8.0からの選択。


#### 2021/07/01更新
記載時点での最新の 0.12.0 を指定

```
$ kubectl apply -f https://raw.githubusercontent.com/ansible/awx-operator/0.12.0/deploy/awx-operator.yaml
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
clusterrole.rbac.authorization.k8s.io/awx-operator created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator created
serviceaccount/awx-operator created
deployment.apps/awx-operator created

```



```
[hiro@localhost minikube]$ minikube kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
awx-operator-7c78bfbfd-l85cj   1/1     Running   0          77s
```

```
[hiro@localhost minikube]$ minikube kubectl apply -- -f myawx.yml
awx.awx.ansible.com/awx created
```

#### 2021/07/01更新
```
$ cat awx-demo.yml 
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: nodeport
  ingress_type: none
  hostname: awx-demo.example.com

$ kubectl apply -f awx-demo.yml
awx.awx.ansible.com/awx-demo created

```
metadataにおけるname:の値(awx-demo)は、後のadminユーザーのパスワード表示時に使用する。
なお、前回使用したmyawx.ymlではawxだったので、以降の出力におけるawx-で始まる名前が、awx-demo-で始まる樣に変更された。



```
[hiro@localhost minikube]$ minikube kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
awx-5ffbfd489c-h9xdc           3/3     Running   0          2m23s
awx-operator-7c78bfbfd-l85cj   1/1     Running   0          5m15s
awx-postgres-0                 1/1     Running   0          2m28s
```
#### 2021/07/01更新
```
[hiroyukionodera@fedora awx3]$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME                       READY   STATUS    RESTARTS   AGE
awx-demo-9975db9b6-kctzk   4/4     Running   0          2m45s
awx-demo-postgres-0        1/1     Running   0          2m55s
```

#### パスワードが設定されなかった障害対応手順
→その後不要になっている

```
[hiro@localhost minikube]$ minikube kubectl exec -- -it awx-5ffbfd489c-h9xdc -c awx-web bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bash-4.4$ 
bash-4.4$ awx-manage createsuperuser
Username (leave blank to use 'awx'): 
Email address: 
Password: 
Password (again): 
Superuser created successfully.
bash-4.4$ 
bash-4.4$ exit
exit
```


#### 2021/07/01更新
パスワードの表示

```
$ echo $(minikube kubectl -- get secret awx-demo-admin-password -o jsonpath='{.data.password}' | base64 --decode)
aJ337IfFEwD1MWluHnxfoNMsQDsRNCdt
```
echo $()にしているのは、単にパスワード表示後に改行をいれたかった為。
awx-demo-admin-passwordは、\<kubectl applyに使用したYAMLファイルのmetadataにおけるname:の値>-admin-password


```
[hiro@localhost minikube]$ minikube service awx-service --url
http://192.168.49.2:31180
``` 

http://192.168.49.2:31180 にてAWXコンソールへの接続を確認

2021/04/11時点では以下の表示となり先にすすまない。CPUは高めで動いているので調査中。
AWX is currently upgrading.
This page will refresh when complete.

$ minikube kubectl logs -- -f awx-operator-xxxxxxxx-xxxxx
にてログを出力可能


#### 2021/07/01更新
fedora, minikubeのバージョンアップの結果か、再び正常に稼動し、接続できている。