🛠️

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

2024/01/31に公開

この記事の背景(雑談)

2024年現在、インフラ界隈ではコンテナやサーバレスが盛り上がっている。今宵はYAMLでシステム定義してデプロイする時代。そんなご時世の中、若干周回遅れ(?)のAnsible AWXを試そうかと考えた人たちに向けて記事を書きたいと思った。(自身の備忘も兼ねている)

筆者もESXiやKVMなどで沢山の仮想マシンを生成していた頃は「Ansibleをガシガシ書いてシステム構築を自動化してやる!」という熱いモチベーションを持っていた。しかし、Kubernetesを使ったGitOps環境を触ってからはシステム構築はGit上のYAMLを宣言すればよく、わざわざ構築作業を1から10まで順々に宣言しないと使えないシェルスクリプト的なAnsibleのコードを書くのは億劫になってしまった。(とはいえkubernetesを動かすためのLinuxサーバが必要なので中々Ansibleは捨てられない。)

そんな完全には捨てられないAnsibleを使う日々の中で、CLI版のansible-playbookではなくWeb GUI版のAWXに移行したら、Git上に置いてあるPlaybookを実行する運用が楽になるのではと考える。そこでAWXの導入方法を調べてみたところ、なんとインストール方法はkubernetes上への展開のみサポートと書かれていた。Ansibleを最も活用したいであろうESXi/KVM世代のサーバエンジニアがAWXを使いたいと思ったらKubernetesもセットになるというのは学習コストが高すぎるような・・・。あまりKubernetesを使ったことがない人間にとってあまり現実的な選択肢ではないと思った。

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

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

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

前提環境

  • Enterprise Linux(EL)
    • 筆者はAlma Linux 9.1を使用
      • EL8系でも同手順
      • Systemdで動くLinuxならEL以外も可能なはず
    • インターネットへの接続性
      • Kubernetesで明示プロキシは面倒なので直インターネット接続できると望ましい
      • サーバエンジニアなら何も考えず透過プロキシ立てた方が楽かもしれない
    • IPアドレスをStaticにする
      • Kubernetesをインストールした後にIPを変更するのは難しい

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

Go言語のインストール

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

dnf install -y golang

k0sctlのインストール

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

go install github.com/k0sproject/k0sctl@main
export PATH=~/go/bin:$PATH
echo 'export PATH=~/go/bin:$PATH' > /etc/profile.d/golang.sh

Firewalldのdefault-zoneをtrustedに変更(実質無効化)

kubernetesを動かす上でFirewalldは邪魔なのでzoneをtrustedに変更
trusted zoneだと全通信Allowになるので実質無効
セキュリティを気にする人はチューニング頑張ってください

firewall-cmd --set-default-zone trusted

k0sctl.yamlの準備

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

  • k0sctl.yaml
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
  name: k0s-cluster
spec:
  hosts:
  - localhost:
      enabled: true
    role: controller+worker
    noTaints: true
    hooks:
      apply:
        before:
        - ln -sf /var/lib/k0s/kubelet /var/lib/
      reset:
        after:
        - unlink /var/lib/kubelet
  k0s:
    # https://github.com/k0sproject/k0s/releases
    version: 1.27.2+k0s.0
    dynamicConfig: false
    config:
      apiVersion: k0s.k0sproject.io/v1beta1
      kind: ClusterConfig
      spec:
        network:
          kubeProxy:
            mode: ipvs
        extensions:
          storage:
            type: openebs_local_storage
          helm:
            repositories:
            - name: bitnami
              url: https://charts.bitnami.com/bitnami
            - name: wikimedia
              url: https://helm-charts.wikimedia.org/stable/
            - name: awx-operator
              url: https://ansible.github.io/awx-operator/
            charts:
            - name: postgresql
              chartname: bitnami/postgresql
              # https://artifacthub.io/packages/helm/bitnami/postgresql
              version: 12.2.6
              namespace: awx
              values: |
                global:
                  storageClass: openebs-hostpath
                  postgresql:
                    auth:
                      postgresPassword: postgres
                      username: awx
                      password: awx
                      database: awx
            - name: awx-operator
              chartname: awx-operator/awx-operator
              # https://github.com/ansible/awx-operator/releases
              # https://github.com/ansible/awx/releases
              version: 1.3.0
              namespace: awx
              values: |
                AWX: 
                  enabled: true
                  spec:
                    service_type: NodePort
                    nodeport_port: 30080
                    postgres_storage_class: openebs-hostpath
                    projects_persistence: true
                    projects_storage_class: openebs-hostpath
                    projects_storage_access_mode: ReadWriteOnce
                  postgres:
                    enabled: true
                    host: 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は下記のコマンドで出てきた文字列を入力

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

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

アンインストール

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

cd /etc/k0s
k0sctl reset

サービス起動・停止・状態確認

k0sはsystemd serviceとして登録されるので、起動停止や状態確認は下記コマンド

systemctl start/stop/status k0scontroller.service

Discussion