🛠️

【作業時間30分】Ansible AWXのインストール手順

2024/01/31に公開

2024/11/16 修正

リポジトリURLなどが変更されていて動かなくなっていたので修正しました。
伴って実行バージョンも少し新しくしてデプロイにFluxCDを使うようにしました。
(参考までに筆者が動かせたバージョンの組み合わせになります。)

  • Alma Linux 9.4
  • k0s 1.30.6+k0s.0
  • flux-operator 0.10.0
  • openebs 3.10.0
  • postgresql 12.12.10(pgsql 15.4.0)
  • awx-operator 2.19.1

この記事の背景(雑談)

CLI版のansible-playbookと比べてWeb GUI版のAWXの大きなメリットとして、AWXにはGit上に置いてあるPlaybookやInventoryを都度Pullして実行する機能があること。PlaybookやInventoryを常にGit上でメンテナンスできるのはリビジョン管理やバックアップの観点からとても優れている。そこでAWXの導入方法を調べてみたところ、なんとインストール方法はkubernetes上への展開のみサポート。あまりKubernetesを使ったことがない人間にとって現実的な選択肢ではない。

そこでKubernetesを全然触ったことがないエンジニアでも手軽にAWXをデプロイできれば便利そうということで、筆者が愛用しているk0sを使ってKubernetesのデプロイとAWXのインストールを一発でやってしまうことにする。

この記事で実現できること

Enterprise Linux(EL)上にAnsible AWXをデプロイする
※ AWXはKubernetes(k8s)が必要なのでk8sディストリビューションはk0sを採用
※ kubernetesはSingle Nodeで冗長は組まずシステム障害は考慮しない
※ FirewallやTLSなどセキュリティ面は考慮しない

前提環境

  • Enterprise Linux(EL)
    • 筆者はAlma Linux 9.4を使用
      • Systemdで動くLinuxならEL以外も可能なはず
    • インターネットへの接続性が必要
      • Kubernetesで明示プロキシは面倒なので直インターネット接続できると望ましい
      • もしプロキシが必要ならKubernetesの前段に透過プロキシ立てた方が楽かもしれない
    • IPアドレスをStaticで固定する
      • Kubernetesをインストールした後にIPを変更するのは難しい

作業は全てrootユーザで実行

RPMでGo言語のインストール

k0sのインストールツールがGo言語なので下準備

dnf install -y golang
export PATH=~/go/bin:$PATH
echo 'export PATH=~/go/bin:$PATH' > /etc/profile.d/golang.sh

新しいGo言語のインストール

EL9のrpmで提供されるGo言語は古いので、新しいバージョンを追加インストール

go install golang.org/dl/go1.23.3@latest
go1.23.3 download

k0sctlのインストール

k0sを制御するk0sctlコマンドをインストールする

go1.23.3 install github.com/k0sproject/k0sctl@main

Firewalldを無効化

kubernetesでACLをかけたい場合、kubernetes内のNetworkPolicyというものを使用する。

systemctl disable --now firewalld

k0sctl.yamlの準備

k0sctlで使用するコンフィグファイルを準備
コンフィグファイルはコマンド実行時に読み込ませるだけなのでどこに置いても可
筆者はどこに置いたかわかりやすい/etc/k0s/配下に配置

  • k0sctl.yaml
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
  name: k0s-local
