OpenShiftをAnsible uriモジュールで操作する

『IT自動化の力でビジネス加速を全ての企業に』

”IT自動化の専門会社”、リアルグローブ・オートメーティッド(RGA)の技術ブログ編集部の馬塚です。本日もRGAの技師がまとめた技術情報を読者の皆様にお届けしていきます!

唐突ですが、コンテナ技術を使うと、「アプリケーションごとに環境を分離することができる」ため、システム間の依存関係やリソースの競合が発生しなくなり、より効率的で機動的なシステム運用が可能となります。さらに、コンテナは各種のOSやオンプレミス、そしてもちろんパブリッククラウド上でも実行可能なため、実行する場所がどこであっても同じコンテナイメージを利用できる、という大きなメリットもあります。

RGAから発信する技術ブログの第2回目となる今回は、コンテナ技術と深く関わりのあるオーケストレーションツールで、Kubernetes自体の管理ができ、且つ、サポート付きでkubernetesを利用できる『OpenShift』に関連した技術情報をご提供いたします!

―――――――――――――――――

OpenShiftをAnsible uriモジュールで操作する

概要

構成管理ツールAnsibleでOpenShiftのリソースを操作したい時は、まずはAnsibleのk8sモジュールで対応できないか確認しましょう。殆どの操作はこのモジュールで実行することができます。
しかし、まれにk8sモジュールが対応していない操作を行いたい場合があります。そういった時には、OpenShift APIを直接叩いてしまえばどんな操作でも(OpenShift側が対応していれば)実行することができます。

AnsibleからAPIを叩く方法は色々ありますが、今回はuriモジュールを使う手軽な方法をご紹介します。
コンテナログの取得はk8sモジュールでは実現できない操作なので、今回はこれをuriモジュールで実現してみます。

《注記》現在のAnsibleの最新版であるAnsible2.9に同梱されているkubernetesコレクションにはコンテナログを取得する機能はありません。しかし、現在開発中のバージョンでは新たにコンテナログを取得するモジュール k8s_log が追加されています。
https://github.com/ansible-collections/community.kubernetes
今後新たにリリースされるAnsibleではこのモジュールが追加されている可能性が高いため、コンテナログを取得したいのであればこちらのk8s_logモジュールを使うのがおすすめです。
また、Ansible2.9の場合でも、https://galaxy.ansible.com/community/kubernetes から新しいkubernetesコレクションをインストールすれば、k8s_logモジュールを使用することができます。

準備

OpenShiftクラスタにログインした後、次のコマンドでAPIエンドポイントとアクセストークンを取得しておきます。

$ OPENSHIFT_API=$(oc whoami --show-server)
$ OPENSHIFT_TOKEN=$(oc whoami --show-token)

cURLで動作確認

uriモジュールを使用する前に、まずcurlコマンドで動作確認してみましょう。
OpenShiftのREST APIは以下のページで確認できます。
https://docs.openshift.com/container-platform/4.4/rest_api/index.html
※バージョン部分は適宜読み替えてください。

ちなみにKubernetesの場合はこちらです。
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/

まずは namespaceの一覧を取得してみます。

$ curl -H "Authorization: Bearer $OPENSHIFT_TOKEN" "$OPENSHIFT_API/api/v1/namespaces" --insecure | jq '.items[].metadata.name'

以下のように取得できました。

"default"
"kube-node-lease"
"kube-public"
"kube-system"
"openshift"
"openshift-apiserver"
...

続いて、特定のnamespace(今回はopenshift-console)のpod一覧を取得します。

$ curl -H "Authorization: Bearer $OPENSHIFT_TOKEN" "$OPENSHIFT_API/api/v1/namespaces/openshift-console/pods" --insecure | jq '.items[].metadata.name'

以下のように取得できました。

"console-94dfb7544-54nhf"
"downloads-7b89486f6b-r5n67"

今回は上記のpod(console-94dfb7544-54nhf)のlogを確認します。

