
Ansible 문제풀이
OS: Linux centos7
Iac: Ansible
Ansible 문제 풀이 및 정리를 통해 기본 개념 학습
- Ansible 설치 및 구성
- Ansible 애드폰(Ad Hoc) 명령 생성 및 실행
- 패키지 설치
- RHEL 시스템 역할 사용
- Ansible Galaxy를 사용하여 역할 설치
- Web Server 구성 및 확인
- 역할 생성 및 사용
- 논리 볼륨 생성 및 사용
- 호스트 파일 생성
- 파일 콘텐츠 수정
- 웹 콘텐츠 디렉토리 생성
- 하드웨어 보고서 생성
- 암호 자격 증명 모음 생성
- 사용자 계정 생성
- FTP 서버 구성
- 시스템 런레벨(default.target) 변경
- 정기적인 잡(Job) 수행
- 종합
다음과 같은 제어 노드 ansible.example.com에서 ansible을 설치하고 구성한다.
□ 필요한 패키지를 설치
□ 다음과 같이 /home/ansible/project/inventory라는 정적 인벤토리를 파일을 생성한다.
□ ansible1은 dev 호스트 그룹의 구성원이다.
□ ansible2는 test 호스트 그룹의 구성원이다.
□ ansible3 및 ansible4는 prod 호스트 그룹의 구성원이다.
□ prod 그룹은 webservers 호스트 그룹의 구성원이다.
□ 다음과 같이 /home/ansible/project/ansible.cfg 라는 구성 파일을 생성한다.
□ 호스트 인벤토리 파일은 /home/ansible/project/inventory 이다.
□ 플레이북에서 사용되는 역할의 위치에는 다음이 포함된다. * /home/ansible/project/roles
$ mkdir ~/ansible/project && cd ~/ansible/project
$ vi ~/ansible/project/inventory

$ vi ~/ansible/project/ansible.cfg

(작업 개요)
시스템 관리자는 관리형 노드에 소프트웨어를 설치해야 한다. 따라서, Ansible 애드혹 명령을 사용하는
/home/ansible/project/adhoc.sh 라는 쉘스크립트를 생성하여 다음과 같이 각각의 관리형 노드에 yum
리포지토리를 생성한다.
리포지토리 1:
□ 리포지토리의 이름은 MyBase 이다.
□ 설명은 base software 이다.
□ 기본 url은 다음과 같다.
http://192.168.10.10/pkg/BaseOS
□ GPG 서명 확인이 비활성화한다.
□ 리포지토리를 활성화 한다.
리포지토리 2:
□ 리포지토리의 이름은 MyAppStream 이다.
□ 설명은 Appstream software 이다.
□ 기본 url은 다음과 같다.
http://192.168.10.10/pkg/AppStream/ 이다.
□ GPG 서명 확인을 비활성화 한다.
□ 리포지토리를 활성화 한다.
준비:
1) cd 장착
2) Yum Repository 구성(/var/www/html/pkg/)
$ sudo mkdir –p /var/www/html/pkg
$ sudo cp -a /run/media/ansible/CentOS-Stream-8-BaseOS-x86_64
/ /var/www/html/pkg
$ sudo systemctl enable --now httpd

다음과 같이 /home/ansible/project/packages.yml 이라는 플레이북을 생성한다.
□ dev, test 및 prod 호스트 그룹의 호스트에 php 및 mariadb 패키지를 설치한다.
□ dev 호스트 그룹의 호스트에 Development Tools 그룹 패키지 그룹을 설치한다.
□ dev 호스트 그룹의 호스트에서 iotop 패키지를 설치한다.
$ cd project
$ vi packages.yml
$ inventroy check [v]
-> 패키지 1 (php,mariadb) 생성 hosts=dev,test,prod
-> 패키지 2 (@Development Tools, iotop) 생성 hosts =dev
*@Deveploment -> 그룹 패키지기 때문에 앞에 @가 붙음

