【Ansible AWX】ファイルが見つからないエラーの回避方法


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

Ansible AWX

AWXのcopyモジュールなどで、ファイルをコピーする際、ファイルが見つからないエラーが発生する場合があります。その事象と対策を解説したいと思います。

エラーの内容

まずは、出力されるエラーの内容になります。
エラー部分を抜粋しました。
赤字のようにファイルが見つからないという旨のエラーが発生していることが分かります。

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: If you are using a module and expect the file to exist on the remote, see the remote_src option
fatal: [192.168.56.105]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/work/test_file_01.txt' on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}

コピー元ファイルを確認してみました。
下記のようにファイルは存在し、読み取り権限も付与されていることが確認できます。

[root@localhost ~]# ls -l /home/work/test_file_01.txt
-rw-r--r-- 1 awx awx 0  2月  6 09:31 /home/work/test_file_01.txt

実行したプレイブック

実行したプレイブックになります。
単純にファイルをコピーするだけのものですね。
このプレイブックとエラーの内容から、今回見つからないファイルはコピー元のファイルになります。

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

  - name: ファイルのコピー
    copy:
      src: /home/work/test_file_01.txt
      dest: /home/awx/

原因

コピー元のファイルは存在しているにも関わらず、何故、ファイルが見つからないのでしょうか?

これは、AWXがDocker上のコンテナ内で動作していることが起因しています。
AWXは下記のように、インストールしたOS上で動作しているわけではなく、OS上にDockerがインストールされ、Docker上のコンテナで動作しています。

そのため、AWXはOS上のファイルではなく、コンテナ上のファイルを参照します。
つまり、今回のエラーはコンテナ内にファイルが見つからないために発生しています

対処方法

対処としては、コンテナ内にファイルを配置するということになります。

では、実際にコンテナ内にファイルを配置する方法を解説します。

まずはDockerのコンテナ情報を取得します。

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED       STATUS       PORTS                                   NAMES
f2704b733879   ansible/awx:15.0.1   "/usr/bin/tini -- /u…"   4 weeks ago   Up 12 days   8052/tcp                                awx_task
67c948c5d3fe   ansible/awx:15.0.1   "/usr/bin/tini -- /b…"   4 weeks ago   Up 12 days   0.0.0.0:80->8052/tcp, :::80->8052/tcp   awx_web
c8c6057ffd10   postgres:10          "docker-entrypoint.s…"   4 weeks ago   Up 12 days   5432/tcp                                awx_postgres
9a34f1f884c1   redis                "docker-entrypoint.s…"   4 weeks ago   Up 12 days   6379/tcp                                awx_redis

黄色字のコンテナ「awx_task」が対象のコンテナになります。
では、ホストOSからコンテナ内にファイルをコピーします。
[work]ディレクトリも存在しないため、ディレクトリごとコピーしました。
コピー時の構文は「docker cp {ホスト側のディレクトリパス} {コンテナ名}:{コンテナ内のディレクトリパス}」となります。

[root@localhost ~]# docker cp /home/work/ awx_task:/home/work/

正しくファイルがコピーされているか、コンテナに接続して確認してみます。

[root@localhost ~]# docker exec -it awx_task /bin/bash
bash-4.4# ls -l /home/work/test_file_01.txt
-rw-r--r-- 1 1000 1000 0 Feb  6 14:31 /home/work/test_file_01.txt

ファイルは問題なくコピーされているようです。
ユーザーID、グループIDを正しく設定していないため、[ls]コマンドの結果にあるユーザーとグループの値が数字で表示されていますが、今回は問題ありません。

Dockerコンテナ内にファイルを配置した状態でジョブを実行してみます。
以下がジョブの実行結果になります。

Using /etc/ansible/ansible.cfg as config file
SSH password: 

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

TASK [ファイルのコピー] ****************************************************************
changed: [192.168.56.105] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/home/awx/test_file_01.txt", "gid": 1000, "group": "awx", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "awx", "size": 0, "src": "/home/awx/.ansible/tmp/ansible-tmp-1645519712.5888903-986-8526103060847/source", "state": "file", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

実行結果の7行目が「changed」となり、ファイルのコピーが正常に終了したことが分かります。
コピー先のサーバーを確認してみます。

[root@localhost home]# ls -l /home/awx/test_file_01.txt
-rw-rw-r-- 1 awx awx 0  2月 22 03:48 /home/awx/test_file_01.txt

プレイブックに記述したコピー先「dest: /home/awx/」に、ファイルがコピーされていますね。

ジョブ実行時にファイルが見つからないエラーが発生した場合、Docker上のコンテナ内にファイルが配置されているかを確認するということが、今回のポイントとなります。

記事は以上になりますが、毎回コンテナ内にファイルをコピーするのが手間って方は、下記の記事でホストOSにディレクトリをマウントさせる方法を解説していますので、こちらも合わせて読んで頂ければと思います。

コメント

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