ねむねむ

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になれば今回の問題は意識する必要がなくなるかも…


Share this:
このエントリーをはてなブックマークに追加