Ansible 로 장형식 파일 및 디렉토리 목록 표시 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 은 인프라 관리 및 배포를 단순화하는 널리 사용되는 IT 자동화 도구입니다. 이 랩에서는 Ansible 을 사용하여 긴 형식으로 파일과 디렉토리를 나열하는 방법을 살펴봅니다. Ansible 을 설정하고, 플레이북 (playbook) 을 생성하며, 내장 모듈을 사용하여 원격 시스템에서 파일 정보를 나열하는 방법을 배우게 됩니다. 이 랩을 마치면 자동화 워크플로우를 향상시킬 수 있는 Ansible 명령어와 기술에 대한 실질적인 경험을 얻게 될 것입니다.

Ansible 설치 및 설정

이 단계에서는 시스템에 Ansible 을 설치하고 로컬 환경을 관리하기 위한 기본 인벤토리 파일을 생성합니다.

Ansible 설치

먼저, 패키지 관리자를 사용하여 Ansible 을 설치해 보겠습니다.

sudo apt update
sudo apt install -y ansible

설치가 완료된 후, Ansible 버전을 확인하여 Ansible 이 올바르게 설치되었는지 확인합니다.

ansible --version

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

ansible [core 2.12.0]
  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
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, Ubuntu 22.04)
  jinja version = 3.0.3
  libyaml = True

Ansible 인벤토리 생성

인벤토리 파일은 Ansible 이 작업할 수 있는 관리 노드 목록입니다. 이 랩에서는 로컬 머신을 포함하는 간단한 인벤토리 파일을 생성합니다.

Ansible 프로젝트용 디렉토리를 생성합니다.

mkdir -p ~/project/ansible-lab
cd ~/project/ansible-lab

이제 VS Code 편집기를 사용하여 인벤토리 파일을 생성합니다.

  1. 왼쪽 사이드바에서 "Explorer" 아이콘을 클릭합니다.
  2. ~/project/ansible-lab 디렉토리로 이동합니다.
  3. 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  4. 파일 이름을 inventory.ini로 지정합니다.
  5. 파일에 다음 내용을 추가합니다.
[local]
localhost ansible_connection=local

이 인벤토리 파일은 로컬호스트만 포함하는 local이라는 그룹을 정의하고, Ansible 이 SSH 를 사용하는 대신 로컬로 연결하도록 지정합니다.

Ansible 구성 파일 생성

기본 설정을 지정하기 위해 기본 Ansible 구성 파일을 생성해 보겠습니다.

  1. Explorer 패널에서 ansible-lab 디렉토리를 마우스 오른쪽 버튼으로 클릭하고 "New File"을 선택합니다.
  2. 파일 이름을 ansible.cfg로 지정합니다.
  3. 다음 내용을 추가합니다.
[defaults]
inventory = inventory.ini
host_key_checking = False

이 구성 파일은 Ansible 에게 기본적으로 inventory.ini 파일을 사용하도록 지시하고, 랩 환경에 유용한 SSH 호스트 키 확인을 비활성화합니다.

설정 테스트

간단한 명령을 실행하여 Ansible 설정을 테스트해 보겠습니다.

cd ~/project/ansible-lab
ansible local -m ping

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

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

이는 Ansible 이 올바르게 구성되었고 로컬 머신과 통신할 수 있음을 확인합니다.

파일 목록을 위한 기본 Ansible 플레이북 생성

이 단계에서는 파일 및 디렉토리를 나열하는 기본 Ansible 플레이북을 생성합니다. 플레이북은 관리 노드에서 실행할 작업 집합을 정의하는 YAML 파일입니다.

Ansible 플레이북 이해

플레이북을 생성하기 전에 플레이북이 무엇인지 이해해 보겠습니다.

  • 플레이북은 플레이 목록을 포함하는 YAML 파일입니다.
  • 각 플레이는 특정 호스트 그룹에서 실행할 작업 집합을 정의합니다.
  • 작업은 Ansible 모듈을 호출하는 개별 작업입니다.
  • 모듈은 특정 작업을 수행하는 재사용 가능한 코드 단위입니다.

첫 번째 플레이북 생성

