소개
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 편집기를 사용하여 인벤토리 파일을 생성합니다.
- 왼쪽 사이드바에서 "Explorer" 아이콘을 클릭합니다.
~/project/ansible-lab디렉토리로 이동합니다.- 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
inventory.ini로 지정합니다. - 파일에 다음 내용을 추가합니다.
[local]
localhost ansible_connection=local
이 인벤토리 파일은 로컬호스트만 포함하는 local이라는 그룹을 정의하고, Ansible 이 SSH 를 사용하는 대신 로컬로 연결하도록 지정합니다.
Ansible 구성 파일 생성
기본 설정을 지정하기 위해 기본 Ansible 구성 파일을 생성해 보겠습니다.
- Explorer 패널에서
ansible-lab디렉토리를 마우스 오른쪽 버튼으로 클릭하고 "New File"을 선택합니다. - 파일 이름을
ansible.cfg로 지정합니다. - 다음 내용을 추가합니다.
[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 디렉토리의 내용을 나열하는 간단한 플레이북을 생성해 보겠습니다.
- Explorer 패널에서
~/project/ansible-lab디렉토리로 이동합니다. - 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
list_files.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- 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 디렉토리의 내용을 나열하도록 플레이북을 수정해 보겠습니다.
- 편집기에서
list_files.yml파일을 엽니다. - command 에서 경로를
/etc에서/home/labex로 변경합니다. - 다음 내용으로 파일을 저장합니다.
---
- 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 모듈을 사용하는 새 플레이북을 생성해 보겠습니다.
- Explorer 패널에서
~/project/ansible-lab디렉토리로 이동합니다. - 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
find_files.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- 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
다음과 같은 각 파일에 대한 자세한 정보가 포함된 출력을 볼 수 있습니다.
- 경로
- 모드 (권한)
- 소유자 및 그룹
- 크기
- 수정 시간
장형식 세부 정보가 있는 플레이북 생성
이제 모든 세부 정보와 함께 장형식으로 파일을 표시하는 더 포괄적인 플레이북을 생성해 보겠습니다.
- Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
long_format.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- 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] }}"
이 플레이북은 다음을 수행합니다.
find모듈을 사용하여/etc디렉토리에서 파일을 찾습니다.ls -l명령의 출력과 유사한 형식화된 목록을 생성합니다.- 목록에서 처음 10 개의 파일을 표시합니다.
플레이북을 실행해 보겠습니다.
ansible-playbook long_format.yml
출력은 ls -l 명령과 유사한 형식으로 파일 세부 정보를 표시합니다.
기준에 따라 파일 필터링
Ansible 모듈을 사용하는 한 가지 장점은 다양한 기준에 따라 파일을 필터링할 수 있다는 것입니다. .conf로 끝나는 구성 파일만 나열하는 플레이북을 생성해 보겠습니다.
- Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
filter_files.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- 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 }}"
이 플레이북은 다음을 수행합니다.
find모듈을 사용하여.conf로 끝나는/etc디렉토리의 파일을 찾습니다.- 각 파일을 세부 정보와 함께 표시합니다.
플레이북을 실행해 보겠습니다.
ansible-playbook filter_files.yml
출력은 /etc 디렉토리의 .conf 파일에 대한 세부 정보만 표시합니다.
Command 모듈과 비교
find 모듈의 출력과 기존 ls -l 명령을 비교하기 위해 플레이북을 하나 더 생성해 보겠습니다.
- Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
compare_methods.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- 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]
이 플레이북은 다음을 수행합니다.
command모듈을 사용하여/etc/passwd파일에 대해ls -l을 실행합니다.find모듈을 사용하여 동일한 파일을 찾습니다.- 비교를 위해 두 출력을 모두 표시합니다.
플레이북을 실행해 보겠습니다.
ansible-playbook compare_methods.yml
이제 두 가지 방법의 차이점을 확인할 수 있습니다.
ls -l명령은 기존 Unix 형식으로 한 줄의 텍스트를 제공합니다.find모듈은 Ansible 에서 조작할 수 있는 구조화된 데이터 객체를 제공합니다.
파일 목록을 위한 재사용 가능한 롤 생성
이 단계에서는 파일 목록을 위한 Ansible 롤을 생성하는 방법을 배우겠습니다. 롤은 플레이북을 구성하고 더 재사용 가능하게 만드는 방법입니다. 이는 여러 플레이북 또는 프로젝트에서 동일한 작업을 수행해야 할 때 특히 유용합니다.
Ansible 롤 이해
Ansible 롤은 표준 디렉토리 구조로 함께 그룹화된 작업, 변수, 파일, 템플릿 및 기타 리소스 집합입니다. 롤을 사용하면 코드를 쉽게 재사용하고 다른 사람과 공유할 수 있습니다.
롤의 표준 디렉토리 구조는 다음과 같습니다.
roles/
rolename/
tasks/ ## 롤의 주요 작업
handlers/ ## 작업에 의해 트리거된 핸들러
defaults/ ## 기본 변수
vars/ ## 롤 변수
files/ ## 정적 파일
templates/ ## 템플릿
meta/ ## 롤에 대한 메타데이터
파일 목록 롤 생성
장형식으로 파일을 나열하는 롤을 생성해 보겠습니다.
- 먼저 롤에 대한 디렉토리 구조를 생성합니다.
cd ~/project/ansible-lab
mkdir -p roles/file_lister/tasks
- 롤에 대한 주요 작업 파일을 생성합니다.
cd ~/project/ansible-lab
- Explorer 패널에서
~/project/ansible-lab/roles/file_lister/tasks로 이동합니다. - 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
main.yml로 지정합니다. - 다음 내용을 추가합니다.
---
## 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))
이 롤은 다음을 수행합니다.
- 매개변수를 기반으로 지정된 디렉토리에서 파일을 찾습니다.
- 파일을 장형식 또는 경로만으로 표시합니다.
- 지정되지 않은 경우 매개변수에 대한 기본값을 사용합니다.
플레이북에서 롤 사용
이제 새 롤을 사용하는 플레이북을 생성해 보겠습니다.
- Explorer 패널에서
~/project/ansible-lab디렉토리로 이동합니다. - 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
use_role.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- name: Use file listing role
hosts: local
roles:
- role: file_lister
vars:
path: "/etc"
patterns: "*.conf"
file_type: "file"
show_details: true
이 플레이북은 다음을 수행합니다.
- 로컬 호스트에서 실행됩니다.
file_lister롤을 사용합니다.- 롤의 동작을 사용자 정의하기 위해 변수를 설정합니다.
플레이북을 실행해 보겠습니다.
cd ~/project/ansible-lab
ansible-playbook use_role.yml
/etc 디렉토리의 모든 .conf 파일의 세부 정보를 보여주는 출력을 볼 수 있습니다.
롤 변수 사용자 정의
롤의 장점 중 하나는 변수를 변경하여 동작을 쉽게 사용자 정의할 수 있다는 것입니다. 다른 매개변수를 사용하여 롤을 사용하는 다른 플레이북을 생성해 보겠습니다.
- Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
custom_listing.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- name: Custom file listing
hosts: local
roles:
- role: file_lister
vars:
path: "/home/labex"
patterns: "*.yml"
file_type: "file"
show_details: false
이 플레이북은 다음을 수행합니다.
file_lister롤을 사용합니다./home/labex디렉토리를 보도록 설정합니다.- YAML 파일 (*.yml) 을 필터링합니다.
- 파일 경로만 표시합니다 (전체 세부 정보 아님).
플레이북을 실행해 보겠습니다.
ansible-playbook custom_listing.yml
/home/labex 디렉토리의 모든 YAML 파일 목록을 세부 정보 없이 볼 수 있습니다.
고급 사용법: 보고서 생성
마지막으로, 롤을 사용하여 파일 보고서를 생성하는 더 고급 플레이북을 생성해 보겠습니다.
- Explorer 패널에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
- 파일 이름을
generate_report.yml로 지정합니다. - 다음 내용을 추가합니다.
---
- 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 }}"
이 플레이북은 다음을 수행합니다.
/etc디렉토리에서.conf파일을 찾습니다.- 헤더가 있는 텍스트 파일을 생성합니다.
- 각 파일에 대한 정보를 보고서에 추가합니다.
- 보고서의 위치를 표시합니다.
플레이북을 실행해 보겠습니다.
ansible-playbook generate_report.yml
플레이북을 실행한 후 보고서를 볼 수 있습니다.
cat ~/project/ansible-lab/file_report.txt
/etc 디렉토리의 모든 .conf 파일을 나열하는 형식화된 보고서를 볼 수 있습니다.
요약
이 Lab 에서는 Ansible 을 사용하여 장형식으로 파일 및 디렉토리를 나열하는 방법을 배웠습니다. 다음 사항에 대한 실질적인 경험을 얻었습니다.
- 소프트웨어를 설치하고 인벤토리 파일 (inventory file) 을 생성하여 Ansible 을 설정합니다.
ls -l명령을 실행하기 위해 command 모듈을 사용하는 기본 플레이북을 생성합니다.- Ansible 의 내장 file 및 find 모듈을 사용하여 파일에 대한 자세한 정보를 얻습니다.
- 다양한 옵션으로 파일을 나열하기 위한 재사용 가능한 Ansible 롤을 생성합니다.
- 파일 정보를 기반으로 형식화된 보고서를 생성합니다.
이러한 기술은 인프라 전반에서 파일 관리 작업을 자동화하고 파일 목록을 더 큰 자동화 워크플로우에 통합하는 데 도움이 됩니다. Ansible 을 계속 사용하면서 이러한 개념을 기반으로 파일, 디렉토리 및 해당 권한을 전체 환경에서 관리하는 더 복잡한 자동화를 구축할 수 있습니다.


