Red Hat Certified Engineer (RHCE) #13 system roles (rhel-system-roles)

8 분 소요

#12 Collection: Galaxy, Automation Hub에서 collection으로 role과 모듈을 묶어 배포하고 가져오는 법을 익혔습니다. 이번 글에서는 Red Hat이 직접 만들어 검증한 role 모음인 rhel-system-roles를 다룹니다. RHCSA에서 손으로 하던 시간 동기화,firewall,SELinux 설정을, 직접 role을 짜지 않고 이미 검증된 role을 가져다 변수만 채워 자동화하는 방식입니다.

rhel-system-roles는 시험에서 점수를 빠르게 확보하는 지름길입니다. NTP나 firewall, SELinux를 설정하라는 문제가 나오면 직접 작업을 한 줄씩 쓰는 대신, 해당 role을 호출하고 변수 몇 개만 채우면 끝나기 때문입니다. 이 글에서는 설치부터 문서 활용, 자주 쓰는 role의 변수까지 정리하겠습니다.

rhel-system-roles란 무엇인가 #

rhel-system-roles는 Red Hat이 제공하고 검증한 Ansible role 모음입니다. RHEL 시스템의 흔한 관리 작업을 표준화된 인터페이스로 추상화한 것으로, 사용자는 내부 구현을 몰라도 변수 몇 개만 채우면 시간 동기화,firewall,SELinux 같은 구성을 일관되게 적용할 수 있습니다.

핵심 가치는 추상화입니다. RHCSA에서 chronyd를 설치하고 /etc/chrony.conf를 편집하고 서비스를 enable하던 일련의 손작업을, timesync role은 timesync_ntp_servers 변수 하나로 끝냅니다. RHEL 버전이 바뀌어 내부 도구가 달라져도 role의 변수 인터페이스는 유지되므로, 동일한 플레이북이 여러 버전에서 동작합니다.

이 role들은 Red Hat이 직접 테스트하고 지원하므로, 직접 짠 role보다 멱등성과 안정성이 보장됩니다. 시험에서도 신뢰하고 쓸 수 있습니다.

직접 짠 role과의 차이 #

#11에서 직접 role을 작성했습니다. 직접 짠 role은 내가 작업과 변수를 모두 설계해야 하지만, rhel-system-roles는 인터페이스만 알면 되는 완성품입니다. 시험에서 “이런 설정을 적용하라"는 문제가 나왔을 때, 직접 작업을 쓸지 system role을 쓸지는 자유지만, system role 쪽이 더 빠르고 실수가 적습니다.

설치 #

rhel-system-roles는 두 가지 경로로 설치합니다. 환경에 맞는 쪽을 쓰면 됩니다.

1) RPM 패키지로 설치 #

RHEL의 기본 repository에서 패키지로 설치하는 방식입니다. 시험 환경에서 가장 흔합니다.

RPM으로 설치
sudo dnf install -y rhel-system-roles

설치하면 role 본체는 /usr/share/ansible/roles/에, 문서와 example은 /usr/share/doc/rhel-system-roles/에 자리합니다. 이 경로의 role들은 redhat.rhel_system_roles.timesync 같은 FQCN으로도, rhel-system-roles.timesync 같은 짧은 이름으로도 참조할 수 있습니다.

2) collection으로 설치 #

Ansible Galaxy나 Automation Hub에서 collection 형태로 가져오는 방식입니다. 인터넷이 되는 환경에서 최신 버전을 받을 때 씁니다.

collection으로 설치
ansible-galaxy collection install redhat.rhel_system_roles

collection으로 설치하면 role은 redhat.rhel_system_roles.<role> FQCN으로 호출합니다. 예를 들어 timesync는 redhat.rhel_system_roles.timesync가 됩니다.

시험 환경은 인터넷이 차단되므로 RPM 설치가 기본입니다. 패키지가 이미 깔려 있는지 rpm -q rhel-system-roles로 먼저 확인하겠습니다.

문서와 example을 활용하기 #

rhel-system-roles를 잘 쓰는 핵심은 문서를 직접 읽는 습관입니다. 인터넷이 없는 시험에서 각 role의 변수 이름을 외울 수는 없으므로, 로컬 문서를 빠르게 찾아 example을 복사해 쓰는 방식이 정답입니다.

문서 위치 #

설치된 문서는 다음 경로에 있습니다.

문서 위치 확인
ls /usr/share/doc/rhel-system-roles/

