리눅스/자격증

[RHCE] RHCE (EX294) 문제 풀이 - 2

ㅎㄷㄹㅁㅇ 2025. 11. 28. 17:58
반응형

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

작업:

✅ 풀이

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 플레이북을 생성하여:

준비:

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의 비밀번호를 변경하시오:

✅ 풀이

# 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 시험은 실무 중심의 실기 시험입니다. 다음 사항들을 명심하세요:

  1. ansible-doc을 적극 활용하세요. 모든 모듈의 예제가 들어있습니다.
  2. 문제에서 요구하는 사항을 정확히 따르세요. 파일명, 경로, 변수명 하나하나가 채점 기준입니다.
  3. Jinja2 변수 활용을 연습하세요. ansible -m setup으로 변수를 미리 확인하는 습관을 들이세요.
  4. 시간 관리가 중요합니다. 막히는 문제는 건너뛰고 나중에 다시 도전하세요.
  5. 지속적인 검증이 필요합니다. 

 

 

행운을 빕니다! 🍀


참고: 본 문서는 RHCE EX294 시험 준비를 위한 참고 자료입니다. 실제 시험 문제와 다를 수 있습니다.

반응형
TOP