/etc 디렉토리의 내용을 나열하는 간단한 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 ~/project/ansible-lab 디렉토리로 이동합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  3. 파일 이름을 list_files.yml로 지정합니다.
  4. 다음 내용을 추가합니다.
---
- name: List files and directories
  hosts: local
  tasks:
    - name: Get directory listing
      command: ls -l /etc
      register: directory_contents

    - name: Display directory contents
      debug:
        var: directory_contents.stdout_lines

이 플레이북이 수행하는 작업을 이해해 보겠습니다.

  • 첫 번째 줄 (---) 은 YAML 문서의 시작을 나타냅니다.
  • name: List files and directories는 플레이에 대한 설명적인 이름입니다.
  • hosts: local은 이 플레이가 local 그룹 (인벤토리에서 정의됨) 의 호스트에서 실행됨을 지정합니다.
  • tasks:는 실행할 작업 목록을 시작합니다.
  • 첫 번째 작업은 ls -l /etc 명령을 실행하고 결과를 directory_contents라는 변수에 저장합니다.
  • 두 번째 작업은 directory_contents.stdout_lines 변수의 내용을 표시합니다.

플레이북 실행

이제 플레이북을 실행해 보겠습니다.

cd ~/project/ansible-lab
ansible-playbook list_files.yml

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

PLAY [List files and directories] *****************************************************

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

TASK [Get directory listing] **********************************************************
changed: [localhost]

TASK [Display directory contents] *****************************************************
ok: [localhost] => {
    "directory_contents.stdout_lines": [
        "total 1088",
        "drwxr-xr-x  2 root root    4096 Apr 15 12:34 acpi",
        "drwxr-xr-x  3 root root    4096 Apr 15 12:34 alternatives",
        "-rw-r--r--  1 root root    3028 Aug  1  2017 bash.bashrc",
        "drwxr-xr-x  2 root root    4096 Apr 15 12:34 bash_completion.d",
        "... [more files and directories] ..."
    ]
}

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

출력은 권한, 소유자, 그룹, 크기 및 수정 날짜를 포함하는 긴 형식으로 /etc 디렉토리의 내용을 보여줍니다.

다른 디렉토리 사용

이제 /home/labex 디렉토리의 내용을 나열하도록 플레이북을 수정해 보겠습니다.

  1. 편집기에서 list_files.yml 파일을 엽니다.
  2. command 에서 경로를 /etc에서 /home/labex로 변경합니다.
  3. 다음 내용으로 파일을 저장합니다.
---
- name: List files and directories
  hosts: local
  tasks:
    - name: Get directory listing
      command: ls -l /home/labex
      register: directory_contents

    - name: Display directory contents
      debug:
        var: directory_contents.stdout_lines

플레이북을 다시 실행합니다.

ansible-playbook list_files.yml

이제 출력은 /etc 대신 /home/labex 디렉토리의 내용을 표시합니다.

장형식 목록을 위한 Ansible 의 File 모듈 사용

이전 단계에서는 ls -l 명령을 실행하기 위해 command 모듈을 사용했습니다. 이 방법도 작동하지만, Ansible 은 파일 및 디렉토리 작업을 위한 더 전용적인 모듈인 ansible.builtin.file 모듈을 제공합니다. 이 단계에서는 이 모듈과 ansible.builtin.find 모듈을 함께 사용하여 더 Ansible-native 방식으로 파일을 나열하는 방법을 배우겠습니다.

find 모듈 사용

ansible.builtin.find 모듈은 특정 기준과 일치하는 파일을 찾도록 설계되었습니다. command 모듈에 비해 파일을 나열하는 더 강력하고 유연한 방법을 제공합니다.

find 모듈을 사용하는 새 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 ~/project/ansible-lab 디렉토리로 이동합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  3. 파일 이름을 find_files.yml로 지정합니다.
  4. 다음 내용을 추가합니다.
---
- name: Find files with Ansible
  hosts: local
  tasks:
    - name: Find all files in /etc
      ansible.builtin.find:
        paths: /etc
        file_type: any
      register: found_files

    - name: Display the first 10 files
      debug:
        var: found_files.files[:10]

