파일 안전 전송: Ansible의 Copy 및 Fetch 모듈 활용

Ansible copy 및 fetch 애드혹 명령을 사용하여 관리 노드에 파일을 푸시하고 로그나 구성을 제어 노드로 검색합니다.

파일 안전하게 전송하기: Ansible Copy 및 Fetch 모듈 사용

파일 이동은 Ansible에서 가장 먼저 실용적으로 수행해야 할 작업 중 하나입니다: 서버에 구성을 푸시하거나, 로그 파일을 수집하거나, 변경 전에 원격 파일을 백업하는 것 등이 있습니다. copyfetch 모듈이 이러한 두 방향을 명확하게 처리합니다.

이 가이드는 애드혹 명령을 사용하므로 전체 플레이북을 작성하지 않고도 일회성 전송을 실행할 수 있습니다. 동일한 모듈 인수는 작업을 반복 가능하게 하려는 경우 플레이북에서도 작동합니다.

전제 조건

아래 예제를 실행하기 전에 다음 사항이 준비되어 있는지 확인하십시오.

  1. Ansible 제어 노드: Ansible이 설치된 머신.
  2. 인벤토리 파일: 관리 노드를 정의하는 작동 가능한 인벤토리 파일(예: /etc/ansible/hosts).
  3. 연결: 원격 호스트에 대해 구성된 SSH 키 액세스.

모든 예제는 인벤토리에서 대상 그룹이 webservers라고 가정합니다.

파일 전송을 위한 애드혹 명령 이해

애드혹 명령은 터미널에서 직접 실행되는 한 줄 명령으로, 영구 플레이북이 필요하지 않은 빠른 작업에 이상적입니다. 기본 구조는 다음과 같습니다:

ansible <호스트-그룹> -m <모듈-이름> -a "키=값 키2=값2 ..."

파일 전송의 경우 -m copy 또는 -m fetch 모듈 이름을 사용하고 -a 플래그를 사용하여 필수 인수를 전달합니다.

copy 모듈: 원격 노드로 파일 푸시

copy 모듈은 Ansible 제어 머신에 있는 파일을 하나 이상의 관리 노드로 전송하는 데 사용됩니다. 이는 구성 파일, 스크립트 또는 소규모 자산을 배포하는 표준 방법입니다.

copy의 주요 인수

copy 모듈은 두 가지 필수 인수가 필요하며 구성 관리를 위해 여러 선택적 인수를 허용합니다:

인수 설명 필수 여부 예시 값
src Ansible 제어 머신의 로컬 파일 경로. 애드혹 명령에는 절대 경로가 가장 명확합니다. /tmp/config.conf
dest 원격 관리 노드에 파일이 배치될 경로. /etc/app/config.conf
owner 원격 노드에서 파일을 소유해야 하는 사용자 이름. 아니요 nginx
group 원격 노드에서 파일을 소유해야 하는 그룹 이름. 아니요 www-data
mode 대상 파일에 설정할 권한(8진수). 아니요 0644
backup yes인 경우 원본을 덮어쓰기 전에 백업 파일을 만듭니다. 아니요 yes

예제 1: 간단한 파일 배포

로컬에 사용자 정의 Message of the Day (motd) 파일이 있고 모든 웹 서버에 푸시하려고 한다고 가정합니다.

# 로컬 파일 경로: /home/user/ansible/motd_banner
# 원격 대상: /etc/motd

ansible webservers -m copy -a "src=/home/user/ansible/motd_banner dest=/etc/motd"

예제 2: 권한 및 소유권 설정

보안 구성 파일을 배포하는 경우 소유자, 그룹 및 제한된 권한(예: 소유자만 읽기/쓰기 가능)을 지정해야 합니다.

# 애플리케이션 구성 파일 배포, 'app_user' 소유, 'devops' 그룹,
# 소유자에게만 읽기/쓰기 권한(0600).

ansible webservers -m copy -b -a "src=/tmp/app_settings.yaml dest=/etc/app/settings.yaml owner=app_user group=devops mode=0600"

-b 참고: -b(또는 --become) 플래그는 원격 대상에 상승된 권한(예: /etc에 쓰기)이 필요한 경우 필요합니다.

fetch 모듈: 원격 노드에서 파일 검색

fetch 모듈은 copy의 역 작업을 수행합니다: 관리 노드에서 Ansible 제어 머신으로 파일을 검색합니다. 이는 구성 파일 백업, 로그 검색 또는 진단 정보 수집에 유용합니다.

fetch의 주요 인수

fetch 모듈은 원격 노드의 소스 파일과 제어 머신의 대상 디렉토리가 필요합니다.

인수 설명 필수 여부 예시 값
src 원격 관리 노드에 있는 파일의 절대 경로. /var/log/nginx/error.log
dest 파일이 저장될 제어 머신의 디렉토리 절대 경로. /tmp/backups/logs
flat yes인 경우 결과 파일 이름에 호스트 이름 구조가 포함되지 않습니다(여러 호스트에서 가져올 때 권장되지 않음). 아니요 no (기본값)

