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]