Kubernetes で AWX 使えるようにするときのメモ

2022/09/12に公開

お家の検証サーバ用の備忘録です。基本 root です。

参考

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

外部サービス

今回、AWX が使用する外部サービスとして PostgreSQLFreeIPA を使うことにします。

コンテナを使って、仮想マシン1台(192.168.1.21)でまとめて展開します。従って、各サービスへのアクセスは以下のようになります。

Service IP Address:Port
PostgreSQL 192.168.1.21:5432
FreeIPA(LDAP) 192.168.1.21:646

構築方法については、それぞれ以下の記事を参照してください。

Kubernetes

AWX は (awx-operatorを使って) Kubernetes 上に展開することが推奨されているため、Kubernetes クラスタを用意します。IPアドレスと役割は以下の通りです。

Role IP Address
Controller 192.168.1.22
Worker1 192.168.1.23
Worker2 192.168.1.24

構築方法については、以下の記事を参照してください。

FreeIPAの設定

AWX から LDAP 認証するための準備をします。

192.168.1.21 にログインし、以下のコマンドで FreeIPA コンテナにログインします。

podman exec -it ipa bash

FreeIPA コンテナで Kerberos チケットを取得します。

# パスワードを問われるので、コンテナ起動時に指定したパスワードを入力する
kinit admin

# チケットが取得できたことを確認する。
klist

続けて、AWX からバインドするユーザーを作成し、グループに追加します。

# AWX 用ユーザーの作成
ipa user-add ansible --first=ansible --last=admin --password

# グループの作成と、ユーザーの追加
ipa group-add awx
ipa group-add-member awx --users=ansible

# AWX にログインに使用するユーザーの作成
ipa user-add asterisk9101 --first=asterisk --last=9101 --password
ipa group-add-member awx --users=asterisk9101

更に、外部から LDAPS で接続するために証明書を採取します(※正しい方法なのか怪しい)

cat /etc/ipa/ca.crt

この証明書は Controller ノード(192.168.1.22) にコピーしておきます。

以上で FreeIPA コンテナでの作業は完了です。

yamlファイルの作成

Controller ノード (192.168.1.22) で作業します。

適当なディレクトリを作って、その中で作業します。前工程で採取した ca.crt ファイルは、このディレクトリに入れておきます。

mkdir awx
cd awx

まず、データベースへの接続定義 awx-postgres-configuration.yaml を用意します。

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

次に、LDAP サーバーへの接続パスワード ldap-secret.yaml を用意します。

---
apiVersion: v1
kind: Secret
metadata:
  name: awx-demo-ldap-password
  namespace: awx
stringData:
  ldap-password: P@ssw0rd
type: Opaque

マニュアルに従って awx-demo.yaml ファイルを作ります。GroupOfNamesType()lda.OPT_X_TLS_REQUIRE_CERT を使用するために from ... import ... を注入しています。他に綺麗なやり方が見つからなかったのでやむを得ず。

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: nodeport
  nodeport_port: 30080
  postgres_configuration_secret: awx-postgres-configuration
  bundle_cacert_secret: awx-demo-custom-certs
  ldap_cacert_secret:   awx-demo-custom-certs
  ldap_password_secret: awx-demo-ldap-password
  extra_settings:
  - setting: AUTH_LDAP_SERVER_URI
    value: '"ldaps://192.168.1.21:636"; from django_auth_ldap.config import GroupOfNamesType; import ldap'
  - setting: AUTH_LDAP_BIND_DN
    value: '"uid=ansible,cn=users,cn=accounts,dc=localdomain,dc=intra"'
  - setting: AUTH_LDAP_USER_SEARCH
    value: 'LDAPSearch("cn=users,cn=accounts,DC=localdomain,DC=intra",ldap.SCOPE_SUBTREE,"(uid=%(user)s)",)'
  - setting: AUTH_LDAP_GROUP_SEARCH
    value: 'LDAPSearch("cn=groups,cn=accounts,dc=localdomain,dc=intra",ldap.SCOPE_SUBTREE,"(objectClass=groupofnames)",)'
  - setting: AUTH_LDAP_GROUP_TYPE
    value: "GroupOfNamesType()"
  - setting: AUTH_LDAP_CONNECTION_OPTIONS
    value: '{ ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_ALLOW }'
  - setting: AUTH_LDAP_REQUIRE_GROUP
    value: '"cn=awx,cn=groups,cn=accounts,dc=localdomain,dc=intra"'

事前に準備するファイルは以上です。

awx-operatorのインストール

まず Controller ノード(192.168.1.22)にて、Kustomize をインストールします。

curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash

# カレントディレクトリにインストールされますが、邪魔なので移動します
mv kustomize /usr/local/bin/

kustomization.yaml ファイルを作ります。awx-operator のバージョンは、0.28.0 にしました。

---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - github.com/ansible/awx-operator/config/default?ref=0.28.0
  - awx-postgres-configuration.yaml
  - ldap-secret.yaml
  - awx-demo.yaml

images:
  - name: quay.io/ansible/awx-operator
    newTag: 0.28.0

namespace: awx

namespace を先に作って、awx-demo-custom-certs を作成した上で、kustomization.yaml を展開します。

kubectl create namespace awx
kubectl create -n awx secret generic awx-demo-custom-certs --from-file=ldap-ca.crt=ca.crt --from-file=bundle-ca.crt=/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
kustomize build . | kubectl apply -f -

kubectl の名前空間を awx に変更して、awx-operator が稼働していることを確認します。しばらく待つと awx-demo-... が作成されます。

kubectl config set-context --current --namespace=awx
kubectl get pod

稼働確認

Controller ノード(192.168.1.22)にて admin ユーザーのパスワードを取得します。

kubectl get secret awx-demo-admin-password -ojson | jq '.data.password' -r | base64 -d | xargs

ブラウザで Kubernetes ノードのいずれかの 30080 ポートにアクセスし、admin でログインできることを確認します。また、asterisk9101 ユーザーでログインし、LDAP 連携できていることも確認します。

トラブルシューティング

上手く動かず中々手こずったので、トラブルシューティングの手法もメモしておきます。

まず最初に見るべきは、Pod の稼動状況です。Pod が起動しない原因(リソース不足など)の調査ができます。

kubectl describe pod/awx-demo....

次に、Pod の標準出力を確認します。-c でコンテナを指定する必要があります。ブラウザでアクセスできない原因(DB接続に失敗しているなど)の調査ができます。

kubectl logs -f awx-demo... -c awx-demo-web

それでも駄目なら、Pod にログインします。設定値が想定通りに設定されているか(設定値のダブルクォートが抜けてエラーになっていたり)などの調査ができます。尚、awx-operator が設定を挿入するファイルは /etc/tower/settings.py にあります。

kubectl exec -it awx-demo... -c awx-demo-web -- bash

以上

GitHubで編集を提案

Discussion