중요한 차이점: 대상 구조

copy 모듈과 달리 fetch 모듈은 여러 서버에서 파일을 검색할 때 파일 이름 충돌을 방지하기 위해 원격 호스트 이름을 기반으로 구조화된 하위 디렉토리 경로를 자동으로 생성합니다.

제어 머신의 결과 경로는 다음과 같습니다:

<dest>/<hostname>/<src>

예를 들어, host1에서 /etc/nginx/nginx.conf/tmp/backups로 가져오면 다음과 같습니다:

/tmp/backups/host1/etc/nginx/nginx.conf

예제 3: 원격 구성 백업 검색

모든 웹 서버에서 로컬 백업 디렉토리로 실행 중인 구성 파일을 검색하려면:

# 모든 웹 서버에서 nginx.conf를 로컬 디렉토리 /tmp/config_backups로 검색

ansible webservers -m fetch -a "src=/etc/nginx/nginx.conf dest=/tmp/config_backups"

이 명령을 실행한 후 webserver1webserver2를 대상으로 지정했다면 로컬 디렉토리 구조는 다음과 같습니다:

/tmp/config_backups/
├── webserver1
│   └── etc
│       └── nginx
│           └── nginx.conf
└── webserver2
    └── etc
        └── nginx
            └── nginx.conf

예제 4: 호스트 구조 없이 단일 파일 검색 (flat=yes)

단일 호스트에서만 파일을 가져오는 것이 확실하거나 파일의 내용(원본 구조가 아닌)만 필요한 경우 flat=yes를 사용할 수 있습니다. 이렇게 하면 파일이 원래 원격 파일 이름으로 대상 폴더에 직접 배치됩니다.

# 단일 호스트에서 로컬 상태 보고서를 검색하여 직접 저장합니다.

ansible webserver1 -m fetch -a "src=/tmp/health_status.txt dest=/tmp/reports flat=yes"

# 결과 경로: /tmp/reports/health_status.txt

경고: 단일 호스트를 대상으로 하거나 후속 실행에서 파일을 덮어쓰려는 경우에만 flat=yes를 사용하십시오. Ansible이 충돌을 방지하지 않습니다.

모범 사례 및 보안 고려 사항

작은 파일 전송 실수는 프로덕션 장애로 이어질 수 있으며, 특히 파일이 /etc에 저장되거나 비밀을 포함하는 경우 더욱 그렇습니다.

copy로 항상 권한 설정

modeowner를 명시적으로 정의하지 않고 구성 파일을 푸시하지 마십시오. 원격 시스템의 기본 umask에 의존하면 민감한 파일(예: SSH 키 또는 데이터베이스 자격 증명)이 지나치게 허용된 액세스 권한으로 끝날 수 있습니다.

# 잘못된 방법 (umask에서 파생된 모드)
- name: 안전하지 않은 키 배포
  ansible.builtin.copy:
    src: private.key
    dest: /etc/app/private.key

# 올바른 방법 (명시적으로 액세스 제한)
- name: 안전한 키 배포
  ansible.builtin.copy:
    src: private.key
    dest: /etc/app/private.key
    mode: '0600'
    owner: root

중요한 변경에는 backup=yes 사용

copy를 사용하여 기존의 중요한 파일(예: /etc/sudoers)을 덮어쓸 때는 backup=yes를 포함하십시오. Ansible은 파일을 덮어쓰기 전에 원격 노드에 타임스탬프가 찍힌 백업 복사본을 생성하여 쉬운 롤백 옵션을 제공합니다.

대용량 전송에는 synchronize 고려

copyfetch는 빠른 작업과 소규모 파일에 잘 작동하지만, 대규모 디렉토리 트리 또는 효율적인 델타 전송에는 ansible.posix.synchronize를 사용하십시오. 이는 rsync를 래핑하므로 제어 노드와 대상 환경에 올바른 rsync 및 SSH 액세스가 필요합니다.

핵심 요약

소스가 제어 노드에 있고 대상이 관리 노드에 있을 때 copy를 사용하십시오. 소스가 관리 노드에 있고 파일을 로컬에 저장하려면 fetch를 사용하십시오.

모듈 방향 애드혹 명령 예시
copy 제어 노드 -> 관리 노드 ansible all -m copy -a "src=/local/file dest=/remote/path mode=0644"
fetch 관리 노드 -> 제어 노드 ansible all -m fetch -a "src=/remote/file dest=/local/dir"

단일 서버의 경우 flat=yes를 사용하면 가져온 파일을 더 쉽게 읽을 수 있습니다. 서버 그룹의 경우 기본 호스트 기반 디렉토리 구조를 유지하여 한 호스트의 로그가 다른 호스트의 로그를 덮어쓰지 않도록 하십시오.