はじめに
構成管理ツールAnsibleの存在を知って家庭内サーバーも管理してみようかと思いました。
しかしコマンドで行うのなら台数がさほど多くないのもあって、面倒さは個別にやるのと大して変わらないかなと思ったので、どうせならとWebUIであるAWXを導入してみることにしました。
前提バージョン
- Debian GNU/Linux:11.3
- K3s:1.22+k3s1
- AWX Operator:0.20.0
- AWX:20.1.0
仮想マシン
Proxmox VEで下記スペックのKVMの仮想マシンを作成して構築しました。
- CPU:4コア(タイプ:Host)
- メモリー:8GB
- ディスク:32GB
CPUタイプはデフォルトのkvm64
だとAWXのデプロイが失敗します。
インストール
Debian
ここではDebian 11.3をネットインストールISOからインストールしました。
またソフトウェアはSSHサーバーと標準システムユーティリティを選択しました。
そしてインストールとデプロイで使用するパッケージをインストールします。
sudo apt update && sudo apt install -y curl build-essential git
Kubernetes
ここではK3sを使用することにしました。
curl -sfL https://get.k3s.io | sudo sh -s - --write-kubeconfig-mode 644
実行すると以下のように出力されます。
[INFO] Finding release for channel stable
[INFO] Using v1.22.7+k3s1 as release
[INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.22.7+k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.22.7+k3s1/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Skipping installation of SELinux RPM
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Creating /usr/local/bin/ctr symlink to k3s
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s
これでk3sが使える状態になります。
--write-kubeconfig-mode 644
は/etc/rancher/k3s/k3s.yaml
のパーミッションを変更して一般ユーザーからでもkubectl
を使えるようにするパラメーターです。
AWX Operator
AWXのデプロイで使用するAWX Operatorを導入します。
ダウンロード
AWX OperatorをGithubからクローンして使用するバージョン(ここでは0.20.0
)をチェックアウトします。
cd ~
git clone https://github.com/ansible/awx-operator.git
cd awx-operator
git checkout 0.20.0
デプロイ
AWX OperatorをKubernetesにデプロイします。
export NAMESPACE=awx
make deploy
実行すると以下のように出力されます。
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-awx-manager-role created
role.rbac.authorization.k8s.io/awx-operator-leader-election-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-awx-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-awx-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created
無事にAWX Operatorのデプロイが完了すると下記のようになります。
kubectl -n awx get all
実行すると以下のように出力されます。
NAME READY STATUS RESTARTS AGE
pod/awx-operator-controller-manager-557589c5f4-b44gj 2/2 Running 0 52s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/awx-operator-controller-manager-metrics-service ClusterIP 10.43.215.137 <none> 8443/TCP 52s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/awx-operator-controller-manager 1/1 1 1 52s
NAME DESIRED CURRENT READY AGE
replicaset.apps/awx-operator-controller-manager-557589c5f4 1 1 1 52s
AWX
今回はAWXのデプロイに参考サイトの設定をベースに使用します。
ダウンロード
Githubからクローンして使用するバージョン(ここでは0.20.0
)をチェックアウトします。
cd ~
git clone https://github.com/kurokobo/awx-on-k3s.git
cd awx-on-k3s
git checkout 0.20.0
まずbase/awx.yaml
のhostnameを自分が使用するホスト名(例:awx.inaho.space)に置き換えます。
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: awx
spec:
admin_user: admin
admin_password_secret: awx-admin-password
ingress_type: ingress
ingress_tls_secret: awx-secret-tls
hostname: awx.inaho.space
postgres_configuration_secret: awx-postgres-configuration
postgres_storage_class: awx-postgres-volume
postgres_storage_requirements:
requests:
storage: 8Gi
projects_persistence: true
projects_existing_claim: awx-projects-claim
web_resource_requirements: {}
task_resource_requirements: {}
ee_resource_requirements: {}
つづいてbase/kustomization.yaml
のpassword
を実際に使用するパスワードに変更します。
またhttps
で接続するための証明書をbase/tls.crt
、秘密鍵をbase/tls.key
に配置します。
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: awx
generatorOptions:
disableNameSuffixHash: true
secretGenerator:
- name: awx-secret-tls
type: kubernetes.io/tls
files:
- tls.crt
- tls.key
- name: awx-postgres-configuration
type: Opaque
literals:
- host=awx-postgres
- port=5432
- database=awx
- username=awx
- password=Ansible123!
- type=managed
- name: awx-admin-password
type: Opaque
literals:
- password=Ansible123!
resources:
- namespace.yaml
- pv.yaml
- pvc.yaml
- awx.yaml
ディレクトリ
今回使用する設定ファイルに定義してあるディレクトリを作成します。
sudo mkdir -p /data/postgres
sudo mkdir -p /data/projects
sudo chmod 755 /data/postgres
sudo chown 1000:0 /data/projects
デプロイ
AWXをKubernetesにデプロイします。
kubectl apply -k base
実行すると以下のように出力されます。
namespace/awx configured
secret/awx-admin-password created
secret/awx-postgres-configuration created
secret/awx-secret-tls created
persistentvolume/awx-postgres-volume created
persistentvolume/awx-projects-volume created
persistentvolumeclaim/awx-projects-claim created
awx.awx.ansible.com/awx created
デプロイ状況は下記のように確認できます。
kubectl -n awx logs -f deployments/awx-operator-controller-manager -c awx-manager
以下のような表示が出たらデプロイは完了です。
:
:
----- Ansible Task Status Event StdOut (awx.ansible.com/v1beta1, Kind=AWX, awx/awx) -----
PLAY RECAP *********************************************************************
localhost : ok=66 changed=0 unreachable=0 failed=0 skipped=43 rescued=0 ignored=0
----------
確認は下記のように出来ます。
kubectl -n awx get awx,all,ingress,secrets
実行すると以下のように出力されます。
NAME AGE
awx.awx.ansible.com/awx 8m26s
NAME READY STATUS RESTARTS AGE
pod/awx-operator-controller-manager-557589c5f4-b44gj 2/2 Running 0 30m
pod/awx-postgres-0 1/1 Running 0 8m5s
pod/awx-5d484c4ccd-44jcq 4/4 Running 0 7m26s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/awx-operator-controller-manager-metrics-service ClusterIP 10.43.215.137 <none> 8443/TCP 30m
service/awx-postgres ClusterIP None <none> 5432/TCP 8m5s
service/awx-service ClusterIP 10.43.72.116 <none> 80/TCP 7m29s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/awx-operator-controller-manager 1/1 1 1 30m
deployment.apps/awx 1/1 1 1 7m26s
NAME DESIRED CURRENT READY AGE
replicaset.apps/awx-operator-controller-manager-557589c5f4 1 1 1 30m
replicaset.apps/awx-5d484c4ccd 1 1 1 7m26s
NAME READY AGE
statefulset.apps/awx-postgres 1/1 8m5s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/awx-ingress <none> pve-awx01.ad.inaho.space 172.16.0.201 80, 443 7m28s
NAME TYPE DATA AGE
secret/default-token-6hkjg kubernetes.io/service-account-token 3 30m
secret/awx-operator-controller-manager-token-5mb9b kubernetes.io/service-account-token 3 30m
secret/awx-admin-password Opaque 1 8m26s
secret/awx-postgres-configuration Opaque 6 8m26s
secret/awx-secret-tls kubernetes.io/tls 2 8m26s
secret/awx-app-credentials Opaque 3 7m32s
secret/awx-token-bslqh kubernetes.io/service-account-token 3 7m31s
secret/awx-secret-key Opaque 1 8m19s
secret/awx-broadcast-websocket Opaque 1 8m13s
ログイン
ブラウザーでbase/awx.yaml
に設定したホスト(例:https://awx.inaho.space)にアクセスするとこのような画面が現れます。
初期ユーザーはadmin
、パスワードはbase/kustomization.yaml
のawx-admin-password
です。
おわりに
Kubernetesをまったく知らない私がAWXをなんとかデプロイできました。
最初CPUタイプをkvm64のままにしてたらデプロイがエラー終了ばかりで数日悩みました。
ある日ググったらKVMのCPUタイプが云々という英語の記事に出会って解決できました。
ホストPCのCPUはXeon E5-2650L v3だけど大丈夫と思いたい。
とりあえずAWXを構築してからAnsibleを使い始めたけど結構便利です。
まだ定期的にソフトウェア更新を実行するくらいにしか使ってないけど、今後はいろんな使い方を考えようと思います。