Ansible get_url 모듈을 사용하여 특정 URL 에서 파일 다운로드 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 은 IT 인프라 관리를 단순화하는 강력한 오픈 소스 자동화 도구입니다. 이 튜토리얼에서는 특정 URL 에서 파일을 다운로드할 수 있는 Ansible 의 get_url 모듈을 살펴보겠습니다. 이 모듈은 소프트웨어 설치, 구성 관리 및 콘텐츠 배포와 같은 자동화 작업에 필수적입니다.

이 튜토리얼을 통해 Ansible 을 설정하고, 기본 및 고급 옵션을 사용하여 get_url 모듈을 사용하며, 파일 다운로드를 자동화하기 위한 실용적인 예제를 구현하는 방법을 배우게 됩니다. 이 가이드가 끝나면 이 모듈을 활용하여 파일 관리 프로세스를 간소화하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

Ansible 설치 및 설정

get_url 모듈을 사용하기 전에, Ansible 이 시스템에 제대로 설치되고 구성되었는지 확인해야 합니다.

Ansible 설치

LabEx 환경에 Ansible 을 설치하는 것으로 시작해 보겠습니다.

sudo apt update
sudo apt install -y ansible

이 명령을 실행한 후, Ansible 버전을 확인하여 Ansible 이 올바르게 설치되었는지 확인합니다.

ansible --version

다음과 유사한 출력이 표시되어 Ansible 버전 및 구성 세부 정보를 보여줍니다.

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, ...) [GCC 11.x]

작업 디렉토리 생성

다음으로, Ansible 프로젝트를 위한 전용 디렉토리를 생성해 보겠습니다.

mkdir -p ~/project/ansible-get-url
cd ~/project/ansible-get-url

간단한 인벤토리 설정

Ansible 은 관리할 호스트를 알아야 합니다. 이 튜토리얼에서는 로컬 머신을 대상으로 하는 간단한 인벤토리 파일을 생성합니다.

echo "localhost ansible_connection=local" > inventory.ini

이 인벤토리 파일은 로컬 연결을 사용하여 localhost 에 대해 Ansible 을 실행하려는 것을 지정합니다.

Ansible 구성 파일 생성

Ansible 의 동작을 사용자 정의하기 위해 간단한 구성 파일을 생성해 보겠습니다.

cat > ansible.cfg << EOF
[defaults]
inventory = inventory.ini
host_key_checking = False
EOF

이 구성 파일은 Ansible 에게 인벤토리 파일을 사용하도록 지시하고, 테스트 환경에서 연결을 단순화하기 위해 호스트 키 확인을 비활성화합니다.

Ansible 설정 테스트

간단한 ping 명령을 실행하여 Ansible 구성이 올바르게 작동하는지 확인해 보겠습니다.

ansible localhost -m ping

다음과 같은 성공적인 응답을 볼 수 있습니다.

localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

이 출력은 Ansible 이 올바르게 설치되었고 localhost 와 통신할 수 있음을 확인합니다. 이제 다음 단계에서 get_url 모듈을 사용할 준비가 되었습니다.

get_url 모듈을 사용한 기본 Playbook 생성

이제 Ansible 을 설정했으므로, get_url 모듈을 사용하여 URL 에서 파일을 다운로드하는 간단한 playbook 을 만들어 보겠습니다.

Ansible Playbook 이해

Ansible playbook 은 관리형 호스트에서 실행할 작업 집합을 정의하는 YAML 파일입니다. Playbook 은 일련의 play 로 구성되며, 각 play 는 다음으로 구성됩니다.

  • 대상 호스트 집합
  • 실행할 작업 집합

첫 번째 Playbook 생성

get_url 모듈을 사용하는 기본 playbook 을 만들어 보겠습니다. 프로젝트 디렉토리에 download-file.yml이라는 파일을 생성합니다.

cd ~/project/ansible-get-url

파일 편집기를 열고 다음 내용으로 파일을 생성합니다.

