Advent Calendar、遅刻してしまったわけですが・・・
今年も、去年から引き続き国立情報学研究所さんにてJupyterとAnsibleを使ってインフラ運用をやらせていただきました。
本来、Jupyterはデータ分析のための道具として生まれたわけですが、文章+コードの形式で、Notebookとして実行内容を記述、実行して残しておくというやり方は、データ分析以外の場面でも役に立つなあ、としみじみ感じています。そんなわけで、Jupyter+Ansible+インフラ運用なネタを。
この記事の内容
NIIクラウド運用チームにおけるインフラ運用のコンセプトについては
Jupyter Notebookを用いた文芸的インフラ運用のススメ
にて詳しく説明されているのでそちらを参照していただくとして、インフラ運用の"お手本(の一例)"Notebookとして、以下のようなNotebookを公開してみています。
- Literate Computing for Reproducible Infrastructure - Basic Practice
- Literate Computing for Reproducible Infrastructure - Hadoop Practice
イベントなどでお話ししますとみなさん割と興味を持っていただけるわけですが、意外とインフラとJupyterが連携するところまでの環境準備がめんどくさい感じで「軽く試してみよう」とはいかないのも事実です。
ということで、JupyterとAnsibleをインストールした環境を準備して、Jupyterから操作できるようAnsibleと接続先マシンを設定するということをStep-by-Stepで説明してみようと思います。
Jupyter+Ansibleの準備
Jupyter環境は適当な運用サーバ上などに構築してもよいのですが、このJupyter環境には認証用の情報などが保存されることになり、共有に関してはちょっと考慮をする必要が出てきます。そこで、今回はローカルに(自分専用の)Jupyter環境を作ることにします。
Macな人はいいのですが、Windowsな自分は Bash on Ubuntu on Windowsの闇を覗いてしまったり、以前Dockerでの構築も紹介していたわけですが、公式といっていたイメージが廃止されてしまう憂き目にあったりしたので、おとなしくローカルにインストールしたDocker(Docker for Windows)で、スクラッチのDockerfileを用意してJupyter環境を作ることにします。
Jupyter+Ansible環境の起動
Dockerを使ってJupyter+Ansible環境を起動するためのリソースをGitHubに置きました。 https://github.com/yacchin1205/jupyter-for-infrastructure
Docker EngineとDocker Composeがインストールされている環境であれば、以下の手順でJupyter+Ansible環境を作成することができます。
-
https://github.com/yacchin1205/jupyter-for-infrastructure をクローンするかZIPダウンロードする
PS ..> git clone https://github.com/yacchin1205/jupyter-for-infrastructure.git
-
クローンしたディレクトリで、
docker-compose up
するPS ..\jupyter-for-infrastructure> docker-compose up
リポジトリには docker-compose.yml
と、 Dockerfile
が用意してあるので、はじめて実行する場合はJupyterのイメージビルド処理が走ります。時間がかかるのでしばらくお待ちください。
Jupyter環境へのアクセス
特にエラーなど起きずJupyterが起動したら、ブラウザで、 http://localhost:8888
を開いてください。これで、Ansibleが入ったJupyter環境を利用することができます。
このJupyter環境に何がインストールされているかは、jupyter/Dockerfile を見てもらえればわかります。だいたい以下のような感じです。
- Python 2.7
- Jupyter
- pandas, matplotlibなどデータ処理用ライブラリ
- Ansible
- 自分がよく使うExtension
- 自分用カスタムCSS ... フォントなど
なお、Ansibleが2.2段階でTech preview of Python 3 support ということで、Pythonは2.7を入れています。
ちなみに、社会人博士での研究でもJupyterを使っているわけですが、こんな風にDockerfileでインストールされているソフトウェアがリストされていると、自分がどうやって環境を準備したかが非常に明確になって気分が楽になります。
Notebookの管理
Notebookファイルはコンテナ中の /notebooks
ディレクトリ内に作成されますが、これはホストの (jupyter-for-infrastructureディレクトリ)\notebooks
フォルダに保存されるようにしています。インフラ管理のコードはナイーブな情報を含む場合も多いですので、データの管理には十分に気を付けましょう。
また、コンテナは localhost (127.0.0.1) でのみlistenするようにしていますが、念のため他のマシンからアクセスできないように十分気を付けてください。
Ansibleからホストへのアクセス
このJupyter環境にはすでにAnsibleがインストールされていますが、操作対象ホストを列挙したInventoryや、ホストへのアクセスのためのキーペアなどの情報は設定されていません。
Gist https://gist.github.com/yacchin1205/4108ecb4a36b45f5cfbe0c6c08c2b8f1 にホストへのSSHアクセスまでを説明したNotebookを置きましたので、起動したJupyter Notebook環境にアップロードして実行してみてください。
なお、以下のような章立てになっています。
- Inventoryの準備
- ホストキーの登録
- キーペアの準備
- 動作確認
ToC(Table of Contents) Extensionなどもインストール済みですので、ツールバーのToCボタンを押すと、目次を見ながら進めることができます。
そういえば、いつの間にか、選択中のセル位置に対応する目次がハイライトされるようになっていてアツいですね。
まとめ
Jupyter全体を見た場合はインフラ向きではない部分が多少ありつつも、Jupyterを使って文芸的な運用をすることで、ちゃんと運用に「説明を残す」癖がつきつつあるかなあという感じがあります。
そんなわけで、
Happy Literate Computing for Reproducible Infrastructure(長い)!