Jupyter+Ansibleを使ったインフラ運用のための下準備

Advent Calendar、遅刻してしまったわけですが・・・

今年も、去年から引き続き国立情報学研究所さんにてJupyterとAnsibleを使ってインフラ運用をやらせていただきました。
本来、Jupyterはデータ分析のための道具として生まれたわけですが、文章＋コードの形式で、Notebookとして実行内容を記述、実行して残しておくというやり方は、データ分析以外の場面でも役に立つなあ、としみじみ感じています。そんなわけで、Jupyter+Ansible+インフラ運用なネタを。

# この記事の内容

NIIクラウド運用チームにおけるインフラ運用のコンセプトについては
[Jupyter Notebookを用いた文芸的インフラ運用のススメ](http://www.slideshare.net/nobu758/jupyter-notebook-63167604)
にて詳しく説明されているのでそちらを参照していただくとして、インフラ運用の"お手本(の一例)"Notebookとして、以下のようなNotebookを公開してみています。

- [Literate Computing for Reproducible Infrastructure - Basic Practice](https://github.com/NII-cloud-operation/Literate-computing-Basics)
- [Literate Computing for Reproducible Infrastructure - Hadoop Practice](https://github.com/NII-cloud-operation/Literate-computing-Hadoop)

イベントなどでお話ししますとみなさん割と興味を持っていただけるわけですが、意外と**インフラとJupyterが連携するところまでの環境準備がめんどくさい**感じで「軽く試してみよう」とはいかないのも事実です。

ということで、**JupyterとAnsibleをインストールした環境を準備**して、**Jupyterから操作できるようAnsibleと接続先マシンを設定**するということをStep-by-Stepで説明してみようと思います。

# Jupyter+Ansibleの準備

Jupyter環境は適当な運用サーバ上などに構築してもよいのですが、このJupyter環境には認証用の情報などが保存されることになり、共有に関してはちょっと考慮をする必要が出てきます。そこで、今回はローカルに(自分専用の)Jupyter環境を作ることにします。

Macな人はいいのですが、Windowsな自分は [Bash on Ubuntu on Windowsの闇を覗いてしまった](http://qiita.com/yacchin1205/items/8e5f6d312686a80f8af8)り、以前Dockerでの構築も紹介していたわけですが、[公式といっていたイメージが廃止されてしまう](http://qiita.com/yacchin1205/items/efaa498ca68e7c169015)憂き目にあったりしたので、おとなしくローカルにインストールした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環境を作成することができます。

1. https://github.com/yacchin1205/jupyter-for-infrastructure をクローンするかZIPダウンロードする

    ```
    PS ..> git clone https://github.com/yacchin1205/jupyter-for-infrastructure.git
    ```

2. クローンしたディレクトリで、`docker-compose up` する

    ```
    PS ..\jupyter-for-infrastructure> docker-compose up
    ```

リポジトリには `docker-compose.yml` と、 `Dockerfile` が用意してあるので、はじめて実行する場合はJupyterのイメージビルド処理が走ります。時間がかかるのでしばらくお待ちください。

## Jupyter環境へのアクセス

特にエラーなど起きずJupyterが起動したら、ブラウザで、 `http://localhost:8888` を開いてください。これで、Ansibleが入ったJupyter環境を利用することができます。

![jupyter-web.png](https://qiita-image-store.s3.amazonaws.com/0/28770/ff514e77-f8db-0379-4807-45794772862e.png)


このJupyter環境に何がインストールされているかは、[jupyter/Dockerfile](https://github.com/yacchin1205/jupyter-for-infrastructure/blob/master/jupyter/Dockerfile) を見てもらえればわかります。だいたい以下のような感じです。

- Python 2.7
- Jupyter
- pandas, matplotlibなどデータ処理用ライブラリ
- Ansible
- 自分がよく使うExtension
- 自分用カスタムCSS ... フォントなど

なお、Ansibleが2.2段階で[Tech preview of Python 3 support](http://docs.ansible.com/ansible/python_3_support.html) ということで、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環境にアップロードして実行してみてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/d3b26456-d985-373d-0361-58b6d09e7a28.png)

なお、以下のような章立てになっています。

1. Inventoryの準備
2. ホストキーの登録
3. キーペアの準備
4. 動作確認

ToC(Table of Contents) Extensionなどもインストール済みですので、ツールバーのToCボタンを押すと、目次を見ながら進めることができます。

![jupyter-toc.png](https://qiita-image-store.s3.amazonaws.com/0/28770/359c8172-6985-2ada-be4f-97e4babf223a.png)

そういえば、いつの間にか、選択中のセル位置に対応する目次がハイライトされるようになっていてアツいですね。

# まとめ

Jupyter全体を見た場合はインフラ向きではない部分が多少ありつつも、Jupyterを使って文芸的な運用をすることで、ちゃんと運用に「説明を残す」癖がつきつつあるかなあという感じがあります。

そんなわけで、
Happy Literate Computing for Reproducible Infrastructure(長い)!