$ alias anp='ansible-playbook' <- alias 설정
$ anp packages.yml 실행
RHEL 시스템 역할 패키지를 설치하고 다음과 같은 /home/ansible/project/time_sync.yml 이라는 플레
이북을 생성한다.
□ 모든 관리형 노드에서 실행된다.
□ timesync 역할을 사용한다.
□ 현재 활성 NTP 제공업체를 사용하도록 역할을 구성한다.
□ 시간 서버 time.bora.net를 사용하도록 역할을 구성한다.
□ iburst 매개 변수를 활성화하도록 역할을 구성한다.
0) 패키지 설치
$ mkdir –p roles
$ ansible.cfg 파일에
-> roles_path= /home/ansible/project/roles:/usr/share/ansible/
roles:/etc/ansible/roles 설정
$ sudo yum install rhel-system-roles
$ cd /usr/share/ansible/roles
$ ls

$ cd rhel-system-roles.timesync

$ firefox README.html &

-> Example Playbook 형식을 사용
$ cd project
$ vi /time_sync.yml

-> $ ande timezone -> timezone 형식 찾기
$ anp timesync.yml
$ ans all –m shell –a ‘date’

/home/ansible/project/roles/requirements.yml 이라는 요구 사항 파일을 만든다. 이 파일에는 Ansible
Galaxy를 사용하여 역할을 다운로드하고 /home/ansible/project/roles 디렉토리 하위에 설치한다.





다음 요구 사항이 있는 /home/ansible/project/webservers.yml 이라는 플레이북을 생성한다.
□ 플레이북에는 webservers 호스트 그룹의 호스트에서 실행되어야 한다.
□ httpd/firewalld 패키지 설치, httpd/firewalld 서비스 기동, firewall에 http/https
서비스 포트가 등록된 상태이어야 한다.
□ URL/hello.html가 있는 webservers 호스트 그룹에서 호스트를 찾으면 다음 출력이 생성
된다. FQDN이 호스트의 정규화된 도메인 이름이다. Hello World from FQDN
□ 예를 들어 http://ansible3.example.com/hello.html를 찾으면 다음 출력이 생성된다.
Hello World from ansible3.example.com
□ 이와 유사하게 http://ansible4.example.com/hello.html를 찾으면 다음 출력이 생성된다.
Hello World from ansible4.example.com





다음 요구 사항으로 /home/ansible/project/roles에서 apache라는 역할을 생성한다.
□ httpd/firewalld 패키지가 설치되고, httpd/firewalld 현재 뿐만 아니라 부팅 시에도 활성
화되고, http/https 서비스 포트가 방화벽에 등록되고 시작된다.
□ 방화벽이 활성화되며 해당 웹 서버에 대한 엑세스를 허용하는 규칙으로 실행된다.
□ 템플릿 파일 index.html.j2가 존재하며 다음 출력이 있는 /var/www/html/index.html 파일
을 생성하는데 사용된다.
HOSTNAME이 관리형 노드의 정규화된 도메인 이름이며, IPADDRESS가 관리형 노드의 IP주소
이다. Welcome to HOSTNAME to IPADDRESS.
다음과 같이 이 역할을 사용하는 /home/ansible/project/newrole.yml이라는 플레이북을 생성한다.
□ 플레이북은 webservers 호스트 그룹에 있는 호스트에서 실행된다.





(선수작업)
* ansible3/ansible4 서버에 1G 용량의 디스크를 1장 추가한다.
(작업 개요)
다음을 수행하는 webservers 그룹이름을 가진 관리형 노드에서 실행되는
/home/ansible/project/lv.yml이라는 플레이북을 생성한다.
□ 이러한 요구 사항으로 논리 볼륨을 생성한다.
□ 논리 볼륨은 research 볼륨 그룹에 생성된다.
□ 논리 볼륨 이름은 data 이다.
□ 논리 볼륨의 크기는 500 Mib 이다.
□ ext4 파일시스템으로 논리 볼륨을 포맷한다.
□ 논리 볼륨을 /mnt/research 마운트한다. 반드시 부팅시에도 마운트는 되어야 한다.







□ 다음과 같은 hosts.j2 파일을 /home/ansible/project 디렉토리에 생성하고 초기 템플릿 파일로 사용
한다. /home/ansible/project/inventory 파일안에 있는 내용을 다음과 같이 변경한다.

