클라우드 아카이브

[Ansible] 앤서블 겔럭시를 사용하여 LVM 구성 본문

Cloud Native Solution/[IaC] ansible

[Ansible] 앤서블 겔럭시를 사용하여 LVM 구성

Cloud Engineer 2021. 11. 5. 16:35
반응형

개요

앤서블 겔럭시를 사용하여 Role을 기반으로 한 Physical Volume, Volume Group, Logical Volume을 생성하고 파일시스템 구성 및 마운팅하는 플레이북을 작성하겠습니다. 앤서블의 공식 홈페이지에 게시된 앤서블 모듈 관련 레퍼런스를 기반으로 해당 코드를 참고했으며 공식 문서를 보고싶으신 분들은 여기를 클릭해주시면 감사하겠습니다.

앤서블 겔럭시에 대한 개념과 디렉토리 구조에 대한 학습을 하고싶으신 분들은 여기를 클릭해주시면 됩니다.

디렉토리 구조

.
├── 02-configure-lvm	# LVM 및 파일시스템 구성 등을 구현할 Role
│   ├── README.md
│   ├── tasks			# Playbook 역할을 담당하는 디렉터리
│   │   └── main.yml
│   └── vars			# 해당 Role에서 사용할 변수 (우선순위 높음)
│       └── main.yml
├── README.md
├── inventory.yaml		# 작업 대상 서버들 지정
└── main.yml			# 전체 role의 이행 순서를 중앙에서 관리

구현 프로세스

1. 앤서블 겔럭시 role 생성

# 앤서블 겔럭시 신규 role 생성
$ ansible-galaxy role init 02-configure-lvm

2. 앤서블 인벤토리 작성

작업 대상을 지정하기 위해 인벤토리를 작성하도록 하겠습니다. 인벤토리 작성 방법은 2가지가 있는데 cfg 파일 형식으로 작성하거나 yaml 파일로 작성하는 것입니다. 타 블로그에서 cfg 파일 형식으로 작성해놓은 예제가 많기 때문에 본 포스팅에서는 yaml 파일로 작성해보겠습니다.

# ./my-inventory.yml
---
server-group:	# 그룹 지정
    hosts:
        my-server:  # 호스트 지정
            ansible_host: 1.1.1.1 # 작업 대상 호스트의 IP 입력
            ansible_port: 22
            ansible_user: admin
            ansible_password: "12345"
            ansible_connection: ssh	# ssh | winrm | ...

server-group이라는 호스트 그룹을 만들고 my-server라는 호스트이름을 가진 서버를 server-group에 소속시키켰습니다.

3. Role 관리를 담당하는 플레이북 생성

중앙에서 Role을 관리하는 플레이북을 생성해줍니다. 해당 플레이북을 통해 여러 개의 Role을 중앙에서 이행할 수 있는 편의성을 제공합니다.

02-configure-lvm/main.yml
---
- name: LVM 및 파일시스템 구성, 마운팅
  hosts: server-group
  become: yes	# root 권한 허용
  roles:
    - 02-configure-lvm

4.  패키지 업데이트 및 LVM 패키지 설치

LVM을 구성하기 위해 필요한 LVM2 패키지를 설치하겠습니다. 해당 패키지를 설치하기 위해서는 패키지 업데이트가 선행되어야 합니다.

# 02-configure-lvm/tasks/main.yml
---
# 1. 전체 패키지 업데이트
- name: update all packages
  yum:
    name: "*"
    state: latest

# 2. lvm2 패키지 설치 (변수 명으로 지정)
- name: ensure a list of packages installed
  yum:
    name: "{{ packages }}"
    state: present
구현 모듈에서 state를 명시하는 이유
앤서블의 강력한 특징 중 하나인 멱등성을 지키기 위해서입니다. 동일한 명령어를 반복해서 실행시키더라도 상태가 항상 동일하게 유지되어야 하기 때문에 이를 state를 통해 명시하는 것입니다. 앤서블의 개념 및 특징에 대해 더 학습하고 싶으신 분들은 여기를 클릭해주시면 감사하겠습니다.

4. 우선순위가 낮은 변수 지정 (defaults)

패키지 설치 및 LVM을 구성하기 위해 필요한 변수를 지정해줍니다. lvm_items와 같이 List 자료구조와 Dictionary 자료구조를 함께 사용하면 다수의 변수명 지정 시 유용하게 사용할 수 있습니다. 즉, 변수의 재사용성을 높여주기 위해 해당 자료구조를 사용했습니다.

# 02-configure-lvm/defaults/main.yml
---
# 설치할 패키지와 관련된 변수
packages:
    - lvm2
# LVM을 구성하기 위한 이름 및 마운팅 경로 지정
lvm_items:
- {
    pv_name: "/dev/xvdb",
    vg_name: "vg_name",
    lv_name: "lv_name",
    mount_points: "/home/oracle/ora_data"
}

