LabHub
배우기 러닝패스 코스

RHEL-Family Administration

Actually Change RHEL With Ansible

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

이 실습은 진짜 RHEL 계열에서 돕니다

VM 안에 AlmaLinux 9 가 떠 있습니다. systemd 가 PID 1 로 돌고, SELinux 가 Enforcing 이며, firewalld 가 살아 있습니다. 플레이북이 시스템을 진짜로 바꾸고, 채점기는 그 결과를 시스템에서 직접 읽습니다.

기존 Ansible 코스는 파드에서 돌아 문법 확인까지가 전부였습니다. 여기서는 설정하지 않으면 실제로 막힙니다.

처음 뜨는 데 2분쯤 걸립니다.

목표

RHCE 시험이 실제로 묻는 것들을 한 바퀴 돕니다. 사용자, 서비스, SELinux, 방화벽, 템플릿, 그리고 멱등성입니다.

왜 중요한가

RHCE(EX294)는 "Ansible 문법을 아는가" 를 묻지 않습니다. 시스템을 원하는 상태로 만들 수 있는가를 묻습니다. 그래서 감점의 대부분이 문법이 아니라 이런 데서 나옵니다.

마지막 것이 특히 중요합니다. 멱등하지 않은 플레이북은 돌릴 때마다 무언가를 바꾸는 플레이북입니다. 그러면 "이번 실행이 무엇을 바꿨는가" 를 알 수 없고, 핸들러가 매번 서비스를 재시작해 불필요한 중단이 생깁니다.

단계

  1. /root/rhce/inventory.ini[webservers] 그룹으로 이 호스트를 넣고, /root/rhce/ansible.cfg 도 만드세요. ansible webservers -m ping 이 성공해야 합니다.
  2. /root/rhce/users.ymlwebadmin 그룹과 alice·bob 사용자(셸 /bin/bash, 보조 그룹 webadmin)를 만드세요. 반복(loop) 을 쓰세요.
  3. /root/rhce/service.ymlhttpd 를 설치하고 started 와 enabled 를 모두 만족시키세요. curl http://127.0.0.1/ 이 200 이어야 합니다.
  4. /root/rhce/selinux.ymlhttpd_can_network_connect 불리언을 영구히 켜고, /srv/webhttpd_sys_content_t 컨텍스트를 붙이세요.
  5. /root/rhce/firewall.ymlhttp 서비스를 방화벽에 여세요. runtime 과 permanent 를 모두 만족시켜야 합니다.
  6. /root/rhce/templates/index.html.j2 로 호스트명이 들어간 페이지를 만들고 /root/rhce/template.yml 로 배포하세요. 바뀔 때만 httpd 를 재시작하는 핸들러를 쓰세요.
  7. 위 전부를 부르는 /root/rhce/site.yml 을 만드세요. 그리고 상태를 일부러 흔들어 놓은 뒤(서비스 중지·파일 삭제·계정 삭제) 두 번 돌려 changed 수를 /root/rhce/idempotent.txtchanged_first=·changed_second= 로 적으세요. 첫 번째는 0보다 커야 하고 두 번째는 0 이어야 합니다. 흔들지 않고 재면 첫 실행부터 0 이라 "고쳐서 0 이 됐다" 와 "원래 아무것도 안 했다" 를 구분할 수 없습니다.
  8. /root/rhce/report.mdselinux=Enforcing, idempotent=yes, playbooks=<개수> 세 줄과 설명을 쓰세요.

참고

인벤토리와 설정 파일

/root/rhce/inventory.ini[webservers] 그룹으로 이 호스트를 넣고, /root/rhce/ansible.cfg 도 만드세요. ansible webservers -m ping 이 성공해야 합니다.

이 VM 자신을 대상으로 삼습니다. ansible_connection=local 을 쓰면 SSH 없이 바로 됩니다. ansible.cfg 에 인벤토리 경로를 적어 두면 매번 -i 를 주지 않아도 됩니다.

사용자와 그룹을 만든다

/root/rhce/users.ymlwebadmin 그룹과 alice·bob 사용자(셸 /bin/bash, 보조 그룹 webadmin)를 만드세요. 반복(loop) 을 쓰세요.

ansible.builtin.group 을 먼저, 그 다음 ansible.builtin.userloop 로 돌립니다. 그룹이 없는 상태에서 사용자를 만들면 실패합니다.

서비스는 두 가지를 만족해야 한다

/root/rhce/service.ymlhttpd 를 설치하고 started 와 enabled 를 모두 만족시키세요. curl http://127.0.0.1/ 이 200 이어야 합니다.

state: started 는 지금, enabled: true 는 재부팅 후입니다. 둘은 다른 이야기이고 시험에서 가장 자주 빠뜨리는 것입니다.

SELinux 는 켜져 있고 실제로 막는다

/root/rhce/selinux.ymlhttpd_can_network_connect 불리언을 영구히 켜고, /srv/webhttpd_sys_content_t 컨텍스트를 붙이세요.

불리언은 ansible.posix.sebooleanpersistent: true 를, 파일 컨텍스트는 community.general.sefcontext 뒤에 restorecon 을 씁니다.

runtime 과 permanent 는 다르다

/root/rhce/firewall.ymlhttp 서비스를 방화벽에 여세요. runtime 과 permanent 를 모두 만족시켜야 합니다.

permanent: true 는 설정 파일에, immediate: true 는 지금 도는 방화벽에 적용합니다. 둘 다 주어야 완성입니다.

바뀔 때만 재시작한다

/root/rhce/templates/index.html.j2 로 호스트명이 들어간 페이지를 만들고 /root/rhce/template.yml 로 배포하세요. 바뀔 때만 httpd 를 재시작하는 핸들러를 쓰세요.

template 태스크에 notify 를 달고 handlers 절에 재시작을 둡니다. 핸들러는 그 태스크가 changed 일 때만 돕니다.

두 번째 실행은 조용해야 한다

위 전부를 부르는 /root/rhce/site.yml 을 만드세요. 그리고 상태를 일부러 흔들어 놓은 뒤(서비스 중지·파일 삭제·계정 삭제) 두 번 돌려 changed 수를 /root/rhce/idempotent.txtchanged_first=·changed_second= 로 적으세요. 첫 번째는 0보다 커야 하고 두 번째는 0 이어야 합니다. 흔들지 않고 재면 첫 실행부터 0 이라 "고쳐서 0 이 됐다" 와 "원래 아무것도 안 했다" 를 구분할 수 없습니다.

site.yml 에서 앞의 플레이북들을 import_playbook 으로 부르고 두 번 돌립니다. 두 번째의 changed 가 0 이 아니면 그 태스크를 찾으세요.

무엇을 배웠나

/root/rhce/report.mdselinux=Enforcing, idempotent=yes, playbooks=<개수> 세 줄과 설명을 쓰세요.

selinux=, idempotent=, playbooks= 세 줄과 함께, 시험에서 감점이 나는 자리들을 정리하세요.