□ /etc/hosts와 동일한 형식으로 각 인벤토리 호스트에 대한 줄이 포함된 파일을 생성하는 데 사
용할 수 있도록 템플릿을 작성한다.(ex: hosts.j2)
□ dev 호스트 그룹의 호스트에서 파일 /etc/myhosts를 생성하도록 이 템플릿을 사용하는
/home/ansible/project/hosts.yml 이라는 플레이북을 생성한다.
□ /etc/myhosts 파일의 소유자는 root 이고, 그룹은 root, 그리고 퍼미션은 rw-r--r-- 설정
되어 있어야 한다.
플레이북이 실행되면 dev 호스트 그룹의 호스트에 파일 /etc/myhosts에 각 관리형 호스트에 대한 줄이
있어야 한다.
[참고] 인벤토리 호스트 이름이 표시되는 순서는 중요하지 않다.
1)inventory 변경

2) hosts.j2 형식의 반복문 생성
$ vi /project/template/hosts.j2

3) 설정 확인
$ ansible localhost -m debug -a 'var=groups["all"]'
$ ansible localhost -m debug –a 'var=hostvars["ansible1"]’
$ ans all -m debug –a 'var=hostvars["ansible1"]["ansible_ssh_host"]’

$ ansible all -m debug –a 'var=hostvars["ansible1"]'["ansible_ssh_host]“

4) playbook 파일 생성
$ vi hosts.yml
$ 퍼미션은 rw-r—r -> ‘0644’

5.확인 작업
$ ansible-playbook hosts.yml
$ ssh ansible1 cat /etc/myhosts

다음과 같이 /home/ansible/project/issue.yml 이라는 플레이북을 생성한다.
□ 플레이북은 모든 인벤토리 호스트에서 실행된다.
□ 플레이북은 /etc/issue의 콘텐츠를 다음과 같은 한줄의 텍스트로 대체한다.
□ dev 호스트 그룹의 호스트에서 이 줄은 다음과 같다. Development
□ test 호스트 그룹의 호스트에서 이 줄은 다음과 같다. Test
□ prod 호스트 그룹의 호스트에서 이 줄은 다음과 같다. Production



2.issue.j2 파일 생성
$ vi /templates/issue.j2

issue.yml 파일 생성
$ vi issue.yml

확인 작업
$ anp issue.yml
$ ans all -m shell -a 'cat /etc/issue’

(작업개요)
다음과 같이 /home/ansible/project/webcontent.yml 이라는 플레이북을 생성한다.
□ 플레이북은 webservers 호스트 그룹에 있는 관리형 노드에서 실행한다.
□ 다음 요구 사항으로 디렉토리 /webdev를 만든다.
□ apache 그룹에서 소유하고 있다.
□ 일반 권한이 있다. 소유자=읽기+쓰기+실행, 그룹=읽기+쓰기+실행, 기타=읽기+실행
□ 특수 권한이 있다. 그룹ID는 apache로 설정
□ /var/www/html/webdev를 /webdev에 심볼릭링크로 연결한다.
□ WEBSERVERS라는 한 줄의 텍스트가 표시된 파일 /webdev/index.html을 생성한다.
□ Dev 호스트 그룹(예: http://ansible3.example.com/webdev/)의 호스트에서 이 디렉
토리를 찾으면 다음 출력이 생성된다.
WEBSERVERS
플레이북 생성
$ vi /project/webcontent.yml
/webdev 디렉토리 생성 – apache:apache, mode:2775(SetGID)

$ anp webcontent.yml
$ ssh ansible3 ;; ls –ld /webdev <- 디렉토리 생성 확인


$ anp webcontent.yml
$ ssh ansible3 ;; ls –ldZ /webdev <- httpd_sys_content_t
생성 확인



5.index.html 파일 생성 - /webdev/index.html

$ cd /etc/selinux/targetd/contexts/files
$ cd/var/www/html/webdev -> ls –lZ ->index.html 파일 확인


(작업 개요)
다음 정보를 사용하여 모든 관리형 노드에서 /root/hwreport.txt 라는 출력 파일을 생성하는
/home/ansible/project/hwreport.yml 이라는 플레이북을 생성한다.
□ 인벤토리 호스트 이름
□ 총 메모리(MB)
□ BIOS 버전
□ 디스크 장치 sda의 크기
□ 디스크 장치 sdb의 크기
□ 출력 파일의 각 행에는 단일 행에는 key=value 쌍이 포함되어 있다.
플레이북에서는 다음을 수행한다.
□ hwreport.empty을 사용하여 /root/hwreport.txt으로 저장한다.
□ 올바른 값으로 /root/hwreport.txt를 수정한다.
□ 디스크 하드웨어 항목이 없는 경우 연결된 값이 NONE으로 설정되어야 한다.
hwreport.empty 파일의 내용(다음 내용은 그대로 복사하여 사용한다.)
-------------------------------------------------------
HOST=inventory hostname
BIOS=bios version
MEMORY=toal memory in mb
SDA_DISK_SIZE=disk size
SDB_DISK_SIZE=disk size
SDC_DISK_SIZE=disk size
-------------------------------------------------------
1.vi hwreport.empty 파일 생성

$ sudo firewall-cmd --permanent --add-service={http,https}
$ sudo firewall-cmd —reload
a) hwreport.empty을 사용하여 /root/hwreport.txt으로 저장하기

