説明
Ansible の template と copy は、ローカルの src の相対パスを、ロール、タスクファイル、プレイブックの文脈に従って検索します。単にコマンドを実行した現在のディレクトリを基準にするわけではありません。ロールや読み込み関係が変わると、意図しないファイルを選んだり、ファイルが見つからなかったりする可能性があります。
相対パス自体が誤りなのではありません。管理されたロールのディレクトリと明確なファイル配置を使えば、一貫した配布を構成できます。
想定される影響
- 意図しないテンプレートやファイルによって、誤った設定が配布される可能性があります。
- ファイルが見つからず自動化が中断したり、環境によって配布結果が変わったりするおそれがあります。
対処方法
- ロールとプレイブックのファイル配置を明確にし、
ansible_search_pathなどで実際の検索の文脈を確認してください。 - 確認済みのロール内のパス、明示的な基準ディレクトリ、必要に応じて絶対パスを使ってください。
- ソースファイルとディレクトリへの書き込みを制限し、配布環境で意図したファイルが選ばれるか確認してください。
例
src のファイルはコントロールノードに用意する必要があります。絶対パスでも、各実行環境に同じ信頼できるファイルが存在する必要があり、配布先への書き込み権限は別途必要です。
変更前
yaml
---
- name: 설정 파일 배포
hosts: localhost
tasks:
- name: 템플릿 복사
ansible.builtin.template:
src: ../templates/app.conf.j2
dest: /etc/app/app.conf
mode: "0644"
- name: 정적 파일 복사
ansible.builtin.copy:
src: ../files/banner.txt
dest: /etc/app/banner.txt
mode: "0644"
親ディレクトリを参照するため、実際のロールやプレイブックの配置でどのファイルが選ばれるか確認する必要があります。
変更後
yaml
---
- name: 설정 파일 배포
hosts: localhost
tasks:
- name: 템플릿 복사
ansible.builtin.template:
src: /opt/ansible/templates/app.conf.j2
dest: /etc/app/app.conf
mode: "0644"
- name: 정적 파일 복사
ansible.builtin.copy:
src: /opt/ansible/files/banner.txt
dest: /etc/app/banner.txt
mode: "0644"
明示的な /opt/ansible のパスを使います。パスを固定するだけで、ファイルの内容や権限が信頼できるものになるわけではありません。