---
- name: Download a file from URL
  hosts: localhost
  become: no
  tasks:
    - name: Create downloads directory
      file:
        path: ~/project/ansible-get-url/downloads
        state: directory
        mode: "0755"

    - name: Download a sample text file
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/README.md
        dest: ~/project/ansible-get-url/downloads/ansible-readme.md
        mode: "0644"

이 playbook 은 다음을 수행합니다.

  1. 다운로드한 파일을 저장하기 위해 downloads 디렉토리를 생성합니다.
  2. get_url 모듈을 사용하여 GitHub 에서 Ansible README.md 파일을 다운로드합니다.

get_url 모듈 매개변수 이해

get_url 작업의 주요 매개변수를 살펴보겠습니다.

  • url: 파일을 다운로드할 URL 을 지정합니다.
  • dest: 파일이 저장될 대상 경로를 정의합니다.
  • mode: 파일 권한을 설정합니다 (0644 는 소유자에 대한 읽기 및 쓰기, 그룹 및 기타 사용자에 대한 읽기를 의미합니다).

Playbook 실행

이제 playbook 을 만들었으므로, ansible-playbook 명령을 사용하여 실행해 보겠습니다.

ansible-playbook download-file.yml

다음과 유사한 출력을 볼 수 있습니다.

PLAY [Download a file from URL] ***********************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Create downloads directory] *********************************************
changed: [localhost]

TASK [Download a sample text file] ********************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

다운로드된 파일 확인

파일이 올바르게 다운로드되었는지 확인해 보겠습니다.

ls -l ~/project/ansible-get-url/downloads/

다운로드된 파일을 볼 수 있습니다.

-rw-r--r-- 1 labex labex 3154 Mar 15 12:34 ansible-readme.md

다운로드된 파일의 내용을 볼 수도 있습니다.

head -n 10 ~/project/ansible-get-url/downloads/ansible-readme.md

이렇게 하면 Ansible README.md 파일의 처음 10 줄이 표시되어 성공적으로 다운로드되었음을 확인합니다.

축하합니다! get_url 모듈을 사용하여 URL 에서 파일을 다운로드하는 첫 번째 Ansible playbook 을 성공적으로 생성하고 실행했습니다.

고급 get_url 옵션 사용

이제 기본 사항을 다루었으므로, 실제 시나리오에서 유용할 수 있는 get_url 모듈의 몇 가지 고급 옵션을 살펴보겠습니다.

고급 Playbook 생성

다양한 고급 옵션을 보여주는 advanced-download.yml이라는 새 playbook 을 만들어 보겠습니다.

cd ~/project/ansible-get-url

파일 편집기를 열고 다음 내용으로 파일을 생성합니다.

---
- name: Advanced get_url Module Options
  hosts: localhost
  become: no
  tasks:
    - name: Create advanced downloads directory
      file:
        path: ~/project/ansible-get-url/advanced-downloads
        state: directory
        mode: "0755"

    - name: Download with checksum validation
      get_url:
        url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
        dest: ~/project/ansible-get-url/advanced-downloads/jq
        mode: "0755"
        checksum: sha256:af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44

    - name: Download with timeout and retries
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible-examples/master/README.md
        dest: ~/project/ansible-get-url/advanced-downloads/examples-readme.md
        timeout: 30
        retries: 3
        delay: 5
        force: yes

    - name: Download only if file doesn't exist
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
        dest: ~/project/ansible-get-url/advanced-downloads/ansible-example.cfg
        force: no

고급 매개변수 이해

이 playbook 에서 사용된 고급 매개변수를 살펴보겠습니다.

  1. Checksum 유효성 검사 (Checksum Validation):

    • checksum: 다운로드된 파일의 예상 체크섬을 지정합니다 (형식: algorithm:checksum)
    • 이는 다운로드된 파일의 무결성을 보장하고, 파일이 올바른 체크섬으로 이미 존재하는 경우 다운로드를 방지합니다.
  2. Timeout 및 재시도 (Timeout and Retries):

    • timeout: HTTP 요청이 완료되는 데 걸리는 최대 시간 (초)
    • retries: 다운로드 실패 시 재시도 횟수
    • delay: 재시도 간의 지연 시간 (초)
    • force: 파일이 이미 존재하더라도 파일을 다운로드할지 여부
  3. 조건부 다운로드 (Conditional Download):

    • force: no: 대상에 파일이 존재하지 않는 경우에만 파일이 다운로드됩니다.

