2022年1月15日土曜日

Ansible AWXをMinikube環境にインストールする

Ansible AWXは、AnsibleのPlaybookをGUIで管理・実行するためのOSS製品となる。商用版はRed Hat Ansible Towerであり、管理対象のホスト数に応じたサブスクリプションが必要となるが、AWXは無償で利用が可能となる。

AWXはいわゆるジョブマネージャーのような機能を備えており、Playbookを決められた時間にスケジュール実行することや、複数のPlaybookの前後関係を定義したうえで順番に実行させることができる。

ただし、Ansible AWXは単純にインストールして使うことができず、Kubernetes環境のコンテナとして実行させる必要があり、インストールするハードルが少し高くなっている。実際、私はKubernetes初心者ということもあり、AWXのインストール成功までの道のりは平坦ではなかった

本記事では、実際に私の環境にてAWXを導入した際の手順をもとにして、Ansible AWXをMinikubeによるKubernetes環境にインストールする手順を記載する。

環境

今回は仮想マシンでAlmaLinuxを用意した。確保したリソースは以下の通り。メモリを4GBにした場合、メモリ不足によりAWXの展開に失敗するので最低6GBは用意しよう。ディスクは10GB程度あれば問題なさそうだが、余裕をもって60GBとした。

  • CPU : 4コア
  • メモリ : 6GB
  • ディスク : 60GB

その他、導入するソフトウェアのバージョンは以下の通りとなる。

  • AlmaLinux : 8.5
  • Docker : 20.10.12
  • Minikube : 1.24.0
  • AWX Operator : 0.15.0
  • AWX : 19.5.0

また、検証目的なので、firewalldとSELinuxは停止しておく。

# systemctl stop firewalld
# systemctl disable firewalld

# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
# reboot

Docker CEインストール

MinikubeによるKubernetes環境を利用する際にDockerが必要となるため、まずはDockerをインストールする。Dockerのインストールは以下記事に記載している。

本記事でも簡単にインストール手順を記載する。

1. Dockerをインストール

Docker CEは、リポジトリ追加をすることでdnfコマンドを用いてインストールできる。

# dnf install yum-utils -y
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io -y

# systemctl start docker
# systemctl enable docker

2. (プロキシ環境の場合) Dockerのプロキシ設定

プロキシ環境の場合は、プロキシ経由でインターネットとの通信ができるよう、/usr/lib/systemd/system/docker.serviceに環境変数の設定を追加する。

以下sedによる設定例となる。プロキシサーバのIPアドレスやポート番号は環境に合わせて修正すること。

# sed -ie '/\[Service\]/a Environment="http_proxy=http://192.168.33.23:8080" "https_proxy=http://192.168.33.23:8080" "no_proxy=192.168.0.0/16"' /usr/lib/systemd/system/docker.service

上記設定後、Dockerを再起動しておこう。

# systemctl restart docker
# systemctl enable docker

Minikubeインストール

1. Minikubeのrpmパッケージのダウンロードとインストール

Minikubeのインストールはrpmをダウンロードしてインストールするだけで完了する。私の環境では特に依存関係による失敗もなくあっさりと完了した。なお、Minukubeのrpmの容量は15MB程度となる。

# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
# rpm -Uvh minikube-latest.x86_64.rpm

2. kubectlのコマンド作成

Kubenetes環境に対する各種操作に用いられるkubectlコマンドはMinikubeではminikube kubectl --というコマンド体系となっている。

以下のようにエイリアスを組むことで、Minikube環境でもkubectlを利用することができる。

# alias kubectl="minikube kubectl --"

ただし、エイリアスだけではAWXをインストールする際にkubectlコマンドが使えないことによるエラーが発生する。そのため、以下の通りkubectlコマンドを/usr/local/binに作成することで回避する。

# cat << 'EOF' > /usr/local/bin/kubectl
#!/bin/bash
args="$@"
minikube kubectl -- $args
EOF

# chmod 755 /usr/local/bin/kubectl

3. Minikube実行用ユーザ作成

Minikubeはroot権限で起動させると以下のようなエラーが発生する。

X Exiting due to DRV_AS_ROOT: 「docker」ドライバーは root 権限で使用すべきではありません。