$ curl -H "Authorization: Bearer $OPENSHIFT_TOKEN" "$OPENSHIFT_API/api/v1/namespaces/openshift-console/pods/console-94dfb7544-54nhf/log" --insecure
2020/06/9 23:12:02 cmd/main: cookies are secure!
2020/06/9 23:12:03 cmd/main: Binding to 0.0.0.0:8443...
2020/06/9 23:12:03 cmd/main: using TLS
(一部略)
2020/06/10 00:40:53 auth: oauth success, redirecting to: "https://console-openshift-console-2886795287-443-host03nc.environments.katacoda.com/"

uriモジュールでOpenShift APIを叩く

それでは今回の目的であるuriモジュールで実行するため、下記のPlaybookを作成します。

【sample.yml】

---
- hosts: localhost
 gather_facts: false
 connection: local
 vars:
   openshift_api: "<OPENSHIFT_URL>"
   openshift_token: "<OPENSHIFT_TOKEN>"
   namespace: "<NAMESPACE>"
   pod: "<POD>"
 tasks:
 - name: コンテナログの取得
   uri:
     url: "{{ openshift_api }}/api/v1/namespaces/{{ namespace }}/pods/{{ pod }}/log"
     validate_certs: no
     method: GET
     headers:
       Authorization: "Bearer {{ openshift_token }}"
     return_content: yes
   register: _log
 - name: ログ出力
   debug:
     var: _log

Playbookを実行してみます。

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'

PLAY [localhost] **********************************************************************************

TASK [コンテナログの取得] **********************************************************************************
ok: [localhost]

TASK [ログ出力] **********************************************************************************ok: [localhost] => {
"_log": {
"audit_id": "d5626cbf-4ca6-472c-b8d8-236c28a6d275",
"cache_control": "no-cache, private",
"changed": false,
"connection": "close",
"content": "2020/06/9 23:12:02 cmd/main: cookies are secure!\n2020/06/9 23:12:03 cmd/main: Binding to 0.0.0.0:8443...\n2020/06/9 23:12:03 cmd/main: using TLS\n(一部省略)2020/06/10 00:40:53 auth: oauth success, redirecting to: \"https://console-openshift-console-2886795287-443-host03nc.environments.katacoda.com/\"\n",
"content_type": "text/plain",
"cookies": {},
"cookies_string": "",
"date": "Wed, 10 Jun 2020 00:49:30 GMT",
"elapsed": 0,
"failed": false,
"msg": "OK (unknown bytes)",
"redirected": false,
"status": 200,
"transfer_encoding": "chunked",
"url": "https://openshift:6443/api/v1/namespaces/openshift-console/pods/console-94dfb7544-54nhf/log"
}
}

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

問題なく取得できました。

まとめ

このように、REST APIとして公開されている機能であれば、uriモジュールを利用することでOpenShift(やKubernetes)を操作することができます。
なお、今回はurlモジュールをご紹介しましたが、Ansibleは自分でモジュール作成するのも簡単なので、繰り返し行う操作であればカスタムモジュールを作っておくとさらに便利です。


執筆者:株式会社リアルグローブ・オートメーティッド技師 青島

――――――――――――――――――――――――――――――――――

執筆者プロフィール:青島 秀治
株式会社リアルグローブ・オートメーティッド 技師
九州大学大学院理学府博士課程中退。
大学院では理論天文学が専門。数値計算プログラム開発の傍ら、研究用の計算機郡や学内システムの開発・運用を経験。
2019年よりAnsibleを用いた運用作業自動化や自社サービスのKubernetes移行、OpenShiftのインフラCI実装などの業務に従事。

【ご案内】
ITシステム開発やITインフラ運用の効率化、高速化、品質向上、その他、情シス部門の働き方改革など、IT自動化導入がもたらすメリットは様々ございます。
IT業務の自動化にご興味・ご関心ございましたら、まずは一度、IT自動化の専門家リアルグローブ・オートメーティッド(RGA)にご相談ください!

お問合せは以下の窓口までお願いいたします。

【お問い合わせ窓口】
株式会社リアルグローブ・オートメーティッド
代表窓口:info@rg-automated.jp
URL:https://rg-automated.jp

画像1

(編集:馬塚勇介/校正:水谷裕一)

#IT Automation #IT自動化 #DevOps #CICD #RGA #SHIFT
#Ansible #OpenShift #コンテナ #Kubernetes #Docker