きそくただしいせいかつ

日々の生活のペースセッター

オラクルクラウドをラクに使いたい - OCI の構成情報を Python SDK で Excel に出力

この記事は Oracle Cloud Advent Calendar 2018 - Adventar の15日目です。

お分かりになるかと思いますが、タイトルはダジャレです。

ということで、今回は構成情報を Excel ファイルに落とすスクリプトを作りたいと思います。きっかけは以下の本を買ったところ、 Excel ファイルを操作する章があったことです。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
 

VCN(Virtual Cloud Network) の設定をそれなりにちゃんとやったり、一杯インスタンス作ったりすると、それらを設計書等々 Excel ファイルで管理することも多いかと思うので、それを自動化することで、ラクに使えればと思います。

AWS でも同様なことを実装されている記事を見ると、APICLI で取った情報を jq で編集する、するパターンもありますが今回は Python SDK で書いてみたいと思います。私が Python 勉強したいかったので。。。
(CLI での実装はこちらも参考にしていただけるとよいかと思います。
コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastruc... | Oracle Community)

今回は Python SDK の利用までの手順を追ってみて、サンプルスクリプトを作成してみたいと思います。私の Python のレベル感としては、以下の本に沿ってゲームを作る手前までやったぐらいなので、おかしなところがありましたらご容赦ください。

はじめるPython!  ゼロからのゲームプログラミング

はじめるPython! ゼロからのゲームプログラミング

 

Python SDK のセットアップ

Python SDK については公式のドキュメントがあるので以下に沿ってインストールします。前提として Python / pip / virtualenv のインストールが必要ですが、こちら環境によってネット上にいろいろと記事があると思いますのでそちらご参照ください。

https://oracle-cloud-infrastructure-python-sdk.readthedocs.io/en/latest/installation.html

ちなみに私は CentOS 7.5 でやっております。

まず virtualenv で今回用の仮想環境を作ります。

<code>
$ mkdir oci
$ virtualenv oci
$ source oci/bin/activate
</code>

で pip で oci パッケージをインストールします。これだけなので簡単でした。

<code>$ pip install oci</code>

あと念のために、 ssl のバージョンを確認しておきます。私の環境は OpenSSL 1.0.2k-fips だったので何もしなかったのですが、もし 1.0.1 よりも低いバージョンをお使いであれば、上記ドキュメント上にある手順でバージョンの問題をバイパスしていただければと思います。

<code>$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"</code>

Python SDK のユーザ情報の設定

次に OCI の SDK で利用するユーザの認証情報を設定し、 SDK から OCI に対する操作ができるよう、以下のドキュメントを参照しながら設定します。

https://oracle-cloud-infrastructure-python-sdk.readthedocs.io/en/latest/configuration.html

config.from_file() モジュールでは、引数に何も指定しない場合 ~/.oci/config を読み込むため、今回はこちらをそのまま作成することにします。

Configuration File のサンプルは以下にあります。

SDK and CLI Configuration File

また、 事前に API 用のユーザ (api.user) を作成し、 API 用の公開鍵を追加しておきます。以下、 OCI の CLI を使うチュートリアルにある内容を参考に実施します。

https://community.oracle.com/docs/DOC-1019624#jive_content_id_21_API_

https://community.oracle.com/docs/DOC-1019624#jive_content_id_32_API

で、~/.oci/config に以下の内容で記載します。 user や tenancy の ocid は上記のチュートリアルにも確認方法が載っていますので、そちら参照してご確認頂き、環境の内容に置き換えてください。(以下は、ドキュメントの記載をそのまま載せています。API 用の秘密鍵の場所(key_file)や region も環境に応じて変更ください。)

<code>
[DEFAULT] user=ocid1.user.oc1..aaaaaaaat5nvwcna5j6aqzjcaty5eqbb6qt2jvpkanghtgdaqedqw3rynjq
fingerprint=20:3b:97:13:55:1c:5b:0d:d3:37:d8:50:4e:c5:3a:34

key_file=~/.oci/oci_api_key.pem tenancy=ocid1.tenancy.oc1..aaaaaaaaba3pv6wkcr4jqae5f15p2b2m2yt2j6rx32uzr4h25vqstifsfdsq
region=us-ashburn-1
</code>

Python SDK のサンプルなど

Python SDK による OCI の操作については以下にサンプルが結構あります。 (他の SDK についても oraclegithub 上にサンプルがありますので、ご参照ください)

github.com

今回のやりたいことに近いサンプルは、以下の get_all_instance_ip_addresses_and_dns_info.py なので、こちらを参考に実装していきました。

oci-python-sdk/get_all_instance_ip_addresses_and_dns_info.py at master · oracle/oci-python-sdk · GitHub

また、 Excel に書き込む部分は openpyxl で実装します。 これは前述の本を参考にしていますが、 Web 上にもたくさん情報があるのでご参照いただければと思います。

今回の実装例

以下のような実装としてみました。 Python 手習い中のため、間違いなどありましたら申し訳ありません!また、エラーハンドリングもまともにやってなくて恐縮です。。

 

  • 18-23 行目 : get_config() で config ファイルを読み込み、 config ファイルに基づいて compute を操作する ComputeClient を生成しています。 get_instance_info() で instance の情報を読み込み、 create_file() でファイルを生成します。 Compute 以外を操作する場合は VirtualNetworkClient や IdentityClient を利用する必要があります。
  • 26-34 行目 : get_config() ですが、デフォルトの場所以外にも指定できるようにしてみました。
  • 37-41 行目 : compartment id を指定してもらい、インスタンスの一覧を取得します。
  • 44-68 行目 : インスタンスの一覧を記載する箇所です。取ってきたインスタンスの情報を全部書くと冗長なので、書き出したいものだけ displayitems に一覧しています。その後は、リストの要素を順次 for ループで書き出し、インスタンスの一覧を書き出していくのですが、リストのインデックスは0から始まるものの Excel の業は 1から始まるので、 +1 しています。ここ場当たり的なので、何かもっといいかき方があるかもです。。。最後にファイル名を聞いて、 .xlsx を保存します。

そうすると、以下のように Excel ファイル (開いているの LibreOffice ですが)が、作られます。 openpyxl で列幅や背景色も指定できるので、もうちょっと作り込めば、設定書を全部スクリプトで作れるようになるのかな、と思います。

f:id:k_kane:20181215114714p:plain

Excel ファイルのイメージ

最後に

今回実装した範囲ですと、正直もっとラクな方法がある気もしますが、 SDKCLI、 Terraform などを利用して自動化していくことでラクに OCI を操作できると思いますので、ぜひいろいろと試してみて頂けると幸いです。(私も、日々ラクできるところはラクしていきたいと思います!)