[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로 디렉토리 구조 없이 파일만 가져오기

이번 예제는 예제 1과 동일한 작업을 수행하지만, 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

 

참고 사이트

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명