Ubuntu 18に対してPacker + Ansibleを実行すると/usr/bin/pythonが見つからない問題への対処

Ubuntu 18に対してPacker + Ansibleを実行すると/usr/bin/pythonが見つからない問題への対処
目次

今までCentOSや派生のAmazonLinux2を使うことが多かったです。AMIをコード化するにあたり Packer やプロビジョナーの Ansible もそれらのOSに対応するよう書いていたのですが、Ubuntuに適用した時に従来の書き方だとエラーになってしまったので、その備忘録として残しておきます。

Ubuntu 18へAnsibleを実行するとPythonが見つからない問題

まさにこれに尽きるのですが、Packerのテンプレートファイルで ansible プロビジョナーを使う設定を以下にように書いたとします。

 1"provisioners": [
 2  {
 3    "type": "ansible",
 4    "playbook_file": "ansible/playbook-{{user `provision_target`}}.yml",
 5    "ssh_host_key_file": "{{user `aws_key_file`}}",
 6    "user": "ec2-user",
 7    "ansible_env_vars": [
 8      "ANSIBLE_HOST_KEY_CHECKING=False"
 9    ]
10  }
11]

これはCentOS7以前やAmazomLinux2以前では問題なくプロビジョニングが開始されました。 しかし、Ubuntuに対して実行した際には以下のエラーが表示されました。

1/usr/bin/python: No such file or directory

そのまんまですが、/usr/bin/python が見当たらないと申しております。

/usr/bin/python3を使うように指定する

実は最近のUbuntuでは /usr/bin/python3 がデフォルトでインストールされており、 /usr/bin/python が存在しません。 Ansibleはデフォルトで /usr/bin/python を使いにいくのでエラーになってしまうのです。

そのため、Ansibleの --extra-vars オプションを使います。 ansible_python_interpreter=/usr/bin/python3 と指定することにより Ansible実行時に使うPythonのパスを切り替えることができるのです。

 1"provisioners": [
 2  {
 3    "type": "ansible",
 4    "playbook_file": "ansible/playbook-{{user `provision_target`}}.yml",
 5    "ssh_host_key_file": "{{user `aws_key_file`}}",
 6    "user": "{{user `aws_ssh_user`}}",
 7    "ansible_env_vars": [
 8      "ANSIBLE_HOST_KEY_CHECKING=False"
 9    ],
10    "extra_arguments": [
11      "--extra-vars",
12      "ansible_python_interpreter=/usr/bin/python3"
13    ]
14  }
15]