b)인벤토리 호스트 이름 설정하기
$ ans localhost –m setup –a ‘filter=ansible_hostname’

$ HOST=inventory hostname 바꾸기

c)BIOS 버전 설정하기
$ ans localhost –m setup –a ‘filter=ansible_bios_version’

$ BIOS=bios version 바꾸기

d) 총 메모리(MB) 설정하기
$ ans localhost –m setup –a ‘filter=ansilbe*’ | greb mb
-> ans localhost –m setup –a ‘filter=ansilbe_memtotal_mb’

$ MEMORY=toal memory in mb 바꾸기

e)sda,sdb,sdc 디스크 크기 설정하기
$ ans localhost –m setup –a ‘filter=ansible_devices’

$ SDA_DISK_SIZE=disk size
$ SDB_DISK_SIZE=disk size
$ SDC_DISK_SIZE=disk size 바꾸기

f) hwreport 저장 파일 만들기

$ mkdir -p hwreport
g) 확인 및 테스트
설정: ansible 1에 용량 4g의 하드디스크를 추가하고 플레이북 실행
(ansible)
$ anp hwreport.yml
$ tree hwreport

$ cd /project/hwreport/ansible1.example.com/root
$ cat hwreport.txt

-> ansible1에서의 정보를 잘 출력 (성공)
(작업 개요)
ansible 자격 증명 모음을 생성하여 다음과 같이 사용자 암호를 저장한다.
□ 자격 증명 모음의 이름은 /home/ansible/project/pw.yml 이다.
□ 자격 증명 모음에는 이름이 있는 두개의 변수가 포함된다.
□ pw_developer 변수의 값이 Imadev 이다.
□ pw_manager 변수의 값이 Imamgr 이다.
□ 자격 증명 모음을 암호화하고 해독하는 암호는 haveagoodtime 이다.
□ pw.yml 플레이북을 실행할 때 암호가 필요하면 이 암호는 secret.txt 파일에 저장한다.
$ cd ~/project
$ echo 'haveagoodtime' > secret.txt
$ chmod 600 secret.txt
$ mkdir –p vars
$ ansible-vault create pw.yml

$ ansible-vault create —vault-password-file=secret.txt vars/pw.yml

$ ansible-vault view vars/pw.yml
-> haveagoodtime
□ /home/ansible/project/userlist.yml에 생성하는 사용자 목록을 만든다.
사용자 목록은 다음과 같은 내용을 담는다.(다음 내용은 변경하지 않고, 복사해서 사용한다.)
> ---
users:
- username: developer
groups: daemon
- username: manager
groups: adm
□ 이전 문제에서 생성된 암호 자격 증명 모음 /home/ansible/project/pw.yml을 사
용하여 다음과 같이 사용자 계정을 생성하는 /home/ansible/project/users.yml이라는
플레이북을 생성한다.
□ developer의 작업 설명이 있는 사용자는 다음과 같다.
□ dev 및 test 호스트 그룹의 관리형 노드에서 생성됨
□ pw_developer 변수에서 암호 할당함
□ 보조 그룹 daemon의 구성원
□ manager의 작업 설명이 있는 사용자는 다음과 같다.
□ prod 호스트 그룹의 관리형 노드에서 생성됨
□ pw_manager 변수에서 암호 할당함
□ 보조 그룹 adm의 구성원
□ 암호는 SHA512 해시 형식을 사용해야 한다.
□ 플레이북은 /home/ansible/project/secret.txt 자격 증명 모음 암호 파일을 사용하여 실행
된다.
userlist.yml 파일 변수 설정

