개요
안녕하세요! 앤서블 1단계 수업을 무사히 마치고 돌아오신 것을 환영합니다. 🥳
지난 시간에는 nginx를 설치하는 간단한 플레이북을 작성하고 실제로 테스트까지 진행하였습니다.
하지만 실제 업무는 그렇게 단순하지 않겠죠?
서버마다 다른 설정을 적용해야 할 때가 있을 것이고, 수많은 사용자를 한꺼번에 만들어야 할 때도 있어요.
이번 수업에서는 변수, 조건문, 그리고 반복문 에 대해서 배워보겠습니다.
1교시: 변수 - 설정 값, 이제 한곳에서 관리하자!
똑같은 값을 여러 곳에 반복해서 쓴다면, 나중에 변경해야 할 때 아주 번거롭습니다.
변수는 이렇게 반복되는 값을 '이름표'를 붙여 저장해두고, 필요할 때마다 이름표를 불러다 쓰는 기능입니다.
오늘의 실습 시나리오
상황
지난번에 설치한 webservers
그룹에 웹 서비스 관리자(webadmin
) 계정을 만들어야 합니다.
또한, 앞으로 관리할 서버가 늘어날 것을 대비해 웹 서버 종류(nginx
) 와 포트(80
) 같은 주요 설정 값을 변수로 관리하고 싶습니다.
목표
- 1. 플레이북에 변수를 사용하여 nginx 패키지 이름과 사용자 이름 정의하기
- 2. 정의된 변수를 이용해
webadmin
사용자 생성하고,nginx
설치하기
플레이북에 변수 적용하기
1단계에서 만들었던 nginx_install.yaml
파일을 아래와 같이 수정하겠습니다.
vars
섹션이 추가로 작성되었어요.
---
- name: Manage web server with variables
hosts: webservers
become: yes
vars:
web_pkg: nginx
web_user: webadmin
tasks:
- name: Install web package
ansible.builtin.yum:
name: "{{ web_pkg }}" # 변수 사용
state: present
- name: Create a web administrator user
ansible.builtin.user:
name: "{{ web_user }}" # 변수 사용
comment: Web Admin
- name: Start web service
ansible.builtin.service:
name: "{{ web_pkg }}" # 변수 사용
state: started
enabled: yes
vars:
: 이 플레이북에서 사용할 변수들을 정의하는 공간입니다.web_pkg
: nginx : web_pkg 라는 변수에 nginx 값을 저장했습니다.web_user
: webadmin : web_user 라는 변수에 webadmin 값을 저장했습니다."{{ 변수명 }}"
: 정의한 변수를 사용할 때는 이렇게 중괄호 두 개로 감싸줍니다. 이제 나중에 웹 서버를 Apache(httpd)로 바꾸고 싶다면, vars 섹션의 web_pkg 값만 httpd로 수정하면 되겠죠?
테스트
플레이북 실행하고, webadmin
사용자가 정말 만들어졌는지 확인해봅시다.
# 플레이북 실행
ansible-playbook nginx_install.yml
# webservers 그룹 서버에서 /etc/passwd 파일에 webadmin이 있는지 확인
ansible webservers -a 'cat /etc/passwd | grep webadmin'
2교시: 조건문(when
) - 상황에 맞게 움직이기
모든 서버에 항상 똑같은 작업을 하지는 않습니다.
예를 들어, CentOS 서버에는 yum
으로, Ubuntu 서버에는 apt
로 패키지를 설치해야 하죠.
**조건문(when)**은 특정 조건이 참(True)일 때만 해당 작업을 수행하도록 만드는 아주 유용한 기능입니다.
오늘의 실습 시나리오
상황
회사에 Ubuntu 서버(ubuntu_web)가 새로 들어왔습니다. 이 서버도 webservers 그룹에 추가하여 Nginx를 설치해야 합니다.
목표
- 1. 서버의 운영체제(OS)가 CentOS 계열일 때만
yum
모듈을 사용한다. - 2. 서버의 운영체제(OS)가 Debian/Ubuntu 계열일 때만
apt
모듈을 사용한다.
플레이북에 조건문 적용하기
앤서블은 각 서버의 시스템 정보(ansible_facts
)를 자동으로 수집합니다.
이 정보 중 OS 종류를 알려주는 ansible_os_family
변수를 활용할 수 있습니다.
---
- name: Manage web server with variables and conditionals
hosts: webservers
become: yes
vars:
web_pkg: nginx
tasks:
- name: Install Nginx on RHEL/CentOS
ansible.builtin.yum:
name: "{{ web_pkg }}"
state: present
when: ansible_os_family == "RedHat" # OS가 RedHat 계열일 때만 실행
- name: Install Nginx on Debian/Ubuntu
ansible.builtin.apt:
name: "{{ web_pkg }}"
state: present
when: ansible_os_family == "Debian" # OS가 Debian 계열일 때만 실행
# ... (서비스 시작 등 나머지 tasks)
when: ansible_os_family == "RedHat"
:ansible_facts
가 수집한 OS 제품군 정보가 "RedHat"일 경우에만 이 yum 작업을 실행하라는 뜻입니다.when: ansible_os_family == "Debian":
OS 제품군이 "Debian"일 경우 이 apt 작업을 실행합니다.
3교시: 반복문(loop
) - 수백 번 할 일도 단번에 처리하기
여러 명의 사용자를 만들거나, 여러 개의 패키지를 설치하거나, 여러 개의 디렉토리를 생성할 때, 똑같은 작업을 복사/붙여넣기 할 건가요?
반복문(loop) 을 사용하면 리스트에 있는 항목들을 하나씩 꺼내어 동일한 작업을 자동으로 반복 수행할 수 있습니다.
오늘의 실습 시나리오
상황
웹 개발팀에서 dev1
, dev2
, dev3
세 명의 개발자 계정을 서버에 추가해달라는 요청이 왔습니다.
목표
- 1. loop를 사용하여 3명의 개발자 계정을 한 번의 task로 모두 생성한다.
플레이북에 반복문 적용하기
사용자 생성 작업을 loop를 사용해 아래와 같이 바꿔봅시다.
---
- name: Manage web server with advanced features
hosts: webservers
become: yes
vars:
developers:
- dev1
- dev2
- dev3
tasks:
- name: Create developer accounts
ansible.builtin.user:
name: "{{ item }}" # loop를 돌 때마다 리스트의 항목이 item에 담깁니다
state: present
loop: "{{ developers }}"
loop: "{{ developers }}"
: developers 라는 변수(리스트)에 있는 항목(dev1, dev2, dev3)의 개수만큼 이 작업을 반복하라는 의미입니다.name: "{{ item }}"
: loop가 실행될 때 리스트의 각 항목은item
이라는 특수한 변수에 자동으로 할당됩니다. 첫 번째 반복에서는 item이 "dev1", 두 번째에서는 "dev2", 세 번째에서는 "dev3"가 됩니다.
테스트
플레이북을 실행하고, 정말 3명의 계정이 모두 만들어졌는지 확인해봅시다.
# 플레이북 실행
ansible-playbook your_playbook_name.yml
# 3명의 계정이 모두 생성되었는지 확인
ansible webservers -a 'cat /etc/passwd | grep dev'