【Ansible Tower/AAP】fetchモジュールでファイルが見つからない場合の対処方法


この記事はプロモーションを含みます。

Ansible

ホーム > Ansible Tower・AWX・AAP リファレンス

Ansible Tower/AAP環境のfetchモジュールが正常終了しているにも関わらず、ファイルが見つからない場合の対処方法について解説します。

はじめに・環境

Ansible Tower・AAP(Ansible Automation Platform)にて、fetchモジュールでターゲットノード(被管理ホスト)からファイルをダウンロードした際、ジョブが正常終了しているにも関わらず、ファイルが見つからない(ファイルがダウンロードされていない)事象の原因と対処方法について説明します。

下記は、本記事執筆時の環境情報です。

  • コントロールノード
    • OS:Red Hat Enterprise Linux release 8.6 (Ootpa)
    • AAPバージョン:Ansible Automation Platform 2.4(以降はAAPと記載)
  • ターゲットノード
    • OS:AlmaLinux release 9.0 (Emerald Puma)

fetchモジュールについては、以下で解説しています。

事象

ここでは、今回の事象であるファイルが見つからない状態について記載しています。

プレイブック

fetchモジュールを実行するだけの簡単なプレイブックです。
今回はターゲットノードから、「main.py」というファイルをコントロールノードにダウンロードします。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: ファイルのダウンロード
    fetch:
      src: /home/work/main.py
      dest: /home/awx/dir

実行結果

ここでは、プレイブックの実行結果とコントロールノードの状態を確認します。

まずは、プレイブックの実行結果です。
実行結果からはジョブが正常に終了し、下記にダウンロードされたように見えます。
パス:/home/awx/dir/TESTSV01/home/work/main.py

PLAYBOOK: fetch.yml ************************************************************
1 plays in fetch.yml
PLAY [all] *********************************************************************
TASK [ファイルのダウンロード] **************************************************
task path: /runner/project/fetch.yml:10
changed: [TESTSV01] => {"changed": true, "checksum": "0afde05226987895d09008c746c828d6fdca6a36", "dest": "/home/awx/dir/TESTSV01/home/work/main.py", "md5sum": "c3403e120c77bd79555df77044bb5319", "remote_checksum": "0afde05226987895d09008c746c828d6fdca6a36", "remote_md5sum": null}
PLAY RECAP *********************************************************************
TESTSV01                   : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

では、コントロールノードを確認してみます。
ジョブが正常終了しましたが、ファイルがありません。

[root@RHEL86AAP awx]# ls -al /home/awx/dir/
合計 0
drwxr-xr-x. 2 awx awx  6  1月  7 17:16 .
drwxr-xr-x. 3 awx awx 28  1月  7 17:03 ..

では、次項で対処方法について説明していきたいと思います。

原因と対処方法

ここでは、原因と対処方法について説明します。

まずは、原因についてですが、Ansible TowerやAAPではセキュリティを高めるため、特定のディレクトリ以外は、Ansibleから参照出来ないようになっています。
こちらの機能は、Ansible Tower・AAPでは「分離されたジョブに公開するパス」という設定で、Bubblewrap(bwrap)というもので作られているようです。

次に、対処方法についてですが、原因にある通り、システム設定から「分離されたジョブに公開するパス」の設定値を変更します。

AAPのメインメニューより「設定 > ジョブ設定」画面を開きます。

下にスクロールすると「分離されたジョブに公開するパス」の設定画面があるので、Ansibleから参照したいディレクトリを追記します。
今回は「/home/awx」を追記しました。

対処方法は以上となります。

対処後の確認

ここでは、前項の設定が正しく効いているか確認します。

プレイブック

今回は、fetchモジュールの実行に加え、前後にファイルの確認処理を追加しました。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: ダウンロード前の確認
    shell: ls -lR /home/awx/
    delegate_to: localhost

  - name: ファイルのダウンロード
    fetch:
      src: /home/work/main.py
      dest: /home/awx/dir

  - name: ダウンロード後の確認
    shell: ls -lR /home/awx/
    delegate_to: localhost

実行結果

ここでは、プレイブックの実行結果とコントロールノードの状態を確認します。

まずは、プレイブックの実行結果です。
タスク「ダウンロード後の確認」を確認すると、「ダウンロード前の確認」では存在しなかった「main.py」があるため、正しくダウンロードされていることが分かります。

PLAYBOOK: fetch.yml ************************************************************
1 plays in fetch.yml

PLAY [all] *********************************************************************

