728x90
1. [실습] 웹 서버 설치 및 삭제 자동화
- webserver 그룹 서버에 Apache 웹서버 설치 및 서비스 설정 자동화
- 로컬 파일을 원격 서버로 복사 (웹 페이지 제공)
- 웹 서비스 활성화 및 방화벽 설정 적용
- 위 작업을 제거(rollback)하는 Playbook 작성 및 실행
- 정상적으로 웹 서버가 서비스되고 있는지 HTTP 요청으로 확인
방식별 정리
1. 단순한 개별 요청
- name: URL check 130 uri: url: http://10.10.10.130
- 간단하지만 중복이 많아짐
- 서버 개수 늘어나면 유지보수 어려움
2. delegate_to: localhost 사용
- name: URL check uri: url: http://{{ inventory_hostname }} delegate_to: localhost
- 웹서버가 아닌 컨트롤러 머신에서 직접 요청 수행
- 웹서비스 외부 접근 가능성 테스트에 유리
- sudo 관련 문제 발생 → become: false 또는 NOPASSWD 설정 필요
3. run_once: true → 중복 방지
run_once: true
- 하나의 대상만 요청 수행 (예: 대표 노드)
- 모든 노드를 개별로 체크하려면 적합하지 않음
4. when 조건으로 호스트별 분기
when: inventory_hostname == "node3"
- 지정된 호스트에서만 수행
- 단순 명시적 제어 가능
5. loop + when 조건 조합 (최종 버전)
loop: - { hostname: "node3", ip: "10.10.10.130" } - { hostname: "node4", ip: "10.10.10.140" } when: inventory_hostname == item.hostname
- 반복과 조건을 함께 사용 → 중복 없는 URL 체크 가능
- 확장성, 유지보수 뛰어남 (서버 10대 이상도 간단히 확장)
- 출력도 직관적
- grep -v skipping: 으로 깔끔한 결과 추출
최종 파일
ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ansible
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
inventory
node1
node2
[webserver]
node3 ansible_hostname="node3"
node4 ansible_hostname="node4"
web.yml
---
- name: install and service start HTTPD
hosts: webserver
tasks:
- name: httpd package set install
ansible.builtin.dnf:
name: httpd
state: present
- name: local index.html file remotecopy target node3.example.com
ansible.builtin.copy:
src: files/index.html
dest: /var/www/html/index.html
mode: '0644'
- name: systemd webservice start
ansible.builtin.systemd_service:
name: httpd
state: started
enabled: true
- name: firewalld httpd config
ansible.posix.firewalld:
service: http
permanent: true
state: enabled
immediate: yes
- name: URL check
ansible.builtin.uri:
url: http://10.10.10.130
return_content: yes
status_code: 200
- name: URL check
ansible.builtin.uri:
url: http://10.10.10.140
return_content: yes
status_code: 200
...
url_check.yml
---
- name: install and service start HTTPD
hosts: webserver
become: false
tasks:
- name: URL check 130
ansible.builtin.uri:
url: "http://{{ item.ip }}"
return_content: yes
status_code: 200
delegate_to: localhost
loop:
- { hostname: "node3", ip: "10.10.10.130" }
- { hostname: "node4", ip: "10.10.10.140" }
when: inventory_hostname == item.hostname
번외)
마지막 실습에서 module 관련된 에러가 발생했다... 복습 영상을 참고해봤지만 해결되지 않았다.
✍️ 하루 회고
오늘은 실습 위주의 수업이었다. 차근차근 파일들을 수정해나가는 과정과 제대로 실행됐을 때 쾌감이 있었지만 아직 Ansible이 낯설어서 그런지 따라가는데 급급했던 것 같다. 주말에 Ansible 문법과 실습 내용을 복습해봐야겠다.
마지막 실습에서 만난 에러는 해결하지 못해서 너무 아쉬웠다. 혹여나 내가 놓친 부분이 있을까 싶어 복습 영상이 올라온 뒤에 다시 해봤지만 해결하지 못했다. 구글링에도 정보가 없어 주중에 강사님께 여쭤봐야 할 것 같다.
728x90
'TIL' 카테고리의 다른 글
[에스넷시스템 부트캠프] TIL Day 24 - KVM, QEMU, 클라우드 기초 용어 (0) | 2025.06.23 |
---|---|
[에스넷시스템 부트캠프] TIL Day 23 - 직무 특강 (0) | 2025.06.21 |
[에스넷시스템 부트캠프] TIL Day 21 - Ansible 문법 (2) | 2025.06.19 |
[에스넷시스템 부트캠프] TIL Day 20 - IaC, Ansible 기초 (0) | 2025.06.17 |
[에스넷시스템 부트캠프] TIL Day 19 - 스크립트, 반복문, 조건문, 원격지 접근 자동화 스크립트 (0) | 2025.06.16 |