はじめに
Playbook 内で、Ansible Tower サーバー内の /tmp
ディレクトリ内のファイルを読み込もうとしたところ、ファイルが見つからないエラーが発生しました。
"message": "Could not find or access '/tmp/hoge/fuga.yml' on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option
この記事では、切り分けと原因について紹介します。
- 環境
- Ansible Tower 3.7.2
切り分け
手動でls コマンドなどで確認すると、たしかにファイルは存在し、awx
ユーザーにも権限はある状態でした。
コマンド版の Ansible では問題なくアクセスできていました。
切り分けのために shell
モジュールで、ls -al /tmp
を実行してみると、実際よりディレクトリやファイルが少なく見える状態でした。
ファイルシステムを隠蔽するような機能が動いているようにみえました。
原因
セキュリティ機能による現象でした。
[2020/10/28 追記] bubblewrap というものを使って実現しているそうです。情報ありがとうございます。
例えば Demo Job Template を実行中に ps -efL するとこんな感じで bwrap されているのが見えます。--bind とか --ro-bind とかです。 pic.twitter.com/o7uAENKcWv
— すぎむら (@sugitk) 2020年10月26日
具体的には「設定 / ジョブ」画面にある「ジョブの分離の有効化」(英語では Enable Job Isolation)です。
デフォルトで有効で、以下のディレクトリが対象のようです。
- /etc/tower
- /var/lib/awx
- /var/log
- /tmp
ちょうど、つまずいていたのも /tmp
ディレクトリでした。試しに無効化したら正常にファイルが読み込めました。
とはいえ、手放しに無効化するのも心配ですので、下記のドキュメントに基づき、ファイルのパスや設定を調整する必要があるようです。
bubblewrap というものを使って実現しているそうです。情報ありがとうございます。 docs.ansible.com
「分離されたジョブに公開するパス」に例外(ホワイトリスト)を設定しておくと、「ジョブの分離の有効化」を有効にしつつも、必要な箇所だけアクセスできるようにできるようです。
なお、docker-compose で構築した AWX 15.0.0 では「ジョブの分離の有効化」はデフォルトで無効化さされていました。