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 件のコメント:
コメントを投稿