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にディレクトリをマウントさせる方法を解説していますので、こちらも合わせて読んで頂ければと思います。
コメント