이 플레이북은 find 모듈을 사용하여 /etc 디렉토리의 모든 파일과 디렉토리를 찾은 다음 처음 10 개 항목을 표시합니다.

플레이북을 실행해 보겠습니다.

cd ~/project/ansible-lab
ansible-playbook find_files.yml

다음과 같은 각 파일에 대한 자세한 정보가 포함된 출력을 볼 수 있습니다.

  • 경로
  • 모드 (권한)
  • 소유자 및 그룹
  • 크기
  • 수정 시간

장형식 세부 정보가 있는 플레이북 생성

이제 모든 세부 정보와 함께 장형식으로 파일을 표시하는 더 포괄적인 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  2. 파일 이름을 long_format.yml로 지정합니다.
  3. 다음 내용을 추가합니다.
---
- name: List files in long format
  hosts: local
  tasks:
    - name: Find files in /etc
      ansible.builtin.find:
        paths: /etc
        file_type: any
        recurse: no
      register: found_files

    - name: Create a formatted list of files
      set_fact:
        formatted_files: "{{ formatted_files | default([]) + [item] }}"
      loop: "{{ found_files.files }}"
      loop_control:
        label: "{{ item.path }}"
      vars:
        item_info: >-
          {{ item.mode }} {{ item.uid | string | ljust(5) }}
          {{ item.gid | string | ljust(5) }} {{ item.size | string | ljust(10) }}
          {{ item.mtime | string | ljust(11) }} {{ item.path }}

    - name: Display files in long format
      debug:
        msg: "{{ formatted_files[:10] }}"

이 플레이북은 다음을 수행합니다.

  1. find 모듈을 사용하여 /etc 디렉토리에서 파일을 찾습니다.
  2. ls -l 명령의 출력과 유사한 형식화된 목록을 생성합니다.
  3. 목록에서 처음 10 개의 파일을 표시합니다.

플레이북을 실행해 보겠습니다.

ansible-playbook long_format.yml

출력은 ls -l 명령과 유사한 형식으로 파일 세부 정보를 표시합니다.

기준에 따라 파일 필터링

Ansible 모듈을 사용하는 한 가지 장점은 다양한 기준에 따라 파일을 필터링할 수 있다는 것입니다. .conf로 끝나는 구성 파일만 나열하는 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  2. 파일 이름을 filter_files.yml로 지정합니다.
  3. 다음 내용을 추가합니다.
---
- name: List filtered files in long format
  hosts: local
  tasks:
    - name: Find configuration files in /etc
      ansible.builtin.find:
        paths: /etc
        patterns: "*.conf"
        file_type: file
      register: conf_files

    - name: Display configuration files
      debug:
        msg: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size }} {{ item.mtime }} {{ item.path }}"
      loop: "{{ conf_files.files }}"
      loop_control:
        label: "{{ item.path }}"

이 플레이북은 다음을 수행합니다.

  1. find 모듈을 사용하여 .conf로 끝나는 /etc 디렉토리의 파일을 찾습니다.
  2. 각 파일을 세부 정보와 함께 표시합니다.

플레이북을 실행해 보겠습니다.

ansible-playbook filter_files.yml

출력은 /etc 디렉토리의 .conf 파일에 대한 세부 정보만 표시합니다.

Command 모듈과 비교

find 모듈의 출력과 기존 ls -l 명령을 비교하기 위해 플레이북을 하나 더 생성해 보겠습니다.

  1. Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  2. 파일 이름을 compare_methods.yml로 지정합니다.
  3. 다음 내용을 추가합니다.
---
- name: Compare listing methods
  hosts: local
  tasks:
    - name: Get directory listing with ls command
      command: ls -l /etc/passwd
      register: ls_output

    - name: Get file info with find module
      ansible.builtin.find:
        paths: /etc
        patterns: "passwd"
        file_type: file
      register: find_output

    - name: Display ls command output
      debug:
        var: ls_output.stdout_lines

    - name: Display find module output
      debug:
        var: find_output.files[0]

이 플레이북은 다음을 수행합니다.

  1. command 모듈을 사용하여 /etc/passwd 파일에 대해 ls -l을 실행합니다.
  2. find 모듈을 사용하여 동일한 파일을 찾습니다.
  3. 비교를 위해 두 출력을 모두 표시합니다.

