[Ansible Modules] Fetch module 설명 및 활용
Ansible modules 중 하나인 Fetch module에 대해 알아보겠습니다. Fetch는 관리 대상 노드에서 제어 노드로 파일을 복사해 오는 데 사용되는 모듈입니다
Fetch module 이란
Fetch는 영어로 "가져오다"라는 의미입니다. Ansible의 copy
모듈과 반대로 동작하는 기능으로, copy
가 제어 노드에서 관리 노드로 파일을 전송하는 데 사용된다면, fetch
는 그 반대 방향으로, 관리 대상 노드의 파일을 제어 노드로 복사해 오는 데 사용됩니다.
여기서 제어 노드(control node)는 Ansible을 실행하는 노드를, 관리 노드(managed node)는 Ansible로 관리되는 대상 시스템을 의미합니다.
![]() |
Ansible modules(fetch_module) |
Fetch module 옵션
fetch
모듈에서 주로 사용되는 주요 옵션은 다음과 같습니다:
-
src:
관리 대상 노드에서 복사해 올 파일의 경로입니다. -
dest:
제어 노드에 파일을 저장할 경로입니다. -
flat (기본값:
false
) -
false
:{{ inventory_hostname }}/path/to/file
형태의 디렉토리 구조로 파일이 저장됩니다. 호스트별로 디렉토리가 생성되므로 여러 노드에서 같은 파일 경로를 가져올 때 유용합니다. -
true
: 파일 경로 구조 없이 파일만 단순 복사됩니다. 이름이 같은 파일은 덮어써지기 때문에, 관리 노드가 하나이거나 파일명이 충돌하지 않는 경우에 적합합니다. 또한 디렉토리를 지정할 경우dest
경로 끝에 슬래시(/
)를 반드시 붙여야 합니다.
Fetch module 사용 방법
예제에서는 다음과 같은 인벤토리 파일을 사용합니다.
[test] rocky86.lab.example.com rocky84.lab.example.com
예제 1. 기본값(flat: false
)으로 파일 가져오기
fetch
모듈을 이용해 관리 노드의 /etc/hostname
파일을 제어 노드의 /home/student/ansible/backup/
디렉토리에 복사합니다.- fetch: src: /etc/hostname dest: /home/student/ansible/backup/ flat: false
플레이북을 실행하면 아래와 같은 디렉토리 구조가 생성됩니다. 먼저 인벤토리 호스트 이름으로 디렉토리가 생성되고, 그 안에 원본 경로(/etc/hostname
)가 그대로 반영된 구조로 파일이 저장됩니다.
$ tree backup backup ├── rocky84.lab.example.com │ └── etc │ └── hostname └── rocky86.lab.example.com └── etc └── hostname
예제 2. flat: yes
로 디렉토리 구조 없이 파일만 가져오기
flat
값을 yes
로 변경해 디렉토리 구조 없이 파일만 가져옵니다.- fetch: src: /etc/hostname dest: /home/student/ansible/backup/ flat: yes
flat을 yes로 변경한 경우 대상 파일이 단순히 dest
디렉토리에 복사되며, 디렉토리 구조는 유지되지 않습니다. 결과적으로 동일한 파일명이 여러 호스트에서 복사될 경우, 마지막으로 실행된 노드의 파일만 남고 이전 것은 덮어써지게 됩니다.
$ tree backup/ backup/ └── hostname $ cat backup/hostname rocky86
이러한 문제를 방지하기 위해서는 다음 예제처럼 파일명에 호스트명을 포함시키는 방식이 필요합니다.
예제 3. 동일한 파일명을 호스트별로 구분하여 복사하기
inventory_hostname
변수를 활용하여 파일명을 구분할 수 있습니다.- fetch:
src: /etc/hostname
dest: /home/student/ansible/backup/{{ inventory_hostname }}_hostname
flat: yes
위와 같이 설정하면, 각 호스트별로 파일명이 달라지므로 덮어쓰기 없이 모두 개별 파일로 저장됩니다.
$ tree backup/ backup/ ├── rocky84.lab.example.com_hostname └── rocky86.lab.example.com_hostname $ cat backup/rocky84.lab.example.com_hostname rocky84 $ cat backup/rocky86.lab.example.com_hostname rocky86
참고 사이트
-
Ansible Fetch Module 공식 문서:
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/fetch_module.html
댓글
댓글 쓰기