각 role마다 하위 디렉터리가 있고, 그 안에 README.md와 example playbook이 들어 있습니다.

timesync 문서 확인
ls /usr/share/doc/rhel-system-roles/timesync/
# README.md  example-timesync-playbook.yml  ...

README.md에는 그 role이 받는 변수 목록과 설명, 기본값이 정리되어 있습니다. example playbook에는 바로 실행 가능한 형태의 호출 예시가 들어 있습니다.

example 복사 패턴 #

시험에서 가장 빠른 길은 example playbook을 작업 디렉터리로 복사해 변수만 수정하는 방식입니다. 변수 이름을 외우거나 오타를 낼 위험이 사라집니다.

example playbook 복사
cp /usr/share/doc/rhel-system-roles/timesync/example-timesync-playbook.yml \
   ~/myplaybook.yml

복사한 뒤 README.md를 참고하며 hosts와 변수 값만 환경에 맞게 고치면 됩니다. 이 패턴은 timesync뿐 아니라 모든 system role에 동일하게 적용됩니다.

자주 쓰는 role과 변수 #

rhel-system-roles에는 수십 개의 role이 들어 있지만, 시험과 실무에서 자주 쓰는 것은 정해져 있습니다. 주요 role과 핵심 변수를 정리하겠습니다.

role용도핵심 변수
timesyncNTP 시간 동기화timesync_ntp_servers
firewallfirewalld 규칙firewall(서비스,포트,zone 목록)
selinuxSELinux mode,boolean,포트,fcontextselinux_state, selinux_booleans
storageLVM,파일시스템 구성storage_pools, storage_volumes
network네트워크 인터페이스,연결network_connections
postfix메일 전송 에이전트 설정postfix_conf

각 role의 정확한 변수 목록은 항상 해당 README.md에서 확인하겠습니다. 아래에서 시험 단골인 세 가지를 예제로 다룹니다.

timesync role #

timesync role은 NTP 서버 목록을 받아 chronyd를 설치하고 설정한 뒤 동기화합니다. RHCSA의 시간 동기화 작업을 한 블록으로 대체합니다.

timesync 플레이북
---
- name: NTP 시간 동기화 구성
  hosts: all
  become: true
  vars:
    timesync_ntp_servers:
      - hostname: 0.kr.pool.ntp.org
        iburst: true
      - hostname: 1.kr.pool.ntp.org
        iburst: true
  roles:
    - redhat.rhel_system_roles.timesync

timesync_ntp_servers는 각 항목에 hostnameiburst를 받습니다. iburst: true는 초기 동기화를 빠르게 해 주는 옵션이며, RHCSA에서 손으로 /etc/chrony.conf에 적던 값과 동일합니다.

firewall role #

firewall role은 firewalld의 서비스,포트,zone을 선언적으로 관리합니다. firewall 변수에 규칙 목록을 주면 됩니다.

firewall 플레이북
---
- name: firewall 규칙 구성
  hosts: webservers
  become: true
  vars:
    firewall:
      - service: http
        state: enabled
        permanent: true
      - service: https
        state: enabled
        permanent: true
      - port: 8080/tcp
        state: enabled
        permanent: true
  roles:
    - redhat.rhel_system_roles.firewall

각 규칙은 service 또는 port를 지정하고, state로 enabled,disabled를, permanent: true로 재부팅 후에도 유지되도록 합니다. RHCSA에서 firewall-cmd --add-service--permanent로 하던 작업을 그대로 추상화한 것입니다.

selinux role #

selinux role은 SELinux mode와 boolean, 포트 레이블, 파일 컨텍스트를 관리합니다. boolean을 영구로 켜거나 포트에 레이블을 다는 작업에 자주 씁니다.

selinux 플레이북
---
- name: SELinux 구성
  hosts: webservers
  become: true
  vars:
    selinux_state: enforcing
    selinux_booleans:
      - name: httpd_can_network_connect
        state: on
        persistent: true
    selinux_ports:
      - ports: "8080"
        proto: tcp
        setype: http_port_t
        state: present
  roles:
    - redhat.rhel_system_roles.selinux

selinux_state로 enforcing,permissive를 지정하고, selinux_booleans로 boolean을 영구로(persistent: true) 설정하며, selinux_ports로 포트에 type을 답니다. RHCSA의 setsebool -Psemanage port -a에 대응합니다.