そこで、Minikube実行用のユーザを作成しておく。今回はansibleというユーザを作成し、Dockerを操作できるようdockerグループに所属させる。

# useradd ansible
# usermod -aG docker ansible

4. Minikube起動

それではMinikubeを起動させてみよう。起動はminikube start --driver=dockerにて行う。

# su - ansible
$ minikube start --driver=docker
* Almalinux 8.5 上の minikube v1.24.0
* ユーザーの設定に基づいて docker ドライバーを使用します
* コントロールプレーンのノード minikube を minikube 上で起動しています
* イメージを Pull しています...
* Kubernetes v1.22.3 のダウンロードの準備をしています
    > preloaded-images-k8s-v13-v1...: 501.73 MiB / 501.73 MiB  100.00% 63.56 Mi
    > gcr.io/k8s-minikube/kicbase: 355.77 MiB / 355.78 MiB  100.00% 11.13 MiB p
* docker container (CPUs=2, Memory=2200MB) を作成しています...
* ネットワーク オプションが見つかりました
  - http_proxy=http://192.168.33.23:8080
! プロキシーを使用しようとしていますが、minikube の IP (192.168.49.2) が NO_PROXY 環境変数に含まれていません。
* Please see https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/ for more details
  - https_proxy=http://192.168.33.23:8080
  - no_proxy=192.168.0.0/16
! この container は https://k8s.gcr.io アクセスにおける問題があります
* 外部イメージを取得するためには、プロキシーを設定する必要があるかも知れません: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* Docker 20.10.8 で Kubernetes v1.22.3 を準備しています...
  - env HTTP_PROXY=http://192.168.33.23:8080
  - env HTTPS_PROXY=http://192.168.33.23:8080
  - env NO_PROXY=192.168.0.0/16
  - 証明書と鍵を作成しています...
  - Control Plane を起動しています...
  - RBAC のルールを設定中です...
* Kubernetes コンポーネントを検証しています...
  - イメージ gcr.io/k8s-minikube/storage-provisioner:v5 を使用しています
* 有効なアドオン: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* 完了しました! kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました

問題なくMinikubeが起動している場合は、以下のようにminikubeのノードが作成され、各種MinikubeのコンポーネントとなるPodがRunningステータスで起動する。

$ minikube kubectl -- get nodes
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   8s    v1.22.3
$ minikube kubectl -- get pods -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS      AGE
kube-system   coredns-78fcd69978-ldbmj           1/1     Running   0             90s
kube-system   etcd-minikube                      1/1     Running   0             102s
kube-system   kube-apiserver-minikube            1/1     Running   0             104s
kube-system   kube-controller-manager-minikube   1/1     Running   0             102s
kube-system   kube-proxy-lpxjq                   1/1     Running   0             90s
kube-system   kube-scheduler-minikube            1/1     Running   0             104s
kube-system   storage-provisioner                1/1     Running   1 (59s ago)   101s

参考情報として、Minikubeのコンポーネントは以下となる。

Pod名称 役割
coredns Minikubeで用いられるDNSサーバ。
etcd-minikube Kubernetesの構成情報を保存するキーバリューストア。
kube-apiserver-minikube APIサーバ。Kubernetes APIを外部に提供。
kube-controller-manager-minikube Kubernetesのコントローラコンポーネント。
kube-proxy-55ksb Nodeのネットワークプロキシ。
kube-scheduler-minikube スケジューラ。Podの配置状況の監視と実行。
storage-provisioner Minikubeで用いられるストレージ管理コントローラ。

AWXインストール

1. gitにてAWX Operatorのソースを入手

AWXのインストールを行う際は、AWX Operatorと呼ばれるAWXインストールツールを用いる。

AWX Operatorのソースはgitにて入手する。もしgitのパッケージがインストールされていない場合はインストールしておこう。また、後ほどmakeコマンドも必要となるため併せてインストールすること。

# dnf install make git -y

gitをインストールしたら、一般ユーザに切り替えてAWX Operatorのソース入手する。

$ su - ansible
$ git clone https://github.com/ansible/awx-operator.git

次に、git checkoutにてAWX Operatorのバージョンを切り替える。この作業を忘れるとインストールに失敗するので注意しよう。2022年1月現在、AWX Operatorの最新バージョンは0.15.0となる。

