【小ネタ】Python3がインストールされているOSにansibleを実行する
先日まで東京へ向かいまして、暑さで「いっそ、アイスクリームみたいに溶けてしまいたい」と思いました。
こんばんは、ヨシエです。
前置き
UbuntuサーバーのEC2インスタンスの作成後、Ansibleにて設定を投入しようとしてハマりましたので対処方法をメモとして残します。
何が発生したのか?
UbuntuOSインスタンスにてプレイブックの検証を行っておりました。
その際、テストインスタンスの疎通確認を行った所、以下内容の出力がありました。
% ansible -i host all -m ping test1 | FAILED! => { "changed": false, "failed": true, "module_stderr": "Shared connection to xxx.xxx.xxx.xxx closed.\r\n", "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n", "msg": "MODULE FAILURE", "rc": 0 }
pingモジュールを実行した時、私が良く遭遇したのはUNREACHBLE
でした。
今回はmsgがMODULE FAILURE
であり、実行結果が/usr/bin/python: not found/
とありました。
「pythonが見つからないとはどういうことか?」と調べてみました。
実際のインスタンスを見てみる
Ubuntu 16.04インスタンスへログインして、Pythonを確認しました。 結果は以下になります。
ubuntu@ip-xxx-xxx-xxx-xxx:~$ cat /etc/issue Ubuntu 16.04.2 LTS \n \l ubuntu@ip-xxx-xxx-xxx-xxx:~$ which python ubuntu@ip-xxx-xxx-xxx-xxx:~$ ubuntu@ip-xxx-xxx-xxx-xxx:~$ ubuntu@ip-xxx-xxx-xxx-xxx:~$ ubuntu@ip-xxx-xxx-xxx-xxx:~$ python The program 'python' can be found in the following packages: * python-minimal * python3 Try: sudo apt install ubuntu@ip-xxx-xxx-xxx-xxx:~$ python3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
どうやらUbuntu16.04ではPython3がデフォルトでインストールされていることがわかりました。
また、Ubuntu16.04 LTSの新機能としてPython3を使用する旨の記載もありました。
対処方法
調べてみるとAnsible2.2より、Python3がテクニカルプレビュー機能としてサポートされており、
ある一文を入れることでPython3が使用されているUbuntu16.04でもプレイブックが実行出来ました。
私の環境はAnsible2.1のため、以下の対応を実施しました。
- pipアップデート
- Ansibleアップデート
pipのアップデート
# pip install --upgrade pip
ansibleのアップデート
# pip install --upgrade ansible
環境更新
% python --version Python 3.5.2 % % pip --version pip 9.0.1 from /Users/yoshie.kento/.pyenv/versions/3.5.2/lib/python3.5/site-packages (python 3.5) % % ansible --version ansible 2.3.1.0 python version = 3.5.2 (default, Jul 2 2016, 14:53:41) [GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)]
Ansibleの実行
今回のように設定投入対象インスタンスにPython3のみがインストールされている場合、
-e 'ansible_python_interpreter=/usr/bin/python3'
を入れることで実行が出来ます。
% ansible -i host all -m ping -e 'ansible_python_interpreter=/usr/bin/python3'
% ansible -i host all -m ping -e 'ansible_python_interpreter=/usr/bin/python3' test1 | SUCCESS => { "changed": false, "ping": "pong" }
はい、出来ました。
プレイブック実行についても同様の文言を入れることで実行が可能になります。
% ansible-playbook -i host <プレイブック名>.yml -e 'ansible_python_interpreter=/usr/bin/python3'
最後に
Ansibleのドキュメントではあくまでテクニカルプレビュー機能としての提供と記載があります。
本機能につきましては予め同様のインスタンスを起動して頂き、Ansibleによって
設定変更後にOS挙動を確認してから実際の環境への適用が良いと思われます。
Ansibleは構築から運用まで幅広く使用できるツールのため、今後も利用していきたいと思います。
Ansibleにつきまして、弊社ブログは多くの記事が御座いますので、
合わせて他記事をお読みいただけると幸いです。
Ansible