【小ネタ】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を使用する旨の記載もありました。

Ubuntu 16.04 LTSの新機能

対処方法

調べてみるとAnsible2.2より、Python3がテクニカルプレビュー機能としてサポートされており、
ある一文を入れることでPython3が使用されているUbuntu16.04でもプレイブックが実行出来ました。

Python 3 Support

私の環境は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