플레이북을 실행해 보겠습니다.

ansible-playbook compare_methods.yml

이제 두 가지 방법의 차이점을 확인할 수 있습니다.

  • ls -l 명령은 기존 Unix 형식으로 한 줄의 텍스트를 제공합니다.
  • find 모듈은 Ansible 에서 조작할 수 있는 구조화된 데이터 객체를 제공합니다.

파일 목록을 위한 재사용 가능한 롤 생성

이 단계에서는 파일 목록을 위한 Ansible 롤을 생성하는 방법을 배우겠습니다. 롤은 플레이북을 구성하고 더 재사용 가능하게 만드는 방법입니다. 이는 여러 플레이북 또는 프로젝트에서 동일한 작업을 수행해야 할 때 특히 유용합니다.

Ansible 롤 이해

Ansible 롤은 표준 디렉토리 구조로 함께 그룹화된 작업, 변수, 파일, 템플릿 및 기타 리소스 집합입니다. 롤을 사용하면 코드를 쉽게 재사용하고 다른 사람과 공유할 수 있습니다.

롤의 표준 디렉토리 구조는 다음과 같습니다.

roles/
  rolename/
    tasks/      ## 롤의 주요 작업
    handlers/   ## 작업에 의해 트리거된 핸들러
    defaults/   ## 기본 변수
    vars/       ## 롤 변수
    files/      ## 정적 파일
    templates/  ## 템플릿
    meta/       ## 롤에 대한 메타데이터

파일 목록 롤 생성

장형식으로 파일을 나열하는 롤을 생성해 보겠습니다.

  1. 먼저 롤에 대한 디렉토리 구조를 생성합니다.
cd ~/project/ansible-lab
mkdir -p roles/file_lister/tasks
  1. 롤에 대한 주요 작업 파일을 생성합니다.
cd ~/project/ansible-lab
  1. Explorer 패널에서 ~/project/ansible-lab/roles/file_lister/tasks로 이동합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  3. 파일 이름을 main.yml로 지정합니다.
  4. 다음 내용을 추가합니다.
---
## Tasks for file_lister role

- name: Find files in the specified directory
  ansible.builtin.find:
    paths: "{{ path | default('/etc') }}"
    patterns: "{{ patterns | default('*') }}"
    file_type: "{{ file_type | default('any') }}"
    recurse: "{{ recurse | default(false) }}"
  register: found_files

- name: Display files in long format
  debug:
    msg: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size }} {{ item.mtime }} {{ item.path }}"
  loop: "{{ found_files.files | sort(attribute='path') }}"
  loop_control:
    label: "{{ item.path }}"
  when: show_details | default(true)

- name: Display only file paths
  debug:
    msg: "{{ item.path }}"
  loop: "{{ found_files.files | sort(attribute='path') }}"
  loop_control:
    label: "{{ item.path }}"
  when: not (show_details | default(true))

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

  1. 매개변수를 기반으로 지정된 디렉토리에서 파일을 찾습니다.
  2. 파일을 장형식 또는 경로만으로 표시합니다.
  3. 지정되지 않은 경우 매개변수에 대한 기본값을 사용합니다.

플레이북에서 롤 사용

이제 새 롤을 사용하는 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 ~/project/ansible-lab 디렉토리로 이동합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  3. 파일 이름을 use_role.yml로 지정합니다.
  4. 다음 내용을 추가합니다.
---
- name: Use file listing role
  hosts: local
  roles:
    - role: file_lister
      vars:
        path: "/etc"
        patterns: "*.conf"
        file_type: "file"
        show_details: true

이 플레이북은 다음을 수행합니다.

  1. 로컬 호스트에서 실행됩니다.
  2. file_lister 롤을 사용합니다.
  3. 롤의 동작을 사용자 정의하기 위해 변수를 설정합니다.

플레이북을 실행해 보겠습니다.

cd ~/project/ansible-lab
ansible-playbook use_role.yml

/etc 디렉토리의 모든 .conf 파일의 세부 정보를 보여주는 출력을 볼 수 있습니다.

롤 변수 사용자 정의

