설명
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 경로를 사용합니다. 경로를 고정하는 것만으로 파일 내용이나 권한이 신뢰할 수 있게 되는 것은 아닙니다.