Ansible modules 중 Fetch module에 대해 알아보겠습니다.
Fetch module 이란
Fetch는 영어로 “가지고 오다”라는 뜻입니다. copy 명령어와 정확히 반대로 동작합니다. 이 말은 copy 명령은 제어 노드에 있는 파일을 관리 대상 노드로 전송하는 기능을 하는 반면, fetch 모듈은 관리 대상 노드에서 제어노드로 파일을 가져오는 작업을 실행합니다.
💡 제어노드는 앤서블을 실행하는 노드를 말하고, 관리 노드는 앤서블로 관리하는 대상 노드를 말합니다.

Fetch module 옵션
-
src: 관리 대상 노드에 있는 복사해서 가져오고 싶은 파일
-
dest: 파일을 저장할 디렉토리
-
flat: ( default: false )
-
false: $hostname/path/to/file 처럼 파일구조가 생성되어 저장된다. (hostname은 인벤토리 호스트 이름이다) 이 옵션을 사용하게 되면 위 처럼 파일 구조로 복사되는것이 아닌 지정된 파일만 복사된다. 이름이 같은 파일은 하나의 파일로 덮어씌어지게 되므로, 관리 대상 노드가 하나이거나 파일 이름이 모두 다를 때 유용하다
-
true: src에 디렉토리를 지정할 수 있으며, 하위에 있는 파일들을 모두 가져올 수 있다. 디렉토리를 지정하게 되면 dest의 경로에 후행 슬러시를 입력해 주어야 한다.
-
Fetch module 사용 방법
💡 예제에 사용된 inventory 파일
[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
위의 플레이북을 실행하면 아래와 같은 디렉토리 구조가 생성됩니다. 먼저 인벤토리 이름으로 디렉토리가 생성된 뒤 가져오는 파일의 절대경로 구조 그대로 파일이 생성됩니다.
$ tree backup
backup
├── rocky84.lab.example.com
│ └── etc
│ └── hostname
└── rocky86.lab.example.com
└── etc
└── hostname
예제2. flat 값을 yes로 변경하여 디렉토리 구조 없이 파일만 가져오기
1번 작업과 동일하지만 flat값을 yes로 변경하였습니다.
- fetch:
src: /etc/hostname
dest: /home/student/ansible/backup/
flat: yes
flat을 yes로 변경한 경우 절대경로 구조를 취하지 않고 파일만 그대로 가져오는 걸 확인할 수 있습니다. 같다면 마지막으로 실행된 파일 하나만 존재하고 이전 파일들은 덮어 써져서 사라져 버립니다. 따라서 flat을 활성화할 경우 아래 3번의 방법을 이용해 파일명을 변경하시기 바랍니다.
$ tree backup/
backup/
└── hostname
$ cat backup/hostname
rocky86
예제3. 파일명이 동일한 상황에서 flat을 yes로 복사해야 하는 경우, inventory_hostname 변수를 사용
가져오는 파일의 이름에 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
참고 사이트:
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/fetch_module.html