てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Ansible Tower で実行する Playbook が外部ファイルを参照できないときは「ジョブの分離の有効化」設定を確認

はじめに

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 というものを使って実現しているそうです。情報ありがとうございます。

具体的には「設定 / ジョブ」画面にある「ジョブの分離の有効化」(英語では Enable Job Isolation)です。

f:id:akira6592:20201026212312p:plain
ジョブの分離の有効化

デフォルトで有効で、以下のディレクトリが対象のようです。

  • /etc/tower
  • /var/lib/awx
  • /var/log
  • /tmp

ちょうど、つまずいていたのも /tmp ディレクトリでした。試しに無効化したら正常にファイルが読み込めました。

とはいえ、手放しに無効化するのも心配ですので、下記のドキュメントに基づき、ファイルのパスや設定を調整する必要があるようです。

bubblewrap というものを使って実現しているそうです。情報ありがとうございます。 docs.ansible.com

「分離されたジョブに公開するパス」に例外(ホワイトリスト)を設定しておくと、「ジョブの分離の有効化」を有効にしつつも、必要な箇所だけアクセスできるようにできるようです。

f:id:akira6592:20201027101116p:plain
ホワイトリスト

なお、docker-compose で構築した AWX 15.0.0 では「ジョブの分離の有効化」はデフォルトで無効化さされていました。