5. LVM 및 파일시스템 구성

Physical Volume, Volume Group 생성 - Logical Volume 생성 - 파일시스템 생성 순서로 아래와 같이 작업을 진행해줍니다.

# 02-configure-lvm/tasks/main.yml
---
...

# 1. Physical Volume 및 Volume Group을 생성해줍니다.
- name: Create a volume group
  lvg:
    pvs: "{{ item.pv_name }}"
    vg: "{{ item.vg_name }}"
    state: present
  loop: "{{lvm_items}}"		# Loop를 사용하여 List 자료구조에 담긴 각 Dictionary를 item으로 가져옵니다.

# 2. 1.에서 생성된 Volume Group으로 Logical Volume을 생성해줍니다. (Volume Group의 전체 공간을 사용)
- name: create the logical volume to consume all remaining space in the volume group
  lvol:
    vg: "{{ item.vg_name }}"
    lv: "{{ item.lv_name }}"
    size: 100%FREE      # 200g | 100%FREE | 100%vg | 100%PVS
    state: present
  loop: "{{lvm_items}}"

# 3. 파일시스템 타입으로 ext4를 지정하여 생성된 Logical Volume에 해당 파일시스템을 입힙니다.
- name: Create a ext4 filesystem
  filesystem:
    fstype: ext4
    dev: "/dev/{{ item.vg_name }}/{{ item.lv_name }}"
  loop: "{{lvm_items}}"
Loop 기능이란?
Ansible offers the loop, with_<lookup>, and until keywords to execute a task multiple times. Examples of commonly-used loops include changing ownership on several files and/or directories with the file module, creating multiple users with the user module, and repeating a polling step until a certain result is reached.

NoteWe added loop in Ansible 2.5. It is not yet a full replacement for with_<lookup>, but we recommend it for most use cases.We have not deprecated the use of with_<lookup> - that syntax will still be valid for the foreseeable future.We are looking to improve loop syntax - watch this page and the changelog for updates.
<앤서블 공식 레퍼런스에 명시된 Loop 관련 문서>

Loop는 작업을 여러번 사용할 때 사용되는 기능 중 하나로, Ansible 2.5 버전 업데이트 때 Loop가 추가됨과 동시에 해당 기능을 지속적으로 개선해나갈 것을 명시해놨습니다. Loop 기능을 설명하기 위해 위 코드를 예로 들겠습니다. lvm_items라는 리스트 자료구조에 담긴 각 Dictionary를 item이라는 변수로 가져와서 프로그래밍 언어의 iterator와 같이 사용할 수 있도록 해주는 기능입니다.

6. 마운팅

마지막으로 LVM 및 파일시스템 구성이 끝난 영역을 사용자가 이용할 수 있도록 마운팅을 해줍니다.

# 02-configure-lvm/tasks/main.yml
---

...
# 1. LVM 및 파일시스템 구성이 끝난 영역을 실제 OS에서 사용할 수 있도록 마운팅
- name: mount up device by path
  mount:
    path: "{{ item.mount_points }}"
    src: "/dev/{{ item.vg_name }}/{{ item.lv_name }}"
    fstype: ext4
    state: mounted
  loop: "{{lvm_items}}"

앤서블의 모듈 관련 공식 문서를 보면 mounted를 state로 지정할 경우 fstab에 관련 내용을 append해줌으로써 시스템을 재부팅하더라도 동일하게 사용할 수 있도록 해줍니다. 반대로, unmounted는 fstab에 unmount되었음을 업데이트해주지 않는다는 부분은 참고해주시면 될 것 같습니다.

state
string / required
Choices:
absent

mounted
present
unmounted
If mounted, the device will be actively mounted and appropriately configured in fstab. If the mount point is not present, the mount point will be created.
If unmounted, the device will be unmounted without changing fstab.
present only specifies that the device is to be configured in fstab and does not trigger or require a mount.
absent specifies that the device mount's entry will be removed from fstab and will also unmount the device and remove the mount point.

출처: 앤서블 공식 문서

7. 실행 결과

$ ansible-playbook -i my-inventory.yaml main.yml -vvv
ansible-playbook [core 2.11.6]
  config file = None
		...
  python version = 3.9.7 (default, Oct 12 2021, 22:38:23) [Clang 13.0.0 (clang-1300.0.29.3)]
  jinja version = 3.0.2
  libyaml = True
No config file found; using defaults
		...

PLAY RECAP ******************************************************************************
my-server                  : ok=11   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$

마무리

앤서블 겔럭시를 사용하여 LVM 및 파일시스템을 구성하고 마운팅하는 모듈을 구현해봤습니다. 이상으로 포스팅을 마치겠습니다.

Comments