Ansible AWX バージョン 18.0 から AWX Operator を使うインストール方法に変更されました。

https://github.com/ansible/awx-operator

AWX Operator を使うと Kubernetes クラスタへの AWX デプロイが簡単にできます。

標準的な設定では AWX 関連のコンテナをまとめた Pod と一緒に PostgreSQL Pod もデプロイされますが、今回は AWX Operator 管理外の PostgreSQL インスタンスと連携するように AWX をデプロイします。

環境情報

ソフトウェア バージョン
Kubernetes 1.21.2
AWX 19.3.0
AWX Operator 0.13.0
Zalando Postgres Operator 1.6.3

AWX Operator

AWX Operator は公式の マニュアル 手順通りにインストールしていきます。

特筆する点はないのでマニュアルを参照してください。

PostgreSQL

AWX で利用する PostgreSQL インスタンスは Zalando Postgres Operator を使って用意します。

Operator のインストール方法は下記の投稿を参照してください。

以下の postgresql リソースのマニフェストで、AWX 用の PostgreSQL インスタンスがデプロイされます。

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  labels:
    team: acid
  name: acid-awx
  namespace: awx
spec:
  allowedSourceRanges: []
  databases:
    awx: awx
  numberOfInstances: 1
  postgresql:
    version: '13'
  resources:
    limits:
      cpu: 500m
      memory: 500Mi
    requests:
      cpu: 100m
      memory: 100Mi
  teamId: acid
  users:
    awx: []
  volume:
    size: 10Gi
  patroni:
    pg_hba:
      - local     all         all                    trust
      - hostssl   all         +zalandos 127.0.0.1/32 pam
      - host      all         all       127.0.0.1/32 md5
      - hostssl   all         +zalandos ::1/128      pam
      - host      all         all       ::1/128      md5
      - hostssl   replication standby   all          md5
      - hostssl   all         +zalandos all          pam
      - hostssl   all         all       0.0.0.0/0    md5
      - host      all         all       0.0.0.0/0    md5

postgresql リソースでデプロイされる registry.opensource.zalan.do/acid/spilo-13 コンテナは pg_hba.conf が以下のようになっています。

# Do not edit this file manually!
# It will be overwritten by Patroni!
local   all             all                                   trust
hostssl all             +zalandos    127.0.0.1/32       pam
host    all             all                127.0.0.1/32       md5
hostssl all             +zalandos    ::1/128            pam
host    all             all                ::1/128            md5
hostssl replication     standby all                md5
hostnossl all           all                all                reject
hostssl all             +zalandos    all                pam
hostssl all             all                all                md5

この状態では AWX コンテナからアクセスできないため、上記のように spec.patroni.pg_hba で定義します。

また、postgresql マニフェストでは StorageClass を指定するか、クラスタの StorageClass にデフォルト設定をしておきます。

$ kubectl get storageclass
NAME                        PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage               kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  69d
rook-ceph-block (default)   rook-ceph.rbd.csi.ceph.com     Delete          Immediate              true                   12d

うまくデプロイできると以下のリソースが作成されています。

$ kubectl get pods,svc,secret,pvc
NAME                                READY   STATUS              RESTARTS   AGE
pod/acid-awx-0                      1/1     Running             0          2d
pod/awx-operator-69c646c48f-cgkbl   1/1     Running             2          8d

NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
service/acid-awx                ClusterIP   10.107.168.117   <none>        5432/TCP            2d
service/acid-awx-config         ClusterIP   None             <none>        <none>              2d
service/acid-awx-repl           ClusterIP   10.104.194.254   <none>        5432/TCP            2d
service/awx-operator-metrics    ClusterIP   10.105.177.117   <none>        8383/TCP,8686/TCP   8d

NAME                                           TYPE                                  DATA   AGE
secret/awx-operator-token-8rdhp                kubernetes.io/service-account-token   3      8d
secret/awx-postgres-configuration              Opaque                                7      2d
secret/awx.acid-awx.credentials                Opaque                                2      2d
secret/default-token-m56vf                     kubernetes.io/service-account-token   3      8d
secret/postgres.acid-awx.credentials           Opaque                                2      2d
secret/standby.acid-awx.credentials            Opaque                                2      2d

NAME                                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
persistentvolumeclaim/pgdata-acid-awx-0           Bound    pvc-d47938d5-fd94-4bcb-865f-467fd8647b82   10Gi       RWO            rook-ceph-block   2d

このうち、secret/awx.acid-awx.credentials に AWX から PostgreSQL にアクセスするための認証情報が格納されているので、以下のコマンドで確認しておきます。

$ kubectl get secret awx.acid-awx.credentials -o jsonpath='{.data.password}' | base64 -d

AWX

PostgreSQL インスタンスを用意できたら AWX をデプロイします。

必要なものは AWX Operator が参照する AWX リソースと Secret リソースのマニフェストです。

apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
  namespace: awx
spec:
  admin_user: admin
  admin_password_secret: awx-admin-password
  
  ingress_type: ingress
  ingress_tls_secret: awx-secret-tls
  hostname: awx.k8s.nnstt1.work

  postgres_configuration_secret: awx-postgres-configuration

AWX リソースの spec で AWX の各種設定をおこないます。 今回は Ingress の設定、admin ユーザと外部 PostgreSQL の設定を格納した secret の指定をおこないました。

Secret リソースでは、上記の secret を作成します。

apiVersion: v1
kind: Secret
metadata:
  name: awx-admin-password
  namespace: awx
stringData:
  password: password
---
apiVersion: v1
kind: Secret
metadata:
  name: awx-postgres-configuration
  namespace: awx
stringData:
  host: acid-awx
  port: "5432"
  database: awx
  username: awx
  password: oqIgEGDuCDG40LI2tIQ4OdIUtdKFGiLDkAbUiCyrZgMnKFSTZrQsQmihtTnOkvdH
  sslmode: prefer
  type: unmanaged
type: Opaque

stringData は Zalando Postgres Operator で構築した PostgreSQL インスタンスの情報を記載します。

stringData.type には unmanaged を指定します。 この値により、AWX Operator が「PostgreSQL インスタンスを自前で構築する」か「外部 PostgreSQL を参照する」かを判断します。

(「Secret リソースの内容で Operator の挙動を変える」って仕様がよろしくなさそうに感じたんですがどうなんでしょう?)

上記のマニフェストを Apply することで、AWX Operator がいい感じに AWX をデプロイしてくれます。

うまく AWX から PostgreSQL にアクセスできたら初期構築が始まります、そこそこ時間が掛かるようなので気楽に待ちましょう。 自分の環境では 15 分ほど掛かかりました。

初期構築も完了したら Ingress 経由でアクセスします。 今回のマニフェストでは AWX へのアクセスは Ingress 経由になるため、NGINX Ingress Controller などを使ってクラスタで Ingress を使えるように事前に準備しておいてください。

AWX のログイン画面が表示できたらデプロイ成功です。 お疲れさまでした。