Jupyter Ansible Kernelを使う事でJupyter notebookのセルに直接Ansibleのインベントリーやタスク、テンプレートなどが書けて実行することができます。
色々使って試していたら開発者のBen Thomassonさんから0.8.0からPythonコードをAnsible Kernelで実行できるようになってregister変数もPythonコードに引き継げるという情報を頂きました。

Registered variables from ansible tasks show up in the python scope. #taskshell: ls /register: output#pythonprint(output)— Ben Thomasson (@benthomasson) 2018年8月23日

そこで、色々試して観た結果を書いていきたいと思います 🙂

1. Pythonのコードが実行できるかの確認

ここでは、Ansibleで実行した結果をPythonコードに持っていけるか確認してみます。
Ansibleで shellモジュール を使って echo 結果をregister変数に入れてPythonで表示してみます。

スクリーンショット 2018-09-09 17.53.03.png

想定通りpythonで表示することができました。

2. 使い方応用編

registerに入っているAnsible実行結果をPythonコードで操作できるのはとても便利そうだと思ったので、試しにAnsibleで取得したVMwareのVM情報一覧をPythonで整形しテーブルで表示してみました。

作成したnotebookファイルは以下にアップしてあります。
https://github.com/sky-joker/ansible-vmware-learning-materials/blob/master/docs/jupyter/Ansible-Kernel/example/Ansibleで取得した結果をテーブルで表示する例.ipynb

ansible_kernel_table_display_test.gif

これは、使い方次第ではかなり便利になりそうです 🙂

3. 出来ないパターン

3-1. register以外

registerで格納した変数以外は、今の所Pythonコードに引き継げないようです。

スクリーンショット 2018-09-09 17.58.51.png

やはり一度registerに入れる必要があります。

スクリーンショット 2018-09-09 18.01.40.png

3-2. pythonの変数はAnsible側へ引き継げるか

Pythonコードに msg 変数を定義してAnsibleの debugモジュール で表示してみます。

スクリーンショット 2018-09-09 18.03.43.png

これも出来ません。
register以外は現在のバージョンでは対応していないようです。
issueを確認したらバグとして報告されていました。

Python variable not accessible in a Ansible task #67

4. Python3でエラーが発生する

以下のエラーが発生する場合は Ansible Kernel 0.8.0 did not work with Python3 #65 を参照してください。

Traceback (most recent call last):
  File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/jupyter/venv/lib64/python3.6/site-packages/ansible_kernel/__main__.py", line 6, in <module>
    IPKernelApp.launch_instance(kernel_class=AnsibleKernel)
  File "/home/jupyter/venv/lib64/python3.6/site-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/home/jupyter/venv/lib64/python3.6/site-packages/ipykernel/kernelapp.py", line 483, in start
    self.kernel.start()
  File "/home/jupyter/venv/lib64/python3.6/site-packages/ipykernel/kernelbase.py", line 290, in start
    self._publish_status('starting')
  File "/home/jupyter/venv/lib64/python3.6/site-packages/ipykernel/kernelbase.py", line 327, in _publish_status
    ident=self._topic('status'),
  File "/home/jupyter/venv/lib64/python3.6/site-packages/jupyter_client/session.py", line 748, in send
    stream.send_multipart(to_send, copy=copy)
  File "/home/jupyter/venv/lib64/python3.6/site-packages/ansible_kernel/kernel.py", line 68, in send_multipart
    result = channel.send_multipart(msg, *args, **kwargs)
  File "/home/jupyter/venv/lib64/python3.6/site-packages/ansible_kernel/kernel.py", line 1173, in send_multipart
    if msg0.startswith("comm"):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str
bannerAds