반응형
RHCE (EX294) 시험 준비
문제 11. 파일 내용 수정
📌 문제
/home/admin/ansible/issue.yml 플레이북을 생성하여:
- 인벤토리 호스트 전체에서 실행
- /etc/issue 파일 내용을 한 줄로 변경:
- dev 호스트: Development
- test 호스트: Test
- prod 호스트: Production
✅ 풀이
vim ~/ansible/issue.yml
---
- name: Modify /etc/issue content
hosts: all
become: true
tasks:
- name: Set content to Development for dev group
copy:
content: 'Development'
dest: /etc/issue
when: "inventory_hostname in groups.dev"
- name: Set content to Test for test group
copy:
content: 'Test'
dest: /etc/issue
when: "inventory_hostname in groups.test"
- name: Set content to Production for prod group
copy:
content: 'Production'
dest: /etc/issue
when: "inventory_hostname in groups.prod"
실행 및 확인:
ansible-playbook issue.yml
# 확인
ansible all -m shell -a 'cat /etc/issue'
💡 Tip
- copy 모듈의 content 파라미터로 직접 내용 지정 가능
- when 조건: inventory_hostname in groups.그룹명
- groups.dev는 groups['dev']와 동일
- 간단한 조건문에는 따옴표 생략 가능
문제 12. Web 컨텐츠 디렉토리 생성
📌 문제
/home/admin/ansible/webcontent.yml 플레이북을 생성하여:
- dev 호스트 그룹에서 실행
- /webdev 디렉토리 생성:
- 그룹 소유권: webdev
- 권한: owner=rwx, group=rwx, other=rx
- 특수 권한: set group ID (2775)
- /var/www/html/webdev → /webdev 심볼릭 링크 생성
- /webdev/index.html 파일 생성 (내용: Development)
- http://node1.domain1.example.com/webdev/ 접속 시 Development 출력
✅ 풀이
사전 작업 (실제 시험에서는 이미 구성됨):
# node1에 webdev 그룹 생성
ansible dev -m shell -a 'groupadd webdev'
# httpd 서비스 활성화 및 방화벽 설정
ansible dev -m shell -a 'systemctl enable --now httpd'
ansible dev -m shell -a 'firewall-cmd --add-service=http --permanent'
ansible dev -m shell -a 'firewall-cmd --reload'
webcontent.yml 작성:
vim ~/ansible/webcontent.yml
---
- name: Create web content directory
hosts: dev
become: true
tasks:
- name: Create /webdev directory
file:
path: /webdev
state: directory
group: webdev
mode: '2775'
- name: Create symbolic link
file:
src: /webdev
dest: /var/www/html/webdev
state: link
- name: Create index.html
copy:
content: 'Development'
dest: /webdev/index.html
setype: httpd_sys_content_t
실행 및 확인:
ansible-playbook webcontent.yml
# 확인 (webdev 뒤에 / 필수)
curl http://192.168.59.131/webdev/
# 출력: Development
💡 Tip
- 특수 권한 (SGID): 맨 앞자리 2 (2775)
- 2000: SGID (set group ID)
- 4000: SUID (set user ID)
- 1000: Sticky bit
- setype: httpd_sys_content_t로 SELinux context 설정
- 심볼릭 링크: state: link, src(원본), dest(링크 위치)
- 실제 시험에서는 webdev 그룹과 httpd 서비스가 미리 구성되어 있음
문제 13. 하드웨어 보고서 생성
📌 문제
/home/admin/ansible/hwreport.yml 플레이북을 생성하여 모든 관리 노드에 /root/hwreport.txt 파일 생성:
포함할 정보:
- Inventory 호스트 이름
- 총 메모리 (MB)
- BIOS 버전
- 디스크 장치 vda 크기
- 디스크 장치 vdb 크기
- 각 줄: key=value 형식
- 항목이 없으면: NONE
작업:
- http://rhgls.domain1.example.com/materials/hwreport.empty 다운로드
- /root/hwreport.txt로 저장
- 올바른 값으로 수정
✅ 풀이
vim ~/ansible/hwreport.yml
---
- name: Generate hardware report
hosts: all
become: true
tasks:
- name: Download hwreport template
get_url:
url: http://rhgls.domain1.example.com/materials/hwreport.empty
dest: /root/hwreport.txt
- name: Update hwreport with hardware info
lineinfile:
path: /root/hwreport.txt
regexp: '^{{ item.name }}='
line: "{{ item.name }}={{ item.value }}"
loop:
- { name: HOST, value: "{{ inventory_hostname | default('NONE') }}" }
- { name: MEMORY, value: "{{ ansible_memtotal_mb | default('NONE') }}" }
- { name: BIOSVER, value: "{{ ansible_bios_version | default('NONE') }}" }
- { name: sdaSIZE, value: "{{ ansible_devices.sda.size | default('NONE') }}" }
- { name: sdbSIZE, value: "{{ ansible_devices.sdb.size | default('NONE') }}" }
실행 및 확인:
ansible-playbook hwreport.yml
# 확인
ansible all -m shell -a 'cat /root/hwreport.txt'
💡 Tip
- get_url 모듈: 원격 URL에서 파일 다운로드
- lineinfile 모듈: 특정 줄 찾아서 교체
- regexp: 찾을 패턴 (정규표현식)
- line: 교체할 내용
- loop로 여러 항목 반복 처리
- default('NONE')으로 값이 없을 때 기본값 설정
- 주요 Ansible facts:
- ansible_memtotal_mb: 총 메모리 (MB)
- ansible_bios_version: BIOS 버전
- ansible_devices.디스크명.size: 디스크 크기
문제 14. 비밀번호 Vault 생성
📌 문제
Ansible vault를 생성하여 사용자 비밀번호 저장:
- Vault 이름: /home/admin/ansible/locker.yml
- 변수:
- pw_developer: Imadev
- pw_manager: Imamgr
- Vault 비밀번호: whenyouwishuponastar
- 비밀번호 파일: /home/admin/ansible/secret.txt
✅ 풀이
# 1. 비밀번호 파일 생성
echo 'whenyouwishuponastar' > /home/admin/ansible/secret.txt
chmod 0600 /home/admin/ansible/secret.txt
# 2. ansible.cfg에 vault_password_file 설정
vim /home/admin/ansible/ansible.cfg
[defaults]
...
vault_password_file = /home/admin/ansible/secret.txt
방법 1: 기존 파일 암호화
# locker.yml 먼저 생성
cat << 'EOF' > locker.yml
pw_developer: Imadev
pw_manager: Imamgr
EOF
# 암호화
ansible-vault encrypt locker.yml
# 확인
ansible-vault view locker.yml
방법 2: 생성과 동시에 암호화 (권장)
ansible-vault create locker.yml
pw_developer: Imadev
pw_manager: Imamgr
주요 Vault 명령어:
# 암호화된 파일 보기
ansible-vault view locker.yml
# 암호화된 파일 편집
ansible-vault edit locker.yml
# 암호화
ansible-vault encrypt 파일명
# 복호화
ansible-vault decrypt 파일명
# 비밀번호 변경
ansible-vault rekey 파일명
💡 Tip
- ansible.cfg에 vault_password_file 설정하면 매번 비밀번호 입력 불필요
- secret.txt 파일 권한: 600 (소유자만 읽기/쓰기)
- ansible-vault create가 가장 간편한 방법
- playbook에서 vault 파일 사용: vars_files:로 지정
문제 15. 사용자 계정 생성
📌 문제
/home/admin/ansible/users.yml 플레이북을 생성하여:
준비:
- http://rhgls.domain1.example.com/materials/user_list2.yml 다운로드
- /home/admin/ansible/locker.yml vault 사용
developer 직무:
- dev, test 호스트 그룹에 생성
- 비밀번호: pw_developer 변수값
- 비밀번호 만료: 30일
- 부가 그룹: devops
manager 직무:
- prod 호스트 그룹에 생성
- 비밀번호: pw_manager 변수값
- 비밀번호 만료: 30일
- 부가 그룹: opsmgr
기타:
- 비밀번호 해시: SHA512
- vault 비밀번호 파일: /home/admin/ansible/secret.txt 사용
✅ 풀이
# 1. user_list2.yml 다운로드
cd ~/ansible
wget http://rhgls.domain1.example.com/materials/user_list2.yml
# user_list2.yml 내용 예시:
# ---
# users:
# - name: sally
# job: manager
# - name: bob
# job: developer
# - name: fred
# job: developer
# 2. users.yml 작성
vim ~/ansible/users.yml
---
- name: Create users on dev and test groups
hosts: dev,test
become: true
vars_files:
- locker.yml
- user_list2.yml
tasks:
- name: Create devops group
group:
name: devops
state: present
- name: Create developer users
user:
name: '{{ item.name }}'
password: "{{ pw_developer | password_hash('sha512') }}"
groups: devops
append: yes
when: item.job == 'developer'
loop: '{{ users }}'
- name: Set password expiration for developers
shell: chage -M 30 '{{ item.name }}'
when: item.job == 'developer'
loop: '{{ users }}'
- name: Create users on prod group
hosts: prod
become: true
vars_files:
- locker.yml
- user_list2.yml
tasks:
- name: Create opsmgr group
group:
name: opsmgr
state: present
- name: Create manager users
user:
name: '{{ item.name }}'
password: "{{ pw_manager | password_hash('sha512') }}"
groups: opsmgr
append: yes
when: item.job == 'manager'
loop: '{{ users }}'
- name: Set password expiration for managers
shell: chage -M 30 '{{ item.name }}'
when: item.job == 'manager'
loop: '{{ users }}'
실행 및 확인:
ansible-playbook users.yml
# 사용자 확인
ansible dev,test -m shell -a 'cat /etc/passwd | grep -E "bob|fred"'
ansible prod -m shell -a 'cat /etc/passwd | grep sally'
# 그룹 확인
ansible dev,test -m shell -a 'cat /etc/group | grep devops'
ansible prod -m shell -a 'cat /etc/group | grep opsmgr'
# 비밀번호 만료일 확인
ansible dev,test -m shell -a 'chage -l bob'
ansible prod -m shell -a 'chage -l sally'
💡 Tip
- vars_files로 여러 변수 파일 로드 가능
- password_hash('sha512') 필터로 비밀번호 해시화
- append: yes로 기존 그룹 유지하며 추가
- chage -M 30으로 비밀번호 최대 사용 기간 설정
- SHA512 에러 발생 시 | password_hash('sha512') 부분 제거 후 재시도
- loop와 when을 조합하여 조건부 반복 처리
문제 16. Ansible Vault 키 재생성
📌 문제
기존 ansible vault의 비밀번호를 변경하시오:
- http://rhgls.domain1.example.com/materials/salaries.yml 다운로드
- /home/admin/ansible에 저장
- 현재 vault 비밀번호: insecure4sure
- 새 vault 비밀번호: bbe2de98389b
- 암호화 상태 유지
✅ 풀이
# 1. ansible.cfg에서 vault_password_file 임시 비활성화
vim /home/admin/ansible/ansible.cfg
[defaults]
...
# vault_password_file = /home/admin/ansible/secret.txt
# 2. salaries.yml 다운로드
cd /home/admin/ansible
wget http://rhgls.domain1.example.com/materials/salaries.yml
# 3. vault 비밀번호 변경
ansible-vault rekey --ask-vault-pass salaries.yml
Vault password: insecure4sure
New Vault password: bbe2de98389b
Confirm New Vault password: bbe2de98389b
Rekey successful
# 4. ansible.cfg 원상복구
vim /home/admin/ansible/ansible.cfg
[defaults]
...
vault_password_file = /home/admin/ansible/secret.txt
# 5. 확인 (자동 비밀번호 입력은 실패)
ansible-vault view salaries.yml --ask-vault-pass
# Vault password: bbe2de98389b
💡 Tip
- rekey 명령어로 vault 비밀번호 변경
- --ask-vault-pass로 대화형으로 비밀번호 입력
- ansible.cfg의 vault_password_file과 다른 비밀번호를 사용할 때는 임시 비활성화
- 작업 후 ansible.cfg 설정 원상복구 필수
- 여러 vault를 사용할 경우 --vault-id 옵션 활용
문제 17. Cron 작업 설정
📌 문제
/home/admin/ansible/cron.yml 플레이북을 생성하여:
- 모든 관리 호스트에서 실행
- 사용자 natasha의 cron 작업 생성
- 매 2분마다 실행
- 명령어: logger "EX294 in progress"
✅ 풀이
사전 작업 (실제 시험에서는 이미 구성됨):
# 모든 노드에 natasha 사용자 생성
ansible all -m shell -a 'useradd natasha'
cron.yml 작성:
vim ~/ansible/cron.yml
---
- name: Configure cron job for natasha
hosts: all
become: true
tasks:
- name: Add cron job for natasha
cron:
name: "EX294 progress logger"
minute: "*/2"
user: natasha
job: logger "EX294 in progress"
실행 및 확인:
ansible-playbook cron.yml
# cron 확인
ansible all -m shell -a 'crontab -u natasha -l'
# 로그 확인 (2분 후)
ansible all -m shell -a 'tail /var/log/messages | grep EX294'
💡 Tip
- cron 모듈 주요 파라미터:
- name: cron 작업 설명 (주석으로 표시됨)
- minute: 분 (*/2 = 2분마다)
- hour: 시간
- day: 일
- month: 월
- weekday: 요일
- user: 실행 사용자
- job: 실행할 명령어
- */2: 2분마다 실행
- logger 명령어: 시스템 로그에 메시지 기록
- cron 삭제: state: absent 추가
📚 추가
Ansible-doc 활용법
# 모듈 검색
ansible-doc -l | grep yum
# 모듈 상세 정보
ansible-doc yum_repository
# 예제만 보기
ansible-doc yum_repository | grep -A 50 EXAMPLES
Jinja2 템플릿 주요 문법
# 변수 출력
{{ 변수명 }}
# 조건문
{% if 조건 %}
내용
{% endif %}
# 반복문
{% for item in list %}
{{ item }}
{% endfor %}
# 필터
{{ 변수 | default('기본값') }}
{{ 비밀번호 | password_hash('sha512') }}
자주 사용하는 Ansible Facts
# 호스트 정보
{{ ansible_hostname }} # 호스트명
{{ ansible_fqdn }} # FQDN
{{ inventory_hostname }} # 인벤토리상 호스트명
# 네트워크 정보
{{ ansible_default_ipv4.address }} # IP 주소
{{ ansible_all_ipv4_addresses }} # 모든 IP 주소
# 시스템 정보
{{ ansible_memtotal_mb }} # 총 메모리(MB)
{{ ansible_processor_cores }} # CPU 코어 수
{{ ansible_bios_version }} # BIOS 버전
# 디스크 정보
{{ ansible_devices.sda.size }} # sda 크기
{{ ansible_lvm.vgs }} # VG 정보
✅ 시험 전 최종 체크리스트
환경 설정
- ansible.cfg 파일 위치 및 내용 확인
- inventory 파일 위치 및 그룹 구성 확인
- vault_password_file 설정 확인
- SSH 키 인증 동작 확인 (ansible all -m ping)
작업 습관
- 각 playbook 실행 후 결과 확인
- ansible-doc 활용하여 모듈 옵션 확인
- 파일명과 경로 정확히 지정 (문제에서 요구하는 대로)
- playbook에 become: true 필요 여부 확인
- when 조건문 정확히 작성
검증
- ansible-playbook --syntax-check 문법 검사
- ansible-playbook 실행 후 에러 확인
- ad-hoc 명령어로 결과 검증
- 서버 재부팅 후에도 동작하는지 확인 (시간 있을 때)
🎯 마치며
RHCE 시험은 실무 중심의 실기 시험입니다. 다음 사항들을 명심하세요:
- ansible-doc을 적극 활용하세요. 모든 모듈의 예제가 들어있습니다.
- 문제에서 요구하는 사항을 정확히 따르세요. 파일명, 경로, 변수명 하나하나가 채점 기준입니다.
- Jinja2 변수 활용을 연습하세요. ansible -m setup으로 변수를 미리 확인하는 습관을 들이세요.
- 시간 관리가 중요합니다. 막히는 문제는 건너뛰고 나중에 다시 도전하세요.
- 지속적인 검증이 필요합니다.
행운을 빕니다! 🍀
참고: 본 문서는 RHCE EX294 시험 준비를 위한 참고 자료입니다. 실제 시험 문제와 다를 수 있습니다.
반응형
'리눅스 > 자격증' 카테고리의 다른 글
| [RHCE] RHCE (EX294) 문제 풀이 - 1 (0) | 2025.11.28 |
|---|---|
| [RHCE] Repo Server 및 사전 구성 (1) | 2025.04.28 |
| [RHCE] 시험 전 Check Point + 후기 (19) | 2025.04.18 |
| [RHCSA] 시험 전 Check Point + 후기 (0) | 2024.01.17 |
