本記事は Ansible Advent Calendar 2021 , Ansible Advent Calendar 2021 – Qiita の4日目のものになります。
AAP 2.0の Automation Controller からPlaybookの実行環境は Execution Environment(以降、EE)へ移行しました。
また、インスタンスグループのコンテナグループ(OpenShiftやk8sと連携)がフルサポートとなりました。(AAP 1.2/Ansible Tower 3.6.0〜ではテックプレビューだった)
旧Ansible Towerでもテックプレビュー状態でk8sと連携は出来ましたが、改めてここではAnsible Automation Platform 2.1(以降、AAP 2.1)とk8sを連携させてk8sのクラスタ上でEEをデプロイしPlaybookを実行する方法について紹介します。
環境情報
AAP 2.1ノード
項目 | 内容 |
---|---|
OS | RHEL 8.4 |
AAP | 2.1 |
kindノード
項目 | 内容 |
---|---|
OS | Fedora 35 |
podman | 3.4.2 |
kind | 0.11.1 |
kindest/node | v1.21.1 |
RHEL8 + podmanではうまくkindが動かなかったのでFedoraで構築しています。
AAP 2.1 セットアップ
AAP 2.1をインストールしてログインします。
Red Hatアカウントの準備
AAP 2.1をインストールして使うにはRed Hatアカウントとサブスクリプションが必要です。
個人の検証用途であればRed Hat Developer Programをご利用ください。
https://t.co/E2OA767vib
Red Hat Developer ProgramにAnsible Platformが追加されてた。開発用途限定だけどevalいらなくなったのいいな。— Kazuo Moriwaka (@moriwaka) December 14, 2020
ダウンロード
以下から Ansible Automation Platform 2.1.0 Setup
をダウンロードします。
インストール
ダウンロードしたアーカイブを解凍します。
1 2 |
# tar zxvf ansible-automation-platform-setup-2.1.0-1.tar.gz |
ここでは、AAP2.1の最小限の機能のみインストールするので inventory
ファイルにある以下のパスワード部分の変更とAAPでサポートしているEEを registry.redhat.io
からダウンロードするためのアカウントを設定します。
Kubernetesで動作させる場合は、これとは別にKubernetes環境にもアカウントの登録が必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cd ansible-automation-platform-setup-2.1.0-1 # vi inventory (snip) [all:vars] admin_password='設定するTower管理者パスワード' (snip) pg_database='awx' pg_username='awx' pg_password='設定するDBパスワード' (snip) registry_url='registry.redhat.io' registry_username='アカウント名' # Red Hatアカウント registry_password='パスワード' # 上記のパスワード |
setup.sh
を実行します。
1 2 |
# ./setup.sh |
他の詳細については以下のAAP 2.1のインストールガイドを参照ください。
サブスクリプション登録
インストールしたAAPにWebブラウザでアクセスしてログインします。
ログイン後にサブスクリプションが求められるので、Red Hatアカウントの情報を入力し サブスクリプションの取得
をクリックします。
表示されたサブスクリプションをクリックして 選択
をクリックしてます。
サブスクリプションを選択したら 次へ
をクリックします。
ユーザーアナリティクス
と Insights for Ansible Automation Platform
を確認して 次へ
をクリックします。
使用許諾契約書
を確認して 送信
をクリックします。
AAP 2.1のダッシュボードにリダイレクトされることを確認します。
kind セットアップ
kubernetes環境はkindを使用して構築します。
また、コンテナエンジンはpodmanを使用します。
kindインストール
kindをインストールします。
1 2 3 4 |
# curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64 # chmod +x ./kind # mv kind /usr/local/bin/ |
kubectlインストール
kubectlをインストールします。
1 2 3 4 |
# curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" # chmod +x kubectl # mv kubectl /usr/local/bin/ |
podmanインストール
podmanをインストールします。
1 2 3 4 |
# dnf install -y podman # podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
クラスタの作成
kindを使用してkubernetesクラスタ環境を構築します。
クラスタ環境を作成するためのファイルを作成します。
1 2 |
# vi cluster.yml |
1 2 3 4 5 6 7 8 |
--- kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker |
クラスタを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# kind create cluster --config cluster.yml --image docker.io/kindest/node:v1.21.1 enabling experimental podman provider Creating cluster "kind" ... ✓ Ensuring node image (docker.io/kindest/node:v1.21.1) 🖼 ✓ Preparing nodes 📦 📦 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 ✓ Joining worker nodes 🚜 Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂 |
podの情報が取得できるか確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-558bd4d5db-9pw77 1/1 Running 0 41s kube-system coredns-558bd4d5db-n9rcc 1/1 Running 0 41s kube-system etcd-kind-control-plane 1/1 Running 0 55s kube-system kindnet-c2hfl 1/1 Running 0 24s kube-system kindnet-h8fdr 1/1 Running 0 41s kube-system kindnet-r4z72 1/1 Running 0 24s kube-system kube-apiserver-kind-control-plane 1/1 Running 0 55s kube-system kube-controller-manager-kind-control-plane 1/1 Running 0 55s kube-system kube-proxy-6jjxh 1/1 Running 0 24s kube-system kube-proxy-6wvvt 1/1 Running 0 24s kube-system kube-proxy-fmlsx 1/1 Running 0 41s kube-system kube-scheduler-kind-control-plane 1/1 Running 0 55s local-path-storage local-path-provisioner-85494db59d-4sd8r 1/1 Running 0 41s |
EEを動かすネームスペースとアカウントを追加
EEを動かすネームスペース(ここではawx)とAAPとKubernetesのAPI連携をするアカウントを追加するために以下のマニフェストを作成します。
1 2 |
# vi aap.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
--- apiVersion: v1 kind: Namespace metadata: name: awx --- apiVersion: v1 kind: ServiceAccount metadata: name: awx namespace: awx --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-manager namespace: awx rules: - apiGroups: - '*' resources: - pods verbs: - get - list - watch - create - update - patch - delete - apiGroups: - '*' resources: - pods/exec verbs: - create - apiGroups: - '*' resources: - pods/log verbs: - get - apiGroups: - '*' resources: - pods/attach verbs: - create - apiGroups: - '*' resources: - secrets verbs: - get - create - delete --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: awx-pod-manager namespace: awx subjects: - kind: ServiceAccount name: awx roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pod-manager |
追加します。
1 2 3 4 5 6 7 |
# kubectl apply -f aap.yml namespace/awx created serviceaccount/awx created role.rbac.authorization.k8s.io/pod-manager created Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding rolebinding.rbac.authorization.k8s.io/awx-pod-manager created |
AAPに登録するためのトークンと証明書情報の取得
以下のコマンドを実行してKubernetes連携に必要なトークンと証明書情報を取得します。
1 2 3 4 5 |
# NAMESPACE=awx # SECRET_NAME=$(kubectl -n $NAMESPACE get sa awx -o json | jq -r '.secrets[0].name') # kubectl -n $NAMESPACE get secret $SECRET_NAME -o json | jq -r '.data["token"] | @base64d' # The token # kubectl -n $NAMESPACE get secret $SECRET_NAME -o json | jq -r '.data["ca.crt"] | @base64d' # The CA data |
取得した情報はAAPの認証情報に登録するので、どこかにメモしてください。
トークンの動作確認
取得したTokenで認証ができるか確認します。
APIへアクセスするための kind-control-plane
のアドレスを確認します。
1 2 3 |
# podman inspect kind-control-plane -f "{{ .NetworkSettings.Networks.kind.IPAddress }}" 10.89.0.4 |
以下の [Tokenに置き換える]
部分を置き換えてcurlコマンドを実行します。
1 2 3 4 5 6 7 8 9 10 |
# curl -X GET https://10.89.0.4:6443/api/v1/namespaces/awx/pods --insecure --header "Authorization: Bearer [Tokenに置き換える]" { "kind": "PodList", "apiVersion": "v1", "metadata": { "resourceVersion": "3115" }, "items": [] } |
上記のようにレスポンスが返ってくれば問題ありません。
Workerにレジストリ情報を追加
registry.redhat.io
からEEをプルできるようにレジストリと認証情報を以下の手順で加えます。
ファイルを修正するための vim
をインストールします。
1 2 3 |
# podman exec kind-worker apt update # podman exec kind-worker apt install -y vim |
以下の registry.redhat.io
のレジストリとアカウント情報をファイルの最後に追加します。
1 2 3 4 5 6 7 8 |
# podman exec -it kind-worker vi /etc/containerd/config.toml (snip) [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.redhat.io".auth] username = "アカウント名" password = "パスワード" |
設定を反映させるためにコンテナを再起動します。
1 2 |
# podman stop kind-worker && podman start kind-worker |
register.redhat.io
からEEがプルできるか以下のコマンドを実行して確認します。
1 2 3 |
# podman exec kind-worker crictl pull registry.redhat.io/ansible-automation-platform-20-early-access/ee-supported-rhel8:2.0.0 Image is up to date for sha256:85ca2003a842067e77d91c4775f9c2a15e5ee741bcd13ee88927d3cc8a2c52ff |
問題なくダウンロード出来た場合は、他のWorkerにも同じ設定を追加してください。
SSHポートフォワード設定
kindで作成したkubernetes環境のAPI Endpointへ外部からアクセスするにはポートフォワーディングなどの設定が必要です。
ここではSSHを使ったポートフォワーディングの設定を使用します。
1 2 |
# ssh -L 192.168.10.81:6443:10.89.0.4:6443 192.168.10.81 |
上記を実行した後に外部ホストから Tokenの動作確認
で実行したコマンドを再実行し問題ないことを確認します。
これでkind側の準備は整いました。
AAP設定
EEをk8sにデプロイしてplaybookを実行します。
認証情報追加
認証情報
へ移動して 追加
をクリックします。
以下の情報を入力して 保存
をクリックします。
- 認証タイプは
OpenShift または Kubernetes API Bearer トークン
を選択する - OpenShift または Kubernetes API エンドポイント はSSHのポートフォワードで設定したアドレスを入力する
- API 認証ベアラートークンはcurlで取得したTokenを入力する
- 認証局データはcurlで取得したCAデータを入力する
- オレオレ証明書のため
SSL の検証
チェックは外している
インスタンスグループ追加
インスタンスグループ
の 追加
をクリックし コンテナーグループの追加
を選択します。
以下の情報を入力して 保存
をクリックします。
- 認証情報は
認証情報追加
で登録したものを選択する - Podをデプロイするネームスペース(ここではawx)を指定するため、Pod使用のカスタマイズのチェックを入れる
- カスタムPod仕様に設定を入力する
1 2 3 4 5 |
apiVersion: v1 kind: Pod metadata: namespace: awx |
組織追加
組織と作成したインスタンスグループを紐付けます。
組織
を選択して 追加
をクリックします。
以下の情報を入力して 保存
をクリックします。
- インスタンスグループで作成したkindのインスタンスグループを選択する
プロジェクト追加
プロジェクト
を選択して 追加
をクリックします。
以下の情報を入力して 保存
をクリックします。
- 組織に作成したKind組織を選択する
- 後は環境に合った
ソースコントロール認証情報タイプ
を選択し必要な情報を入力する
テンプレート追加
テンプレート
を選択して 追加
をクリックします。
以下の情報を入力して 保存
をクリックします。
- プロジェクトに作成したkindのプロジェクトを選択する
- 必要に応じて実行するPlaybookを選択する
テンプレート実行
テンプレートを実行するとEEがk8sのクラスタ上で動作しPlaybookが実行されます。
実行が完了すれば自動的に削除されます。
最後に
今回はAAPとk8sとの連携の方法について紹介しました。
興味がある方は是非動かしてみてください 🙂
Happy Automation!