$ cd awx-operator/
$ git checkout 0.15.0
Note: switching to '0.15.0'.

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 d74b5ba Delete RELATED_ variables from upstream deployment

2. AWXをMinikubeに展開する前の準備

AWXをMinikubeに展開する前の準備としてmake deployを行う。特にエラーがなければ問題ない。

$ export NAMESPACE=my-namespace
$ make deploy
namespace/my-namespace created
customresourcedefinition.apiextensions.k8s.io/awxbackups.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

3. MinikubeにPodを展開

gitで入手したAWXのソースに含まれるマニフェストであるawx-demo.ymlを用いて、AWXのPodをMinikubeに展開する。

# kubectl config set-context --current --namespace=$NAMESPACE
# kubectl apply -f awx-demo.yml

展開の進行状況は以下コマンドで確認できる。大量のログが表示されるが、最終的にfailed=0と表示されていれば成功となる。環境にもよるが、AWXの展開は5分程度で完了する。

$ kubectl logs -f deployments/awx-operator-controller-manager -c awx-manager

~(中略)~

----- Ansible Task Status Event StdOut (awx.ansible.com/v1beta1, Kind=AWX, awx-demo/my-namespace) -----


PLAY RECAP *********************************************************************
localhost                  : ok=61   changed=0    unreachable=0    failed=0    skipped=44   rescued=0    ignored=0

なお、メモリが不足する場合、いつまでもAWXの展開が完了せず成功しない。私の環境では、メモリ4GBの場合は展開に失敗し、メモリ6GBであれば成功することを確認している。

4. AWXの起動確認

AWX展開後の状態を確認してみよう。以下のような状態でPodがRunningで実行状態となっており、Serviceが存在していれば問題ない。

$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME                        READY   STATUS    RESTARTS   AGE
awx-demo-786447d7bc-zd2w7   4/4     Running   0          16m
awx-demo-postgres-0         1/1     Running   0          16m
$ kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
awx-demo-postgres   ClusterIP   None             <none>        5432/TCP       16m
awx-demo-service    NodePort    10.102.136.124   <none>        80:31851/TCP   16m

なお、AWXの管理者パスワードは以下コマンドで入手できる。この後、AWXの画面にログインする際に必要となるので確認しておこう。

$ kubectl get secret awx-demo-admin-password -o jsonpath="{.data.password}" | base64 --decode ; echo -ne '\n'
vPByNYYgvyOj4SpXX1qcMFRZZK61RHwK

5. AWXのServiceに対してポートフォワード設定

展開したAWXは、そのままでは別サーバのブラウザからアクセスすることができない。

本来はきちんと外部からアクセスできるようMinikubeのネットワーク設定が必要となるが、今回は検証目的なので、手っ取り早くポートフォワードすることでアクセスできるよう設定する。

ポートフォワードは以下の通り設定する。今回はMinikubeをインストールしたサーバの8000番ポートをAWXの80ポートにポートフォワードするよう設定した。

# kubectl port-forward svc/awx-demo-service --address 0.0.0.0 8000:80

なお、ポートフォワード設定はフォアグラウンドで実行され、Ctrl+Cで停止するとポートフォワードも停止する。もしバックグラウンド実行したい場合は、以下のように実行するとよいだろう。

バックグラウンド実行する場合
# kubectl port-forward svc/awx-demo-service --address 0.0.0.0 8000:80 > /dev/null 2>&1 &

ポートフォワードを停止する場合
$ fg
kubectl port-forward svc/awx-demo-service --address 0.0.0.0 8000:80

Handling connection for 8000
Handling connection for 8000
^C ←★Ctrl+C

6. ブラウザからAWXへの接続確認

それでは実際にブラウザからAWXいアクセスしてみよう。ポートフォワードしているため、http://[MinikubeをインストールしたサーバのIPアドレス]:8000でアクセス可能となっているはずだ。

ログインユーザはadmin、パスワードは事前に確認したパスワードを使うことでログインすることができる。

以上でMinukube環境にAWXをインストールする手順は完了となる。次は具体的にAWXを使ってPlaybookを実行する手順について記載したい。

参考

0 件のコメント:

コメントを投稿

人気の投稿