はじめに
「AWX」は、Red Hat Ansible Automation Platformのアップストリームプロジェクトの1つで、サポートはありませんが無償で使用できるコミュニティ版のAnsibleです。
「AWX Operator」は、AWXをインストールするために推奨されている方法の1つで、Kubernetesクラスターにデプロイされることを意図して作成されています。
本記事では、Almalinuxで構築したKenernetes(k8s)環境上に「AWX」を構築する方法について記載します。
環境
- OS
AlmaLinux release 9.5 (Teal Serval) - Container Runtime Interface(CRI)
Containerd v2.0.4 - Kubernetes(k8s)
v1.32 - Container Network Interface(CNI)
calico v3.29.2 - AWX
AWX 2.19.1
[maint@cp ~]$ cat /etc/redhat-release
AlmaLinux release 9.5 (Teal Serval)
[maint@cp ~]$ uname -a
Linux cp 5.14.0-503.33.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Mar 20 03:39:23 EDT 2025 x86_64 x86_64 x86_64 GNU/Linux
[maint@cp ~]$ kubectl version
Client Version: v1.32.3
Kustomize Version: v5.5.0
Server Version: v1.32.3
[maint@cp ~]$
事前準備
makeのインストール
1.デプロイするために、「make」をインストールします。
[maint@cp ~]$ sudo dnf install make
NFSサーバのインストール
本記事では、AWXのPostgres用ボリューム及びProjects用ボリュームとして、NFSボリュームを使用するため、NFSサーバをインストールします。
[maint@cp ~]$ sudo dnf install -y rpcbind nfs-utils
依存関係が解決しました。
======================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
======================================================================================================================================================
インストール:
nfs-utils x86_64 1:2.5.4-27.el9 baseos 431 k
rpcbind x86_64 1.2.6-7.el9 baseos 56 k
依存関係のインストール:
gssproxy x86_64 0.8.4-7.el9 baseos 108 k
libev x86_64 4.33-5.el9 baseos 52 k
libnfsidmap x86_64 1:2.5.4-27.el9 baseos 59 k
libverto-libev x86_64 0.3.2-3.el9 baseos 13 k
sssd-nfs-idmap x86_64 2.9.5-4.el9_5.4 baseos 38 k
トランザクションの概要
======================================================================================================================================================
インストール 7 パッケージ
~(略)~
インストール済み:
gssproxy-0.8.4-7.el9.x86_64 libev-4.33-5.el9.x86_64 libnfsidmap-1:2.5.4-27.el9.x86_64 libverto-libev-0.3.2-3.el9.x86_64
nfs-utils-1:2.5.4-27.el9.x86_64 rpcbind-1.2.6-7.el9.x86_64 sssd-nfs-idmap-2.9.5-4.el9_5.4.x86_64
完了しました!
[maint@cp ~]$
2.NFSサーバを起動します。
[maint@cp ~]$ sudo systemctl start rpcbind.service
[maint@cp ~]$ sudo systemctl start nfs-server.service
[maint@cp ~]$ sudo systemctl enable rpcbind.service
[maint@cp ~]$ sudo systemctl enable nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[maint@cp ~]$
3.サービスが起動していることを確認します。
[maint@cp ~]$ sudo systemctl status rpcbind.service
● rpcbind.service - RPC Bind
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-03-30 12:55:00 JST; 28s ago
TriggeredBy: ● rpcbind.socket
Docs: man:rpcbind(8)
Main PID: 38715 (rpcbind)
Tasks: 1 (limit: 48705)
Memory: 1.6M
CPU: 10ms
CGroup: /system.slice/rpcbind.service
mq38715 /usr/bin/rpcbind -w -f
3月 30 12:55:00 cp systemd[1]: Starting RPC Bind...
3月 30 12:55:00 cp systemd[1]: Started RPC Bind.
[maint@cp ~]$ sudo systemctl status nfs-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; preset: disabled)
Active: active (exited) since Sun 2025-03-30 12:55:10 JST; 26s ago
Docs: man:rpc.nfsd(8)
man:exportfs(8)
Process: 39403 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 39409 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 39443 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Main PID: 39443 (code=exited, status=0/SUCCESS)
CPU: 12ms
3月 30 12:55:10 cp systemd[1]: Starting NFS server and services...
3月 30 12:55:10 cp systemd[1]: Finished NFS server and services.
[maint@cp ~]$
AWXのインストール
AWX Operatorのインストール
1.「AWX Operator」のGitリポジトリをクローンします。
[maint@cp ~]$ git clone https://github.com/ansible/awx-operator.git
Cloning into 'awx-operator'...
remote: Enumerating objects: 11049, done.
remote: Counting objects: 100% (2671/2671), done.
remote: Compressing objects: 100% (607/607), done.
remote: Total 11049 (delta 2384), reused 2064 (delta 2064), pack-reused 8378 (from 3)
Receiving objects: 100% (11049/11049), 3.48 MiB | 13.01 MiB/s, done.
Resolving deltas: 100% (6437/6437), done.
[maint@cp ~]$ ls -l
合計 100484
drwxr-xr-x 14 maint maint 4096 3月 30 11:42 awx-operator
[maint@cp ~]$
2.「git tag」を選択し、インストールするバージョンを選択します。
ここでは、「git tag:2.19.1」を選択します。
[maint@cp awx-operator]$ git tag
0.10.0
0.11.0
~(略)~
2.19.0
2.19.1 <= 【ここでは、このタグを選択】
~(略)~
2.8.0
2.9.0
[maint@cp awx-operator]$
[maint@cp awx-operator]$ git checkout tags/2.19.1
Note: switching to 'tags/2.19.1'.
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 dd37ebd Update index.md (#1904)
[maint@cp awx-operator]$
3.ターゲットをmakeして、「awx operator」を作成します。
[maint@cp awx-operator]$ make deploy
namespace/awx created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxmeshingresses.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
[maint@cp awx-operator]$
4.「awx operator」が実行されていることを確認します。
[maint@cp awx-operator]$ kubectl get pods -n awx
NAME READY STATUS RESTARTS AGE
awx-operator-controller-manager-58b7c97f4b-kck95 2/2 Running 0 36s
[maint@cp awx-operator]$
5.kubectl の現在の名前空間を「awx」に設定します。
(※「-n awx」を繰り返し、指定する必要がなくなります。)
[maint@cp awx-operator]$ kubectl config set-context --current --namespace=awx
Context "kubernetes-admin@kubernetes" modified.
[maint@cp awx-operator]$
NFSボリュームの作成
AWXで使用するPostgres用ボリュームとして、NFSボリューム「/share/postgres」、プロジェクト用ボリュームとして、NFSボリューム「/share/projects」をそれぞれ作成します。
1.NFSサーバ使用するディレクトリを作成します。
[maint@cp /]$ sudo mkdir -p /share/postgres
[maint@cp /]$ sudo chmod 777 /share/postgres
[maint@cp ~]$ sudo mkdir -p /share/projects
[maint@cp ~]$ sudo chmod 777 /share/projects
[maint@cp ~]$
2.NFSサーバでexportsするディレクトリを設定ファイルに記載します。
[maint@cp ~]$ sudo vi /etc/exports.d/postgres.exports
【記載内容】
/share/postgres *(rw,no_root_squash,async)
[maint@cp ~]$
[maint@cp ~]$ sudo vi /etc/exports.d/projects.exports
【記載内容】
/share/projects *(rw,no_root_squash,async)
[maint@cp ~]$
3.NFSサーバに変更した内容を反映します。
[maint@cp ~]$ sudo exportfs -ra
[maint@cp ~]$
4.所定のディレクトリがexportsされていることを確認します。
[maint@cp ~]$ showmount --exports
Export list for cp:
/share/projects *
/share/postgres *
[maint@cp ~]$
Postgres用PersistentVolumeの作成
1.Postgres用PersistentVolumeを作成するためのyamlファイルを作成します。
NFSサーバのボリューム「/share/postgres」を使用します。
[maint@cp awx-operator]$ vi pv-postgres.yaml
【記載内容】
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-postgres
namespace: awx
spec:
storageClassName: sc-postgres
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
path: /share/postgres
server: cp
readOnly: false
[maint@cp awx-operator]$
2.Kubernetes上にPostgres用PersistentVolumeを作成します。
[maint@cp awx-operator]$ kubectl create -f pv-postgres.yaml
persistentvolume/pv-postgres created
[maint@cp awx-operator]$
3.作成されたことを確認します。
[maint@cp awx-operator]$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pv-postgres 10Gi RWO Retain Available sc-postgres <unset> 3m18s
[maint@cp awx-operator]$
Postgres用StorageClassの作成
1.Postgres用StorageClassを作成するためのyamlファイルを作成します。
[maint@cp awx-operator]$ vi sc-postgres.yaml
【記載内容】
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-postgres
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
[maint@cp awx-operator]$
2.Kubernetes上にPostgres用StorageClassを作成します。
[maint@cp awx-operator]$ kubectl create -f sc-postgres.yaml
storageclass.storage.k8s.io/sc-postgres created
[maint@cp awx-operator]$
3.作成されたことを確認します。
[maint@cp awx-operator]$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
sc-postgres kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 48s
[maint@cp awx-operator]$
Projects用PersistentVolumeの作成
1.Projects用PersistentVolumeを作成するためのyamlファイルを作成します。
NFSサーバのたボリューム「/share/projects」を使用します。
[maint@cp awx-operator]$ vi pv-awx-projects.yaml
【記載内容】
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-awx-projects
namespace: awx
spec:
storageClassName: sc-awx-projects
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /share/projects
server: cp
readOnly: false
[maint@cp awx-operator]$
2.Kubernetes上にProjects用PersistentVolumeを作成します。
[maint@cp awx-operator]$ kubectl create -f pv-awx-projects.yaml
persistentvolume/pv-awx-projects created
[maint@cp awx-operator]$
3.作成されたことを確認します。
[maint@cp awx-operator]$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pv-awx-projects 5Gi RWX Retain Available sc-awx-projects <unset> 59s
pv-postgres 10Gi RWO Retain Available sc-postgres <unset> 12m
[maint@cp awx-operator]$
Projects用PersistentVolumeClaimの作成
1.Projects用PersistentVolumeClaimを作成するためのyamlファイルを作成します。
[maint@cp awx-operator]$ vi pvc-awx-projects.yaml
【記載内容】
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-awx-projects
spec:
storageClassName: sc-awx-projects
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
[maint@cp awx-operator]$
2.Kubernetes上にProjects用PersistentVolumeClaimを作成します。
[maint@cp awx-operator]$ kubectl create -f pvc-awx-projects.yaml
persistentvolumeclaim/pvc-awx-projects created
[maint@cp awx-operator]$
3.作成されたことを確認します。
[maint@cp awx-operator]$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-awx-projects Bound pv-awx-projects 5Gi RWX sc-awx-projects <unset> 18s
[maint@cp awx-operator]$
Projects用StorageClassの作成
1.Projects用StorageClassを作成するためのyamlファイルを作成します。
[maint@cp awx-operator]$ vi sc-awx-projects.yaml
【記載内容】
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-awx-projects
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
[maint@cp awx-operator]$
2.Kubernetes上にProjects用StorageClassを作成します。
[maint@cp awx-operator]$ kubectl create -f sc-awx-projects.yaml
storageclass.storage.k8s.io/sc-awx-projects created
[maint@cp awx-operator]$
3.作成されたことを確認します。
[maint@cp awx-operator]$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
sc-awx-projects kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 63s
sc-postgres kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 12m
[maint@cp awx-operator]$
AWXのデプロイ
1.同じフォルダーに「AWX」をデプロイするための「my-awx.yml」ファイルを作成します。
ここでは、リソース名として「my-awx」、サービスタイプとして「nodeport」を使用します。
[maint@cp awx-operator]$ vi my-awx.yml
【記載内容】
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: my-awx
spec:
service_type: nodeport
postgres_storage_class: sc-postgres <= 事前に作成したPostgres用StorageClass
projects_persistence: true
projects_storage_class: sc-awx-projects <= 事前に作成したProjects用StorageClass
projects_storage_size: 5Gi <= 事前に作成したProjects用PersistentVolumeのサイズ
projects_existing_claim: pvc-awx-projects <= 事前に作成したProjects用PersistentVolumeClaim
[maint@cp awx-operator]$
2.「AWX」をデプロイします。
[maint@cp awx-operator]$ kubectl create -f my-awx.yml
awx.awx.ansible.com/my-awx created
[maint@cp awx-operator]$
3.インストールの進行状況を確認するには、以下のコマンドを実行します。
インストールには、しばらく時間がかかります。
「PLAY RECAP ***~」が表示されれば、インストールプロセスが終了しています。
[maint@cp awx-operator]$ kubectl logs -f deployments/awx-operator-controller-manager -c awx-manager
PLAY RECAP *********************************************************************
localhost : ok=88 changed=0 unreachable=0 failed=0 skipped=85 rescued=0 ignored=1
----------
[maint@cp ~]$
4.リソースが作成されていることを確認します。
[maint@cp ~]$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME READY STATUS RESTARTS AGE
my-awx-migration-24.6.1-zpwkk 0/1 Completed 0 7m53s
my-awx-postgres-15-0 1/1 Running 0 43m
my-awx-task-5c7ff6fd66-8l5cm 4/4 Running 0 8m39s
my-awx-web-7b5bbd6d9c-j88fs 3/3 Running 0 8m39s
[maint@cp ~]$
[maint@cp ~]$ kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-awx-postgres-15 ClusterIP None <none> 5432/TCP 45m
my-awx-service NodePort 10.101.195.243 <none> 80:32186/TCP 10m
[maint@cp ~]$
AWXの接続確認
AWXインスタンスへのアクセスは、「http://<Control PlaneのIPアドレス>:<assigned-nodeport>/」でアクセスすることができます。
Control PlaneのIPアドレスの確認
1.Kubernetesの「Control Plane」のURLを確認します。
以下の場合、Control PlaneのIPアドレスは、「192.168.10.50」であることが確認できます。
[maint@cp ~]$ kubectl cluster-info
Kubernetes control plane is running at https://cp:6443
CoreDNS is running at https://cp:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[maint@cp ~]$
[maint@cp ~]$ ping cp
PING cp (192.168.10.50) 56(84) bytes of data.
64 バイト応答 送信元 cp (192.168.10.50): icmp_seq=1 ttl=64 時間=0.113ミリ秒
64 バイト応答 送信元 cp (192.168.10.50): icmp_seq=2 ttl=64 時間=0.058ミリ秒
^C
--- cp ping 統計 ---
送信パケット数 3, 受信パケット数 3, 0% packet loss, time 2058ms
rtt min/avg/max/mdev = 0.051/0.074/0.113/0.027 ms
[maint@cp ~]$
NodePortの確認
1.「AWX Service」を確認し、割り当てられた「NodePort」を確認します。
以下の場合、「NodePort」は、「32186」です。
[maint@cp ~]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
awx-operator-controller-manager-metrics-service ClusterIP 10.102.145.84 <none> 8443/TCP 3h21m
my-awx-postgres-15 ClusterIP None <none> 5432/TCP 57m
my-awx-service NodePort 10.101.195.243 <none> 80:32186/TCP 22m
[maint@cp ~]$
初期パスワードの取得
1.初期パスワードは、「<resourcename>-admin-password」のシークレットで取得することができます。
[maint@cp ~]$ kubectl get secret my-awx-admin-password -o jsonpath="{.data.password}" | base64 --decode ; echo
YanEgqE4pnl10POLmTuJxhpPANAa3mwQ
[maint@cp ~]$
アクセス確認
1.確認した「Control PlaneのIPアドレス」、「NodePort」を使用して、AWXにアクセスしログインできることを確認します。
ユーザーIDは、「admin」、初期パスワードは、確認したパスワードです。
URL: http://192.168.10.50:32186/


以上で、終了です。