패키지, 서비스 및 방화벽 자동화

AnsibleBeginner
지금 연습하기

소개

실제 RHEL 자동화 작업에서는 패키지 설치, 서비스 관리, 방화벽 규칙 설정을 하나의 통합된 플레이북으로 구성하는 경우가 많습니다.

이번 실습에서는 httpd 를 설치하고, 서비스가 활성화되어 실행 중인지 확인하며, firewalld 를 통해 HTTP 트래픽을 허용하고, 플레이북의 멱등성 (idempotence) 을 검증합니다.

RHEL 서비스 자동화 프로젝트 생성

이 단계에서는 RHEL 10 VM 에서 패키지, 서비스 및 방화벽 상태를 자동화하기 위한 단일 호스트 프로젝트를 생성합니다.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
host ansible_connection=local
EOF

플레이북은 로컬 RHEL 시스템에 실제 변경 사항을 적용하므로, 이 실습에서는 로컬 호스트 별칭을 사용합니다. 이를 통해 일반적인 인벤토리 타겟팅 방식을 사용하여 Ansible 의 패키지, 서비스 및 방화벽 모듈을 연습할 수 있습니다.

원하는 웹 서비스 상태 정의

이 단계에서는 원하는 상태를 변수에 저장합니다. 패키지, 서비스, 방화벽 이름을 변수로 관리하면 플레이북을 더 쉽게 수정할 수 있습니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령이 안정적으로 유지됩니다.

cd /home/labex/project/rhce-ansible
mkdir -p inventory/group_vars
cat > inventory/group_vars/web.yml <<'EOF'
web_package: httpd
web_service: httpd
firewall_service: http
EOF

이러한 이름을 변수로 유지하면 플레이북이 마치 정책처럼 읽힙니다. 즉, "이 패키지를 설치하고, 이 서비스를 관리하며, 이 firewalld 서비스를 허용하라"는 식입니다. 나중에 다른 서비스를 자동화하더라도 작업 구조는 동일하게 유지할 수 있습니다.

cat inventory/group_vars/web.yml

패키지, 서비스, 방화벽 플레이북 작성

이 단계에서는 권한 상승 (privilege escalation) 을 포함한 플레이북을 작성합니다. package, service 및 ansible.posix.firewalld 모듈을 사용하여 웹 스택을 구성합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
cat > playbooks/web-stack.yml <<'EOF'
---
- name: Configure a basic web stack
  hosts: web
  become: true
  gather_facts: false
  tasks:
    - name: Install web package
      ansible.builtin.package:
        name: "{{ web_package }}"
        state: present

    - name: Ensure web service is enabled and running
      ansible.builtin.service:
        name: "{{ web_service }}"
        state: started
        enabled: true

    - name: Allow web traffic through the firewall
      ansible.posix.firewalld:
        service: "{{ firewall_service }}"
        permanent: true
        immediate: true
        state: enabled
EOF

세 가지 작업은 RHEL 의 관련 상태를 통합합니다. package는 RPM 이 설치되었는지 확인하고, service는 systemd 유닛이 실행 중이며 활성화되어 있는지 확인하며, ansible.posix.firewalld는 HTTP 서비스를 즉시 그리고 영구적으로 허용합니다.

ansible-playbook playbooks/web-stack.yml --syntax-check

웹 스택 플레이북 실행

이 단계에서는 플레이북을 실행합니다. 패키지 설치는 RHEL 패키지 관리자를 사용하므로 파일만 다루는 실습보다 시간이 더 걸릴 수 있습니다.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/web-stack.yml | tee reports/web-stack-first.txt

첫 번째 실행은 dnf가 httpd를 설치하는 동안 시간이 조금 더 걸릴 수 있습니다. 완료 후 요약 내용을 읽고, 아래의 RHEL 도구를 사용하여 플레이북 출력뿐만 아니라 실제 시스템 상태를 확인하십시오.

rpm -q httpd

rpm -q는 설치된 httpd 패키지 이름과 버전을 출력해야 합니다.

systemctl is-active httpd

서비스가 active 상태라고 보고되어야 하며, 이는 웹 서비스가 현재 실행 중임을 확인해 줍니다.

sudo firewall-cmd --list-services | tr " " "
" | grep -Fx http

이 명령은 활성화된 firewalld 서비스를 확인하고 정확히 http가 포함되어 있는지 찾습니다. 방화벽을 여는 것은 서비스를 설치하고 시작하는 것과는 별개의 상태 관리 작업입니다.

멱등성 확인을 위한 재실행

이 단계에서는 동일한 플레이북을 다시 실행합니다. 패키지, 서비스, 방화벽이 이미 올바른 상태라면 요약 결과에 변경 사항이 없어야 합니다.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/web-stack.yml | tee reports/web-stack-second.txt

두 번째 실행은 더 빨라야 하며, 수정할 내용이 없어야 합니다. 이것이 패키지, 서비스, 방화벽 워크플로우를 결합한 상태에서의 멱등성 검증입니다.

grep -E 'host.*changed=0' reports/web-stack-second.txt

요약

패키지를 설치하고, 서비스를 관리하며, 방화벽을 열고, RHEL 시스템 상태를 검증했으며, 두 번째 실행을 통해 플레이북이 멱등성을 유지함을 확인했습니다.