selinux role을 쓸 때 boolean이나 fcontext 변경 후 재부팅이 필요한 상황이 있으면 role이 안내합니다. README의 주의 사항을 한 번 훑어보는 편이 안전합니다.

여러 role을 한 플레이북에서 #

system role은 서로 독립적이므로 한 플레이북에서 여러 개를 함께 호출할 수 있습니다. 웹 서버 한 대를 구성한다면 다음처럼 묶습니다.

여러 role 통합 플레이북
---
- name: 웹 서버 표준 구성
  hosts: webservers
  become: true
  vars:
    timesync_ntp_servers:
      - hostname: 0.kr.pool.ntp.org
        iburst: true
    firewall:
      - service: http
        state: enabled
        permanent: true
    selinux_booleans:
      - name: httpd_can_network_connect
        state: on
        persistent: true
  roles:
    - redhat.rhel_system_roles.timesync
    - redhat.rhel_system_roles.firewall
    - redhat.rhel_system_roles.selinux

각 role은 자기 변수만 읽으므로 변수를 한곳에 모아 두어도 충돌하지 않습니다. 다만 변수가 많아지면 group_vars로 분리하는 편이 읽기 좋습니다.

멱등성 확인 #

system role은 Red Hat이 멱등성을 보장하지만, 작성한 플레이북이 의도대로 동작하는지는 직접 확인하겠습니다. 두 번 실행해 두 번째에서 changed가 0이 되는지 보는 습관은 #5부터 이어진 원칙입니다.

멱등성 검증 — 두 번 실행
ansible-navigator run -m stdout site.yml
ansible-navigator run -m stdout site.yml

두 번째 실행에서 changed=0이면 멱등성이 지켜진 것입니다. 변수 값이 이미 적용된 상태이므로 role이 아무 변경도 하지 않습니다.

시험 포인트 #

  • example을 복사해 변수만 수정하는 흐름을 몸에 익힌다. /usr/share/doc/rhel-system-roles/<role>/의 example playbook을 작업 디렉터리로 복사하고, 같은 디렉터리의 README.md로 변수를 확인한 뒤 값만 고치는 것이 가장 빠르고 안전합니다.
  • role 호출 이름을 정확히 쓴다. collection으로 설치했다면 redhat.rhel_system_roles.timesync FQCN을, RPM 환경의 짧은 이름이라면 rhel-system-roles.timesync를 씁니다. 환경에 깔린 형태를 먼저 확인하겠습니다.
  • NTP,firewall,SELinux는 단골 출제다. 시간 동기화는 timesync, firewall 규칙은 firewall, SELinux boolean,포트는 selinux role로 푸는 흐름을 미리 손에 익혀 두겠습니다.
  • 영구 적용 옵션을 빠뜨리지 않는다. firewall의 permanent: true, selinux boolean의 persistent: true처럼 재부팅 후에도 유지되는 설정을 명시해야 채점에서 감점되지 않습니다.
  • 멱등성을 두 번 실행으로 검증한다. 두 번째 실행에서 changed가 0인지 확인하는 습관을 들이겠습니다.

정리 #

이번 글에서 잡은 것:

  • rhel-system-roles는 Red Hat이 검증한 role 모음으로, RHCSA 작업을 변수 인터페이스로 추상화합니다.
  • 설치는 dnf install rhel-system-roles(RPM) 또는 ansible-galaxy collection install redhat.rhel_system_roles(collection) 두 경로가 있고, 시험 환경은 RPM이 기본입니다.
  • 문서는 /usr/share/doc/rhel-system-roles/에 있으며, example playbook을 복사해 변수만 수정하는 패턴이 가장 빠릅니다.
  • 자주 쓰는 role은 timesync,firewall,selinux,storage,network,postfix이고, 각 role의 변수는 해당 README.md로 확인합니다.
  • NTP,firewall,SELinux 설정은 시험 단골이므로 세 role의 핵심 변수를 손에 익혀 두겠습니다.

다음: RHCSA 자동화 1 #

여기까지가 Ansible 문법과 구조화(role,collection,system roles) 영역입니다. 이제 시험 비중의 절반을 차지하는 RHCSA 작업 자동화로 들어갑니다.

#14 RHCSA 자동화 1: 사용자/그룹, 패키지/repository에서는 user,group 모듈로 계정을 만들고, dnf,yum_repository 모듈로 패키지와 repository를 관리하는 법을, 시험에서 자주 나오는 유형 그대로 플레이북으로 작성하며 정리하겠습니다.

X