spec:
  hosts:
  - localhost:
      enabled: true
    role: controller+worker
    noTaints: true
  k0s:
    # https://github.com/k0sproject/k0s/releases
    version: 1.30.6+k0s.0
    dynamicConfig: false
    config:
      apiVersion: k0s.k0sproject.io/v1beta1
      kind: ClusterConfig
      spec:
        network:
          kubeProxy:
            mode: ipvs
        extensions:
          helm:
            concurrencyLevel: 1
            repositories:
            - name: wikimedia
              url: https://helm-charts.wikimedia.org/stable/
            charts:
            - name: flux-operator
              chartname: oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator
              version: 0.10.0
              namespace: flux-system
              order: 1
              timeout: 5m
              values: ""
            - name: flux-operator-instance
              chartname: wikimedia/raw
              namespace: flux-system
              order: 2
              timeout: 5m
              values: |
                resources:
                - 
                  apiVersion: fluxcd.controlplane.io/v1
                  kind: FluxInstance
                  metadata:
                    name: flux
                  spec:
                    distribution:
                      version: "2.x"
                      registry: "ghcr.io/fluxcd"
                      artifact: "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests"
                    cluster:
                      type: kubernetes
            - name: flux-operator-config
              chartname: wikimedia/raw
              namespace: flux-system
              order: 3
              timeout: 5m
              values: |
                resources:
                -
                  apiVersion: source.toolkit.fluxcd.io/v1
                  kind: HelmRepository
                  metadata:
                    name: openebs-internal
                    namespace: flux-system
                  spec:
                    interval: 24h
                    url: https://openebs.github.io/charts
                -
                  apiVersion: source.toolkit.fluxcd.io/v1
                  kind: HelmRepository
                  metadata:
                    name: awx-operator
                    namespace: flux-system
                  spec:
                    interval: 24h
                    url: https://ansible-community.github.io/awx-operator-helm/
                -
                  apiVersion: source.toolkit.fluxcd.io/v1
                  kind: HelmRepository
                  metadata:
                    name: postgresql
                    namespace: flux-system
                  spec:
                    interval: 24h
                    type: oci
                    url: oci://registry-1.docker.io/bitnamicharts/
                -
                  apiVersion: helm.toolkit.fluxcd.io/v2
                  kind: HelmRelease
                  metadata:
                    name: openebs
                    namespace: flux-system
                  spec:
                    targetNamespace: openebs
                    interval: 5m
                    chart:
                      spec:
                        chart: openebs
                        version: '3.x.x'
                        sourceRef:
                          kind: HelmRepository
                          name: openebs-internal
                          namespace: flux-system
                        interval: 5m
                    install:
                      createNamespace: true
                      crds: CreateReplace
                      remediation:
                        retries: 10
                    upgrade:
                      crds: CreateReplace
                      remediation:
                        retries: 10
                    dependsOn: []
                    values:
                      localprovisioner:
                        hostpathClass:
                          enabled: true
                          isDefaultClass: true
                -
                  apiVersion: helm.toolkit.fluxcd.io/v2
                  kind: HelmRelease
                  metadata:
                    name: postgresql
                    namespace: flux-system
                  spec:
                    targetNamespace: awx
                    interval: 5m
                    chart:
                      spec:
                        chart: postgresql
                        version: '12.x.x'
                        sourceRef:
                          kind: HelmRepository
                          name: postgresql
                          namespace: flux-system
                        interval: 5m
                    install:
                      createNamespace: true
                      crds: CreateReplace
                      remediation:
                        retries: 10
                    upgrade:
                      crds: CreateReplace
                      remediation:
                        retries: 10
                    dependsOn:
                    - name: openebs
                    values:
                      global:
                        storageClass: openebs-hostpath
                        postgresql:
                          auth:
                            postgresPassword: postgres
                            username: awx
                            password: awx
                            database: awx
                -
                  apiVersion: helm.toolkit.fluxcd.io/v2
                  kind: HelmRelease
                  metadata:
                    name: awx-operator
                    namespace: flux-system
                  spec:
                    targetNamespace: awx
                    interval: 5m
                    chart:
                      spec:
                        chart: awx-operator
                        version: '2.x.x'
                        sourceRef:
                          kind: HelmRepository
                          name: awx-operator
                          namespace: flux-system
                        interval: 5m
                    install:
                      createNamespace: true
                      crds: CreateReplace
                      remediation:
                        retries: 10
                    upgrade:
                      crds: CreateReplace
                      remediation:
                        retries: 10
                    dependsOn:
                    - name: postgresql
                    values:
                      AWX: 
                        enabled: true
                        spec:
                          service_type: NodePort
                          nodeport_port: 30080
                          projects_persistence: true
                          projects_storage_class: openebs-hostpath
                          projects_storage_access_mode: ReadWriteOnce
                        postgres:
                          enabled: true
                          host: awx-postgresql
                          port: 5432
                          dbName: awx
                          username: awx
                          password: awx
                          sslmode: prefer
                          type: unmanaged

k0s + AWXインストール

k0sctl.yamlを置いたディレクトリに移動して、インストールコマンドを実行して待つ

cd /etc/k0s
k0sctl apply

完了

インストールしたサーバのスペックにもよるが30分ほど放置した後、
Webブラウザで下記のURLにアクセスするとAWXのWebGUIに繋がる

http://{IPアドレス}:30080/

ログインIDはadminで初期PWは下記のコマンドで出てきた文字列を入力
ログイン後にダッシュボード上でPWを変更することも可能

k0s kubectl get secret -n awx awx-admin-password -o jsonpath="{.data.password}" | base64 --decode ; echo

デプロイ時間は別として、ここまでの作業自体は30分程度で出来たのではないだろうか。

アンインストール

調子がおかしくなったり、一度作った環境を作り直したくなった場合

cd /etc/k0s
k0sctl reset

Discussion