Ubuntu 16.04を対象にAnsibleを実行する
これまでサーバーを構築するときはUbuntu14.04を使ってきましたがそろそろ16.04にしようかなー、と思ってAnsibleを使うときにちょっとハマったのでメモ。
問題点
何も考えずにUbuntu 16.04を対象にAnsibleを走らせると
TASK [setup] ************************
fatal: [ubuntu-test]: FAILED! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "\r\n/bin/sh: 1: /usr/bin/python: not found\r\n", "msg": "MODULE FAILURE"}
このようにpythonが見つからないので失敗する。
それもそのはずで、Ubuntu 16.04ではPython3がデフォルトとなりUbuntu Server等のイメージではPython2がインストールされていない。
解決策
できれば手動でPython2をインストールするのは避けたいので、その処理自体を自動化する方法を模索する。
これについて調べると、この回答のようにgather_facts
を切ってpre_tasks
としてpython-simplejsonをインストールする方法が見つかる
- hosts: my_hosts
become_user: root
become: yes
gather_facts: no
pre_tasks:
- name: Install python-simplejson
raw: sudo apt-get -y install python-simplejson
roles:
- some_role
上記の方法により実行するtaskより先にPython2をインストールすることが出来るのだが、gather_facts
を切ったことによりansible_os_family
などの変数が使用できなくなる。
これでは困るのでPython2をインストールした後で明示的にgather_facts
を行うためsetupモジュールを呼び出す。
- hosts: my_hosts
become_user: root
become: yes
gather_facts: no
pre_tasks:
- name: Install python-simplejson
raw: sudo apt-get -y install python-simplejson
- name: Gathers facts
setup:
roles:
- some_role
これでUbuntu 16.04でも問題なくAnsibleを実行できた。
ちなみに、Ansible2.2からPython3の対応がされるようになったらしい(まだ試験段階)
Ansible2.3になれば今回の問題は意識する必要がなくなるかも…