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. #task
— Ben Thomasson (@benthomasson) 2018年8月23日
shell: ls /
register: output#python
print(output)
そこで、色々試して観た結果を書いていきたいと思います :)
1. Pythonのコードが実行できるかの確認
ここでは、Ansibleで実行した結果をPythonコードに持っていけるか確認してみます。
Ansibleで shellモジュール
を使って echo
結果をregister変数に入れてPythonで表示してみます。
想定通り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
これは、使い方次第ではかなり便利になりそうです :)
3. 出来ないパターン
3-1. register以外
registerで格納した変数以外は、今の所Pythonコードに引き継げないようです。
やはり一度registerに入れる必要があります。
3-2. pythonの変数はAnsible側へ引き継げるか
Pythonコードに msg
変数を定義してAnsibleの debugモジュール
で表示してみます。
これも出来ません。
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