EX294 Practice
1. Install and configure ansible on control node as follow
앤서블을 설치하고 다음과 같이 설정하세요.
- node1 is a member of dev host group
- node2 is a member of test host group
- node3, node4 is a member of prod host group
- node5 is a member of balancers host group
- prod group is a member of the webservers host group
- collections_path is /home/park/ansible/mycollections
- roles_path is /home/park/ansible/roles
정답:
yum install ansible-*
mkdir ansible
vi inventory
[dev]
node1
[test]
node2
[prod]
node3
node4
[webservers:children]
prod
:wq
vi ansible.cfg
[defaults]
inventory=/home/park/ansible/inventory
collections_path=/home/park/ansible/mycollections
roles_path=/home/park/ansible/roles
[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=false
:wq
---
2. Create yum_repo.yml
/home/park/ansible/yum_repo.yml 플레이북을 통해서 모든 노드에 대해 다음과 같이 yum repository를 설정하세요.
- 이름은 EX294_BaseOS 입니다.
- description은 EX294 baseos software 입니다.
- 레포지토리 주소는 http://redhat.example.com/repo/BaseOS 입니다.
- gpg 확인이 활성화 됩니다.
- gpgkey 의 url은 http://redhat.example.com/rhel/rhel-gpg-key 입니다.
- 레포지토리가 활성화됩니다.
- 이름은 EX294_AppStream 입니다.
- description은 EX294 appstream software 입니다.
- 레포지토리 주소는 http://redhat.example.com/repo/Appstream 입니다.
- gpg 확인이 활성화 됩니다.
- gpgkey 의 url은 http://redhat.example.com/rhel/rhel-gpg-key 입니다.
- 레포지토리가 활성화됩니다.
정답:
vi yum_repo.yml
---
- name: yum
hosts: all
tasks:
- name: Add EX294_BaseOS repository
yum_repository:
name: EX294_BaseOS
description: EX294 baseos software
baseurl: http://redhat.example.com/repo/BaseOS
gpgcheck: true
gpgkey: http://redhat.example.com/rhel/rhel-gpg-key
enabled: true
- name: Add EX294_AppStream repository
yum_repository:
name: EX294_AppStream
description: EX294 appstream software
baseurl: http://redhat.example.com/repo/AppStream
gpgcheck: true
gpgkey: http://redhat.example.com/rhel/rhel-gpg-key
enabled: true
:wq
ansible-playbook yum_repo.yml
---
3. Install collection
컬렉션 아티팩트를 설치하고 컬렉션을 /home/park/ansible/mycollections 에 설치하세요.
- https://redhat.example.com/download/ansible-posix-1.5.1.tar.gz
- https://redhat.example.com/download/community-general-5.4.0.tar.gz
- https://redhat.example.com/download/redhat-rhel_system_roles-1.15.1.tar.gz
정답:
mkdir mycollections && cd mycollections
wget https://redhat.example.com/download/ansible-posix-1.5.1.tar.gz
wget https://redhat.example.com/download/community-general-5.4.0.tar.gz
wget https://redhat.example.com/download/redhat-rhel_system_roles-1.15.1.tar.gz
vi requirement.yml
---
collections:
- name: /home/park/ansible/mycollections/ansible-posix-1.5.1.tar.gz
- name: /home/park/ansible/mycollections/community-general-5.4.0.tar.gz
- name: /home/park/ansible/mycollections/redhat-rhel_system_roles-1.15.1.tar.gz
:wq
cd ..
ansible-galaxy collection install -r requirement -p /home/park/ansible/mycollections
---
4. Install Packages
다음을 수행하는 플레이북 /home/park/ansible/packages.yml 을 생성하세요.
- php, mariadb 패키지가 dev, test 그리고 prod 호스트에 설치 됩니다.
- RPM Development Tools 패키지가 dev 호스트에 설치됩니다.
- dev 호스트의 모든 패키지가 최신버전으로 업데이트 됩니다.
정답:
vi packages.yml
---
- name: install packages
hosts: dev, test, prod
tasks:
- name: install php, mariadb
yum:
name:
- php
- mariadb
state: present
- name: install Development Tools
hosts: dev
tasks:
- name: install developer tools
yum:
name: "@RPM Development Tools"
state: present
- name: update all
yum:
name: '*'
state: latest
:wq
ansible-playbook packages.yml
---
5. role 사용
다음 동작을 수행하는 /home/park/ansible/timesync.yml 플레이북을 생성하세요.
- 모든 관리 호스트에서 동작합니다.
- timesync 역할을 사용합니다.
- NTP provider를 활성화 합니다.
- 타임 서버를 time.bora.net 로 설정합니다.
- iburst를 활성화 합니다.
정답:
vi timesync.yml
---
- name: Manage timesync with bora servers
hosts: all
vars:
timesync_ntp_servers:
- hostname: time.bora.net
iburst: true
roles:
- fedora.linux_system_roles.timesync
:wq
ansible-playbook timesync.yml
---
6. role 사용 2
다음 동작을 수행하는 /home/park/ansible/selinux.yml을 생성하세요.
- 모든 관리 호스트에서 동작합니다.
- selinux 역할을 사용합니다.
- 정책의 targeted으로 설정됩니다.
- 상태는 enforcing으로 설정됩니다.
정답:
vi selinux.yml
---
- name: selinux
hosts: all
vars:
- selinux_policy: targeted
- selinux_state: enforcing
roles:
- fedora.linux_system_roles.selinux
:wq
ansible-playbook selinux.yml
---
7. roles 설치
/home/park/ansible/roles/requirements.yml 와 Ansible Galaxy 를 사용하여 역할을 /home/park/ansible/roles에 설치하세요.
- http://redhat.example.com/materials/haproxy.tar 이 역할의 이름은 balancer 이여야 합니다.
- http://redhat.example.com/materials/phpinfo.tar 이 역할의 이름은 phpinfo 이여야 합니다.
정답:
mkdir roles
vi roles/requirements.yml
---
- name: balancer
src: http://redhat.example.com/materials/haproxy.tar
- name: phpinfo
src: http://redhat.example.com/materials/phpinfo.tar
:wq
ansible-galaxy install -r roles/requirements.yml -p roles/
---
8. new role 생성
다음을 수행하는 /home/park/ansible/roles/apache 역할을 생성하세요.
- httpd 가 설치되고 부팅 시 자동 실행됩니다.
- 방화벽이 활성화 되고 웹서버에 대한 접근이 허용 됩니다.
- index.html.j2 가 /var/www/html/index.html 에 생성되고 아웃풋은 다음과 같습니다.
- Welcome to HOSTNAME on IPADDRESS
- HOSTNAME 은 해당노드의 정규 도메인 이름이고 IPADDRESS는 호스트의 IP 주소입니다.
- /home/park/ansible/newrole.yml 플레이북을 통해 역할이 수행 됩니다:
- 플레이북은 webservers 호스트 그룹의 호스트에서 실행됩니다.
정답:
mkdir -p roles/apache/tasks
mkdir -p roles/apache/templates
touch roles/apache/tasks/main.yml
touch roles/apache/templates/index.html.j2
vi roles/apache/tasks/main.yml
---
- name: Install httpd
yum:
name: httpd
state: present
- name: Start httpd
service:
name: httpd
enabled: true
state: started
- name: Enable firewalld
service:
name: firewalld
enabled: true
state: started
- name: Configure firewall for HTTP service
firewalld:
service: http
state: enabled
permanent: true
immediate: true
- name: Deploy index.html template
template:
src: index.html.j2
dest: /var/www/html/index.html
:wq
vi roles/apache/templates/index.html.j2
Welcome to {{ ansible_hostname }} on {{ ansible_default_ipv4.address }}
:wq
vi newrole.yml
---
- name: Deploy apache role
hosts: webservers
roles:
- apache
:wq
ansible-playbook newrole.yml
curl http://node3
curl http://node4
---
9. lv 생성하기
모든 노드에서 실행되는 /home/park/ansible
/lv.yml 플레이북을 만들어 다음을 수행 하십시오.
- 논리 볼륨은 research 볼륨 그룹에 생성됩니다.
- 논리 볼륨이름은 data 입니다.
- 크기는 1500 Mib 입니다.
- ext4 파일 시스템으로 논리 볼륨을 포맷합니다.
- 논리볼륨이 생성될 수 없는 경우 다음과 같은 오류 메시지가 출력됩니다.
- Could not create logical volume of that size
- 출력 후 800MiB가 대신 생성됩니다.
- 볼륨 그룹 research가 없는 경우 "Volume group does not exist" 가 출력됩니다.
- 논리 볼륨은 마운트 되지 않습니다.
정답:
vi lv.yml
---
- name: lvcreate
hosts: all
tasks:
- block:
- name: Create a logical volume of 1500 MiB
lvol:
vg: research
lv: data
size: 1500m
- name: Format the logical volume
filesystem:
fstype: ext4
dev: /dev/research/data
rescue:
- debug:
msg: "Could not create logical volume of that size"
- name: Create a logical volume of 800 MiB
lvol:
vg: research
lv: data
size: 800m
when: ansible_devices['research'] is defined
- debug:
msg: "Volume group does not exist"
when: ansible_devices['research'] is undefined
:wq
ansible-playbook lv.yml
---
10. hosts 파일 작성
- http://redhat.example.com/material/hosts.j2 에서 초기 파일을 /home/park/ansible에 다운로드 합니다.
- 파일을 완성하여 템플릿을 준비합니다.
- /home/admin/ansible/hosts.yml로 다운로드합니다.
- /home/park/ansible/hosts.yml 플레이북은 dev 호스트 그룹의 호스트에서 /etc/myhosts 파일을 생성합니다.
- 플레이북이 실행되면 호스트에 다음과 같은 내용이 /etc/myhosts 에 저장됩니다.
정답:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
node1.example.com 10.40.162.24 node1
node2.example.com 10.40.162.25 node2
node5.example.com 10.40.162.28 node5
node3.example.com 10.40.162.26 node3
node4.example.com 10.40.162.27 node4
*노드의 순서는 중요하지 않습니다.
cat /etc/hosts >> hosts.j2
vi hosts.yml
---
- name: Generate hosts file
hosts: dev
tasks:
- name: Create /etc/myhosts file using template
template:
src: hosts.j2
dest: /etc/myhosts
:wq
ansible-playbook hosts.yml
ansible dev -m shell -a "cat /etc/myhosts"
---
11. 콘텐츠 수정하기
다음을 수행하는 /home/park/ansible/issue.yml 을 작성하세요
- 모든 관리노드에서 실행됩니다.
- /etc/issue 파일의 내용이 다음과 같이 변경됩니다.
- dev 호스트 그룹의 호스트에서는 다음과 같은 내용이 있습니다: Development
- test 호스트 그룹의 호스트에서는 다음과 같은 내용이 있습니다: Test
- prod 호스트 그룹의 호스트에서는 다음과 같이 변경됩니다: Production
정답:
vi issue.yml
---
- name: issue
hosts: all
tasks:
- name: issue
copy:
dest: /etc/issue
content: Development
when: ansible_hostname in groups.dev
- name: issue
copy:
dest: /etc/issue
content: Test
when: ansible_hostname in groups.test
- name: issue
copy:
dest: /etc/issue
content: Production
when: ansible_hostname in groups.prod
:wq
ansible-playbook issue.yml
ansible all -m shell -a "cat /etc/issue"
---
12. web 컨텐츠 디렉토리 생성
다음을 수행하는 /home/park/ansible/webcontent.yml 플레이북을 생성하세요
- dev 호스트 그룹의 노드에서 실행됩니다.
- /webdev 디렉토리를 생성합니다.
- webdev 그룹이 소유합니다.
- 일반권한은 소유자 = 읽기+쓰기+실행, 그룹: 읽기+쓰기+실행, 다른사용자= 읽기+실행
- 특수권한은 그룹 ID가 설정됩니다.
- 심볼릭 링크로 /var/www/html/webdev와 /webdev 를 링크하세요.
- /webdev/index.html 파일을 생성하고 해당 파일 내용은 "Development" 입니다.
- dev 호스트그룹 노드의 리 디렉토리를 브라우징 하면 "Development" 가 출력되어야합니다.
정답:
---
- name: Set for web
hosts: dev
tasks:
- name: Create directory
file:
path: /webdev
groups: webdev
mode: 2775
state: directory
- name: create link
file:
src: /webdev
dest: /var/www/html/webdev
state: link
- name: Create html file
copy:
dest: /webdev/index.html
content: Development
setype: httpd_sys_content_t
---
13. 하드웨어 보고서 작성
다음을 수행하는 /home/park/ansible/hwreport.yml 플레이북을 생성하세요.
- 모든 관리노드에서 실행됩니다.
- 다음 내용이 들어있는 /root/hwreport.txt 출력파일을 생성합니다.
- 인벤토리 호스트이름
- 총 메모리 용량(MB)
- BIOS 버전
- 디스크 장치 vda의 크기
- 디스크 장치 vdb의 크기
- 출력 파일의 각줄에는 하나의 '키 = 값' 쌍이 포함됩니다.
- http://redhat.example.com/materials/hwreport.txt 에서 hwreport.txt를 /home/park/ansible에 다운로드합니다.
- /root/hwreport.txt 를 올바른 값으로 수정합니다.
- 해당 항목 값이 없으면 "NONE"이 표시됩니다.
정답:
vi hwreport.yml
---
- name: hwreport
hosts: all
vars:
hw_all:
- hw_name: HOST
hw_cont: "{{ ansible_hostname | default('NONE' , true) }}"
- hw_name: TOTALMEM
hw_cont: "{{ ansible_memtotal_mb | default('NONE' , true) }}"
- hw_name: BIOSVER
hw_cont: "{{ ansible_bios_version | default('NONE' , true) }}"
- hw_name: vdaSIZE
hw_cont: "{{ ansible_devices.vda.size | default('NONE' , true) }}"
- hw_name: vdbSIZE
hw_cont: "{{ ansible_devices.vdb.size| default('NONE' , true) }}"
tasks:
- name: download hwreport.txt
get_url:
url: http://redhat.example.com/materials/hwreport.txt
dest: /root/hwreport.txt
- name: write hw report
lineinfile:
path: /root/hwreport.txt
backrefs: true
regexp: "^{{ item.hw_name }}="
line: "{{ item.hw_name }}={{ item.hw_cont }}"
loop: "{{ hw_all }}"
---
14. create a password vault
다음과 같은 password 저장소를 생성합니다.
- 저장소 이름은 /home/park/ansible/locker.yml 입니다.
- 저장소의 내용은 다음과 같습니다
- pw_developer의 값은 Imadev 입니다.
- pw_manager의 값은 Imasmgr 입니다.
- 저장소를 암호화 하며 비밀번호는 whenyouwishuponstar 입니다.
- 비밀번호는 /home/park/ansible/secret.txt 에 저장됩니다.
정답:
vi secret.txt
whenyouwishuponstar
vi ansible.cfg
vault_password_path=/home/park/ansible/secret.txt
vi locker.yml
pw_developer: Imadev
pw_manager: Imasmgr
---
15. create user accounts ( 유저 생성하기)
http://redhat.example.com/materials/user_list2.yml 를 /home/park/ansilbe 에 저장합니다.
locker.yml을 사용하여 /home/park/ansible/users.yml이라는 플레이북을 생성하여 다음과 같이 유저를 생성합니다.
- 직무가 developer인 사용자는 다음과 같이 구성됩니다.:
- dev 및 test 호스트 그룹의 관리 노드에서 생성됩니다.
- pw_developer 변수에서 비밀번호를 할당 받고, 30일 후에 비밀번호가 만료되도록 설정합니다.
- 부가 그룹 devops의 멤버가 됩니다.
- 직무가 manager인 사용자는 다음과 같이 구성됩니다.:
- prod 호스트 그룹의 관리 노드에서 생성됩니다.
- pw_manager 변수에서 비밀번호를 할당 받으며, 30일 후에 비밀번호가 만료 되도록 설정합니다.
- 부가그룹 opsmgr 멤버가 됩니다.
- 비밀번호는 SHA512 해시 형식입니다.
- /home/park/ansible/secret.txt를 사용해 작동합니다.
정답:
users.yml 내용
---
users:
- name: AliceJohnson
job: manager
- name: BobSmith
job: developer
- name: CarolWilliams
job: manager
- name: DavidBrown
job: developer
vi users.yml
- name: create user
hosts: dev,test
vars_files:
- user_list.yml
- locker.yml
tasks:
- name: Create group for developer
group:
name: devops
state: present
- name: Create user for developer
user:
name: "{{ item.name }}"
password: "{{ pw_developer | password_hash('sha512') }}"
password_expire_max: 30
groups: devops
state: present
loop: "{{ users }}"
when: item.job == "developer"
- name: create user
hosts: prod
vars_files:
- user_list.yml
- locker.yml
tasks:
- name: Create group for manager
group:
name: opsmgr
state: present
- name: Create user for manager
user:
name: "{{ item.name }}"
password: "{{ pw_developer | password_hash('sha512') }}"
password_expire_max: 30
groups: opsmgr
loop: "{{ users }}"
when: item.job == "manager"
ansible-playbook user.yml
---
16. 비밀번호 재생성하기 (rekey)
기존 ansible vault를 rekey 하십시오
- http://redhat.example.com/materials/salsries.yml 을 /home/park/ansible 에 다운하십시오
- 해당파일의 패스워드는 insecure4sure 입니다.
- 새로운 패스워드는 bbqw3fd980123c 입니다.
- 변경된 패스워드는 유지됩니다.
정답:
wget http://redhat.example.com/materials/salsries.yml
ansible-vault rekey --ask-vault-pass salaries.yml
---
17. cron job 생성
다음을 수행하는 /home/park/ansible/cron.yml의 플레이북을 만드세요.
유져 natasha는 2분마다 logger "EX294 in progress"를 실행하는 크론작업을 생성합니다.
정답:
---
- name: cron job for ansible
hosts: all
tasks:
- name: cron natasha
cron:
name: loggercron
minute: '*/2'
user: root
job: logger "EX294 in progress"
'자격증' 카테고리의 다른 글
[RHCSA] 연습 환경 만들기 (0) | 2025.02.25 |
---|---|
[ RHCSA 9 ] 합격 후기 (68) | 2024.04.23 |
[ RHCSA 9 ] 개별시험(원격시험)신청 및 준비사항 (2) | 2024.04.23 |