vi /project/userlist.yml 파일 생성
a) developer 사용자 생성

b) manager 사용자 생성

확인 작업
$ ssh developer@ansible1
-> imadev
$ ssh manager@ansible3
-> imamg
□ FTP 서버를 구성하는 /home/ansible/project/ftp.yml 파일을 생성한다.
□ 플레이북으로 FTP 서버 구성시 조건은 다음과 같다.
□ test 관리 노드에서만 실행된다.
□ Anonymous FTP 서비스는 비활성화 한다.
□ vsftpd 패키지를 사용하여 설치하고, 서비스는 부팅시도 기동된다.
□ root 사용자는 원격에서 접근이 가능해야 한다.
□ 방화벽에 포트가 영구적으로 등록되어 있어야 한다.
[참고] 다음과 같은 연계 프로젝트를 진행한다.
* DNS 서버
* MAIL 서버
* WEB 서버
* 공유스토리지 서버
* 이중화
$ sudo yum -y install vsftpd ftp

2.서비스 설정
a) vsftpd.conf.j2 파일 생성(anoymous 사용자 설정)
$ sudo cat /etc/vsftpd/vsftpd.conf | egrep –v ^#’ > vsftpd.conf.j2
-> {{anonymous_enable}} 변수 설정

b)root사용자 제거 -> 파일 만들기
$ sudo cp /etc/vsftpd/ftpusers
$ sudo cp /etc/vsftpd/user_list
$ sudo vi ftpusers -> root 라인 제거
$ sudo vi user_list -> root 라인 제거

허가 설정

소유자 그룹 설정
$ sudo chown ansible:ansible *

$ anp ftp.yml
$ cd /etc/vsftpd
$ sudo cat ftpusers <- 파일이 잘 형성되었다.
$ sudo cat user_list <- 파일이 잘 형성되었다.

c) 서비스 기동 & 방화벽 서비스 등록

d) 확인 작업
$ anp ftp.yml
$ ftp ansible2

-> root 사용자는 접속 가능
->annoymous 사용자는 접속 불가능
□ 다음과 같은 조건을 갖는 target.yml 파일을 작성한다.
- 모든 노드는 multi-user.target를 사용하도록 설정한다.
[참고] multi-user.target, graphical.target
/usr/lib/systemd <-> /etc/systemd
* /usr/lib/systemd/system/multi-user.target
* /etc/systemd/system/default.target
(현재) # systemctl isolate graphical.target
(부팅) # systemctl set-default graphical.target
작동 원리 알기
$ ssh ansible2
$ systemctl set-default graphical.target

-> 심볼릭 링크 원리
플레이북 파일 설정
$ vi /project/target.yml

$ vi target.yml -> TUI 전환 확인
□ 다음과 같은 조건을 갖는 /home/ansible/project/cronjob.yml 파일을 생성한다.
* 다음 작업은 test 그룹에서만 실행된다.
* ansible 사용자의 잡 설정으로 한다.
* 잡 이름은 datejob으로 한다.
* 매시간 2번(0분, 30분)씩 평일(월~금)에만 date 명령의 출력 결과를
/home/ansible/datefile 저장한다.
* /home/ansible/datefile에는 date 명령의 출력 결과가 지속적으로 남겨져 있어야 한다.
분 시 일 월 요일 CMD
0,30 * * * 1-5 date >> /root/datefile
사용자가 ansilbe 사용자로 설정(다른 사용자 x)
-> remote_user: ansible로 설정한다.

$ anp cornjob.yml
$ ssh ansible2
$ crontab –l

□ 현재 구성된 여러개의 서비스 구성에 대한 종합 플레이북 playbook.yml을 만든다.
□ 다음은 total.yml 파일에 구성되어야 하는 내용들이다.
* /home/ansible/project/packages.yml 실행되어야 한다.
* /home/ansible/project/time_sync.yml 실행되어야 한다.
* /home/ansible/project/webservers.yml 실행되어야 한다.