TASK [ダウンロード前の確認] ****************************************************
task path: /runner/project/fetch.yml:6
changed: [TESTSV01 -> localhost] => {"changed": true, "cmd": "ls -lR /home/awx/", "delta": "0:00:00.005863", "end": "2024-01-07 22:44:24.889353", "msg": "", "rc": 0, "start": "2024-01-07 22:44:24.883490", "stderr": "", "stderr_lines": [], "stdout": "/home/awx/:\\ntotal 0\\ndrwxr-xr-x. 2 root   root   6 Jan  7 22:16 dir\\n-rw-r--r--. 1 nobody nobody 0 Jan  7 12:40 web.log\\n\\n/home/awx/dir:\\ntotal 0", "stdout_lines": ["/home/awx/:", "total 0", "drwxr-xr-x. 2 root   root   6 Jan  7 22:16 dir", "-rw-r--r--. 1 nobody nobody 0 Jan  7 12:40 web.log", "", "/home/awx/dir:", "total 0"]}

TASK [ファイルのダウンロード] **************************************************
task path: /runner/project/fetch.yml:10
changed: [TESTSV01] => {"changed": true, "checksum": "0afde05226987895d09008c746c828d6fdca6a36", "dest": "/home/awx/dir/TESTSV01/home/work/main.py", "md5sum": "c3403e120c77bd79555df77044bb5319", "remote_checksum": "0afde05226987895d09008c746c828d6fdca6a36", "remote_md5sum": null}

TASK [ダウンロード後の確認] ****************************************************
task path: /runner/project/fetch.yml:15
changed: [TESTSV01 -> localhost] => {"changed": true, "cmd": "ls -lR /home/awx/", "delta": "0:00:00.007972", "end": "2024-01-07 22:44:26.019413", "msg": "", "rc": 0, "start": "2024-01-07 22:44:26.011441", "stderr": "", "stderr_lines": [], "stdout": "/home/awx/:\\ntotal 0\\ndrwxr-xr-x. 3 root   root   22 Jan  7 22:44 dir\\n-rw-r--r--. 1 nobody nobody  0 Jan  7 12:40 web.log\\n\\n/home/awx/dir:\\ntotal 0\\ndrwxr-xr-x. 3 root root 18 Jan  7 22:44 TESTSV01\\n\\n/home/awx/dir/TESTSV01:\\ntotal 0\\ndrwxr-xr-x. 3 root root 18 Jan  7 22:44 home\\n\\n/home/awx/dir/TESTSV01/home:\\ntotal 0\\ndrwxr-xr-x. 2 root root 21 Jan  7 22:44 work\\n\\n/home/awx/dir/TESTSV01/home/work:\\ntotal 4\\n-rw-r--r--. 1 root root 236 Jan  7 22:44 main.py", "stdout_lines": ["/home/awx/:", "total 0", "drwxr-xr-x. 3 root   root   22 Jan  7 22:44 dir", "-rw-r--r--. 1 nobody nobody  0 Jan  7 12:40 web.log", "", "/home/awx/dir:", "total 0", "drwxr-xr-x. 3 root root 18 Jan  7 22:44 TESTSV01", "", "/home/awx/dir/TESTSV01:", "total 0", "drwxr-xr-x. 3 root root 18 Jan  7 22:44 home", "", "/home/awx/dir/TESTSV01/home:", "total 0", "drwxr-xr-x. 2 root root 21 Jan  7 22:44 work", "", "/home/awx/dir/TESTSV01/home/work:", "total 4", "-rw-r--r--. 1 root root 236 Jan  7 22:44 main.py"]}

PLAY RECAP *********************************************************************
TESTSV01                   : ok=3    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

では、コントロールノードを確認してみます。
ファイルが存在するので、無事にファイルがダウンロードされたことが分かります。

[root@RHEL86AAP awx]# ls -lR /home/awx/
/home/awx/:
合計 0
drwxr-xr-x. 3 awx   awx   22  1月  7 17:44 dir
-rw-r--r--. 1 nginx nginx  0  1月  7 07:40 web.log

/home/awx/dir:
合計 0
drwxr-xr-x. 3 awx awx 18  1月  7 17:44 TESTSV01

/home/awx/dir/TESTSV01:
合計 0
drwxr-xr-x. 3 awx awx 18  1月  7 17:44 home

/home/awx/dir/TESTSV01/home:
合計 0
drwxr-xr-x. 2 awx awx 21  1月  7 17:44 work

/home/awx/dir/TESTSV01/home/work:
合計 4
-rw-r--r--. 1 awx awx 236  1月  7 17:44 main.py

プレイブックの実行結果とlsコマンドの結果を比べると、下記のようにファイルの所有者・グループが異なっていました。

プレイブックの結果lsコマンドの結果
awxroot
nobodynginx

これは、ルートレスコンテナという技術を使っているようで、rootはawxに、一般ユーザはnobodyに置き換えられるようです。

記事は以上です。Ansible TowerやAAP環境では、fetchモジュールの挙動に一癖あることが分かりました。上手く動かない場合は、本記事を参考にして頂ければと思います。

コメント

タイトルとURLをコピーしました