롤의 장점 중 하나는 변수를 변경하여 동작을 쉽게 사용자 정의할 수 있다는 것입니다. 다른 매개변수를 사용하여 롤을 사용하는 다른 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  2. 파일 이름을 custom_listing.yml로 지정합니다.
  3. 다음 내용을 추가합니다.
---
- name: Custom file listing
  hosts: local
  roles:
    - role: file_lister
      vars:
        path: "/home/labex"
        patterns: "*.yml"
        file_type: "file"
        show_details: false

이 플레이북은 다음을 수행합니다.

  1. file_lister 롤을 사용합니다.
  2. /home/labex 디렉토리를 보도록 설정합니다.
  3. YAML 파일 (*.yml) 을 필터링합니다.
  4. 파일 경로만 표시합니다 (전체 세부 정보 아님).

플레이북을 실행해 보겠습니다.

ansible-playbook custom_listing.yml

/home/labex 디렉토리의 모든 YAML 파일 목록을 세부 정보 없이 볼 수 있습니다.

고급 사용법: 보고서 생성

마지막으로, 롤을 사용하여 파일 보고서를 생성하는 더 고급 플레이북을 생성해 보겠습니다.

  1. Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  2. 파일 이름을 generate_report.yml로 지정합니다.
  3. 다음 내용을 추가합니다.
---
- name: Generate file listing report
  hosts: local
  vars:
    report_path: "~/project/ansible-lab/file_report.txt"
  tasks:
    - name: Find files in the specified directory
      ansible.builtin.find:
        paths: "/etc"
        patterns: "*.conf"
        file_type: "file"
      register: found_files

    - name: Create report header
      copy:
        dest: "{{ report_path }}"
        content: |
          File Listing Report
          Generated on: {{ ansible_date_time.date }} at {{ ansible_date_time.time }}
          -----------------------------------------------------------
          Mode       Owner  Group  Size       Modified    Path
          -----------------------------------------------------------
        force: yes

    - name: Append file information to report
      lineinfile:
        path: "{{ report_path }}"
        line: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size | string | ljust(10) }} {{ item.mtime }} {{ item.path }}"
      loop: "{{ found_files.files | sort(attribute='path') }}"
      loop_control:
        label: "{{ item.path }}"

    - name: Display report location
      debug:
        msg: "Report generated at {{ report_path }}"

이 플레이북은 다음을 수행합니다.

  1. /etc 디렉토리에서 .conf 파일을 찾습니다.
  2. 헤더가 있는 텍스트 파일을 생성합니다.
  3. 각 파일에 대한 정보를 보고서에 추가합니다.
  4. 보고서의 위치를 표시합니다.

플레이북을 실행해 보겠습니다.

ansible-playbook generate_report.yml

플레이북을 실행한 후 보고서를 볼 수 있습니다.

cat ~/project/ansible-lab/file_report.txt

/etc 디렉토리의 모든 .conf 파일을 나열하는 형식화된 보고서를 볼 수 있습니다.

요약

이 Lab 에서는 Ansible 을 사용하여 장형식으로 파일 및 디렉토리를 나열하는 방법을 배웠습니다. 다음 사항에 대한 실질적인 경험을 얻었습니다.

  1. 소프트웨어를 설치하고 인벤토리 파일 (inventory file) 을 생성하여 Ansible 을 설정합니다.
  2. ls -l 명령을 실행하기 위해 command 모듈을 사용하는 기본 플레이북을 생성합니다.
  3. Ansible 의 내장 file 및 find 모듈을 사용하여 파일에 대한 자세한 정보를 얻습니다.
  4. 다양한 옵션으로 파일을 나열하기 위한 재사용 가능한 Ansible 롤을 생성합니다.
  5. 파일 정보를 기반으로 형식화된 보고서를 생성합니다.

이러한 기술은 인프라 전반에서 파일 관리 작업을 자동화하고 파일 목록을 더 큰 자동화 워크플로우에 통합하는 데 도움이 됩니다. Ansible 을 계속 사용하면서 이러한 개념을 기반으로 파일, 디렉토리 및 해당 권한을 전체 환경에서 관리하는 더 복잡한 자동화를 구축할 수 있습니다.