고급 Playbook 실행

고급 playbook 을 실행해 보겠습니다.

ansible-playbook advanced-download.yml

다음과 유사한 출력을 볼 수 있습니다.

PLAY [Advanced get_url Module Options] ****************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Create advanced downloads directory] ************************************
changed: [localhost]

TASK [Download with checksum validation] **************************************
changed: [localhost]

TASK [Download with timeout and retries] **************************************
changed: [localhost]

TASK [Download only if file doesn't exist] ************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

고급 다운로드 확인

고급 옵션으로 다운로드한 파일을 확인해 보겠습니다.

ls -l ~/project/ansible-get-url/advanced-downloads/

다운로드된 모든 파일을 볼 수 있습니다.

-rwxr-xr-x 1 labex labex 3773448 Mar 15 12:45 jq
-rw-r--r-- 1 labex labex     426 Mar 15 12:45 examples-readme.md
-rw-r--r-- 1 labex labex    1690 Mar 15 12:45 ansible-example.cfg

다운로드된 jq 바이너리가 작동하는지 테스트해 보겠습니다.

~/project/ansible-get-url/advanced-downloads/jq --version

jq 버전 (예: jq-1.6) 을 나타내는 출력을 볼 수 있으며, 이는 실행 파일이 올바른 체크섬으로 제대로 다운로드되었음을 확인합니다.

이제 다양한 요구 사항과 제약 조건으로 파일을 다운로드하기 위해 get_url 모듈의 다양한 고급 옵션을 성공적으로 사용했습니다.

실용적인 웹 애플리케이션 배포 구현

이제 배운 내용을 좀 더 실용적인 시나리오에 적용해 보겠습니다. Ansible 의 get_url 모듈을 사용하여 간단한 웹 애플리케이션을 배포하는 것입니다.

웹 애플리케이션 프로젝트 설정

먼저, 웹 애플리케이션을 위한 디렉토리 구조를 만들어 보겠습니다.

mkdir -p ~/project/ansible-get-url/webapp/public
cd ~/project/ansible-get-url

웹 애플리케이션 배포 Playbook 생성

이제 웹 애플리케이션에 필요한 파일을 다운로드하는 deploy-webapp.yml이라는 playbook 을 만들 것입니다.

---
- name: Deploy Web Application Files
  hosts: localhost
  become: no
  vars:
    webapp_dir: ~/project/ansible-get-url/webapp
    assets_base_url: https://raw.githubusercontent.com/ansible/ansible-documentation/devel/docs/docsite/rst/_static
  tasks:
    - name: Ensure webapp directories exist
      file:
        path: "{{ item }}"
        state: directory
        mode: "0755"
      loop:
        - "{{ webapp_dir }}"
        - "{{ webapp_dir }}/public"
        - "{{ webapp_dir }}/public/css"
        - "{{ webapp_dir }}/public/images"

    - name: Create index.html
      copy:
        dest: "{{ webapp_dir }}/public/index.html"
        content: |
          <!DOCTYPE html>
          <html>
          <head>
            <title>Ansible Demo App</title>
            <link rel="stylesheet" href="css/style.css">
          </head>
          <body>
            <div class="container">
              <h1>Welcome to Ansible Demo</h1>
              <p>This site was deployed using Ansible's get_url module!</p>
              <img src="images/ansible-logo.png" alt="Ansible Logo">
            </div>
          </body>
          </html>

    - name: Download CSS file
      get_url:
        url: "{{ assets_base_url }}/css/ansible.css"
        dest: "{{ webapp_dir }}/public/css/style.css"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Download Ansible logo
      get_url:
        url: "{{ assets_base_url }}/images/ansible_logo.svg"
        dest: "{{ webapp_dir }}/public/images/ansible-logo.png"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Install Python HTTP server
      apt:
        name: python3-http.server
        state: present
      become: yes

    - name: Display information about running the web server
      debug:
        msg: |
          Web application has been deployed!
          To start the web server, run:
          cd {{ webapp_dir }}/public && python3 -m http.server 8080
          Then access it at: http://localhost:8080

이 playbook 은 다음을 수행합니다.

  1. 웹 애플리케이션에 필요한 디렉토리 구조를 생성합니다.
  2. 기본 HTML 콘텐츠로 index.html 파일을 생성합니다.
  3. get_url 모듈을 사용하여 CSS 파일과 Ansible 로고 이미지를 다운로드합니다.
  4. Python HTTP 서버를 설치합니다.
  5. 웹 서버를 실행하는 방법에 대한 정보를 표시합니다.

웹 애플리케이션 배포 Playbook 실행

playbook 을 실행해 보겠습니다.

ansible-playbook deploy-webapp.yml

웹 애플리케이션이 성공적으로 배포되었음을 나타내는 출력을 볼 수 있습니다.

웹 서버 시작

이제 배포된 애플리케이션을 테스트하기 위해 웹 서버를 시작해 보겠습니다.

cd ~/project/ansible-get-url/webapp/public
python3 -m http.server 8080 &

웹 서버가 이제 포트 8080 에서 백그라운드로 실행됩니다. 브라우저 액세스가 가능한 일반적인 환경에 있다면 http://localhost:8080에서 웹 애플리케이션에 액세스할 수 있습니다.

배포된 파일 확인

필요한 모든 파일이 올바르게 배포되었는지 확인해 보겠습니다.

ls -la ~/project/ansible-get-url/webapp/public/

index.html 파일과 생성한 디렉토리를 볼 수 있습니다.

ls -la ~/project/ansible-get-url/webapp/public/css/

다운로드한 CSS 파일이 표시됩니다.

ls -la ~/project/ansible-get-url/webapp/public/images/

다운로드한 Ansible 로고 이미지가 표시됩니다.

HTML 콘텐츠 보기

index.html 파일의 내용을 확인해 보겠습니다.

cat ~/project/ansible-get-url/webapp/public/index.html

playbook 에서 생성한 HTML 콘텐츠를 볼 수 있습니다.

웹 서버 중지

테스트를 마쳤으면 프로세스 ID 를 찾아 웹 서버를 중지할 수 있습니다.

pkill -f "python3 -m http.server 8080"

축하합니다! Ansible 의 get_url 모듈을 사용하여 필요한 파일을 다운로드하여 간단한 웹 애플리케이션을 성공적으로 배포했습니다.

요약

이 튜토리얼에서는 Ansible 의 get_url 모듈을 사용하여 특정 URL 에서 파일을 다운로드하는 실질적인 경험을 얻었습니다. 다음을 배웠습니다.

  • 로컬 개발을 위해 Ansible 을 설치하고 구성하는 방법
  • 파일을 다운로드하기 위해 get_url 모듈을 사용하여 기본 playbook 을 만드는 방법
  • 체크섬 유효성 검사 (checksum validation), 타임아웃 (timeouts), 재시도 (retries), 조건부 다운로드 (conditional downloads) 와 같은 고급 옵션을 활용하는 방법
  • get_url 모듈을 사용하여 실용적인 웹 애플리케이션 배포 시나리오를 구현하는 방법

이러한 기술은 소프트웨어 배포, 콘텐츠 관리 및 시스템 구성을 포함한 다양한 IT 운영에서 파일 관리 작업을 자동화하는 데 기본입니다. get_url 모듈은 인프라 관리 프로세스를 간소화하기 위해 더 복잡한 Ansible 워크플로우에 통합될 수 있는 다재다능한 도구입니다.

Ansible 여정을 계속 진행하면서, 더 포괄적인 파일 관리 자동화를 위해 get_url 모듈을 보완하는 uri, unarchive, synchronize와 같은 관련 모듈을 살펴보십시오.