아직 Terraform을 사용해보지 못했다면 다음과 같은 글을 참조하자.
https://iglu123.tistory.com/entry/Terraform으로-도커-컨테이너-구성하기
Terraform으로 도커 컨테이너 구성하기
테라폼으로 서버 구성을 해보려고 한다. 테라폼 정의테라폼(Terraform)은 인프라스트럭처를 코드로 관리할 수 있게 해주는 오픈소스 도구입니다. 이를 통해 사용자는 클라우드 환경에서 서버, 네
iglu123.tistory.com
테라폼으로 다음과 같이 세 개의 컨테이너를 구성한 상태이다.
name | ip | ||
컨테이너1 | master1 | 172.18.0.2 | |
컨테이너2 | worker1 | 172.18.0.3 | |
컨테이너3 | worker2 | 172.18.0.4 |
1. Ansible 개요
Ansible이란?
Ansible은 에이전트가 필요 없는 IT 자동화 도구로, 서버 설정, 애플리케이션 배포, 프로비저닝, 구성 관리 등을 수행할 수 있다. YAML 기반의 Playbook을 사용해 손쉽게 서버를 관리할 수 있다.
Ansible을 사용하는 이유
- 에이전트 불필요: SSH를 통해 직접 대상 서버에 접속
- 간결한 YAML 문법: 쉬운 자동화 스크립트 작성
- 다양한 환경 지원: 클라우드, 온프레미스, 컨테이너 등 다양한 환경에서 활용 가능
2. 환경 구성
Terraform을 사용하여 Ubuntu 컨테이너를 배포하고, Ansible로 Hadoop 관련 패키지를 설치하고 설정을 적용할 것이다.
Ansible을 사용하려면 각 서버에서 SSH를 통해 연결할 수 있어야 합니다. 기본적으로 Ansible은 SSH를 이용해 원격 서버에 접속하고 명령을 실행합니다.
2.1 Ansible 설치 (Ubuntu) 및 SSH 설정
sudo apt update && sudo apt install -y ansible
Ubuntu에서는 기본적으로 SSH 서버가 설치되지 않은 경우도 있으므로, 필요하면 다음 명령으로 설치합니다.
sudo apt update
sudo apt install -y openssh-server
설치 후 SSH 서비스가 실행 중인지 확인합니다.
sudo systemctl status ssh
만약 비활성화되어 있다면 시작하고 부팅 시 자동 실행되도록 설정합니다.
sudo systemctl enable --now ssh
Ansible 컨트롤 노드에서 대상 서버에 SSH 접속 가능해야 함
Ansible이 실행되는 컨트롤 노드에서 대상 서버로 SSH 접속이 가능해야 합니다. 비밀번호 없이 SSH 접속하려면 SSH 키 기반 인증을 설정하는 것이 좋습니다.
ssh-keygen -t rsa -b 4096
ssh-copy-id root@172.18.0.2 # master1
ssh-copy-id root@172.18.0.3 # worker1
ssh-copy-id root@172.18.0.4 # worker2
SSH 키가 복사되었는지 확인하기 위해 다음 명령을 실행해봅니다.
ssh root@172.18.0.2
비밀번호 없이 접속된다면 SSH 설정이 완료
2.2 프로젝트 디렉토리 생성
mkdir ansible && cd ansible
2.3 인벤토리 파일 (inventory.ini) 작성
Hadoop 클러스터를 위한 노드 목록을 작성한다.
vi inventory.ini
[hadoop]
master1 ansible_host=172.18.0.2
worker1 ansible_host=172.18.0.3
worker2 ansible_host=172.18.0.4
[hadoop:vars]
ansible_user=root
Ansible의 inventory.ini 파일에서 ansible_user를 지정해야 합니다.
기본적으로 Ansible은 ansible_user가 지정된 사용자를 통해 SSH로 접속합니다.
2.4 Ansible 설정 파일 (ansible.cfg)
vi ansible.cfg
[defaults]
inventory = inventory.ini
host_key_checking = False
3. Ansible Playbook 문법 자세히 설명하기
Ansible Playbook은 YAML 형식으로 작성되며, 여러 서버에 대한 자동화 작업을 정의하는 파일입니다. 아래에서 주요 문법 요소를 설명하고, 각 개념별로 예제를 들어 설명하겠습니다.
3.1. Ansible Playbook 기본 구조
Ansible Playbook은 다음과 같은 기본 구조를 가집니다.
- name: 플레이북의 이름
hosts: 적용할 대상 그룹
become: 관리자 권한 사용 여부 (yes/no)
tasks:
- name: 실행할 작업의 이름
module_name:
parameter1: value1
parameter2: value2
예제:
- name: Install and configure Nginx
hosts: webservers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
이 Playbook은 webservers 그룹의 서버에 nginx를 설치하는 작업을 수행합니다.
3.2. 주요 문법 요소
hosts (대상 서버 지정)
- hosts 키워드를 사용하여 Playbook이 실행될 대상 서버를 지정합니다.
- 대상 서버는 inventory 파일에서 정의한 그룹이나 개별 호스트가 될 수 있습니다.
- name: Configure all database servers
hosts: dbservers
tasks:
- name: Ensure MySQL is installed
apt:
name: mysql-server
state: present
become (관리자 권한 사용)
- become: yes를 사용하면 sudo 권한으로 작업을 실행합니다.
- root 권한이 필요하지 않은 경우 become: no로 설정합니다.
- name: Update system packages
hosts: all
become: yes
tasks:
- name: Run apt update
apt:
update_cache: yes
tasks (작업 목록 정의)
- Playbook에서 수행할 작업을 tasks 아래에 정의합니다.
- 각 작업은 name과 실행할 모듈 및 매개변수로 구성됩니다.
tasks:
- name: Ensure curl is installed
apt:
name: curl
state: present
modules (모듈 사용)
Ansible은 다양한 모듈을 제공하며, 자주 사용되는 모듈은 다음과 같습니다.
1) apt (Ubuntu/Debian 패키지 관리)
- name: Install multiple packages
apt:
name:
- git
- vim
- curl
state: present
update_cache: yes
2) yum (CentOS/RHEL 패키지 관리)
- name: Install Nginx on CentOS
yum:
name: nginx
state: present
3) service (서비스 관리)
- name: Ensure Nginx is running
service:
name: nginx
state: started
enabled: yes
4) copy (파일 복사)
- name: Copy index.html to web server
copy:
src: ./index.html
dest: /var/www/html/index.html
owner: root
group: root
mode: '0644'
5) template (Jinja2 템플릿 사용)
- name: Deploy Nginx configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
6) command (임의의 명령 실행)
- name: Run a custom command
command: echo "Hello, Ansible!"
7) shell (쉘 스크립트 실행)
- name: Run a shell script
shell: |
echo "Updating system..."
apt update && apt upgrade -y
handlers (이벤트 기반 작업 실행)
- 특정 작업이 변경될 때만 실행되는 작업입니다.
- 보통 notify 키워드와 함께 사용됩니다.
- name: Install Apache
apt:
name: apache2
state: present
notify: Restart Apache
handlers:
- name: Restart Apache
service:
name: apache2
state: restarted
variables (변수 사용)
변수를 정의하고 Playbook에서 사용할 수 있습니다.
1) Playbook 내부에서 변수 정의
- name: Example with variables
hosts: all
vars:
my_message: "Hello, Ansible!"
tasks:
- name: Print message
debug:
msg: "{{ my_message }}"
2) 변수 파일에서 불러오기
vars_files:
- vars.yml
(예제 vars.yml 파일)
my_message: "Hello from vars.yml!"
loops (반복문 사용)
여러 개의 항목을 반복 실행할 때 사용합니다.
- name: Install multiple packages
apt:
name: "{{ item }}"
state: present
loop:
- git
- vim
- curl
conditions (조건문 사용)
특정 조건이 충족될 때만 작업을 실행할 수 있습니다.
- name: Install MySQL only on Ubuntu
apt:
name: mysql-server
state: present
when: ansible_os_family == "Debian"
4. Ansible Playbook 작성
이제 직접 작성을 해보겠습니다!
setup_containers.yml 작성
이 Playbook은 예시로 Hadoop 컨테이너에 필요한 패키지를 설치하는 역할을 한다.
- name: Set up Hadoop containers
hosts: hadoop
become: yes
tasks:
- name: Upgrade packages
apt:
upgrade: yes
force_apt_get: yes
- name: Install required packages
apt:
name:
- curl
- rsync
- wget
- vim
- iputils-ping
- htop
- openjdk-11-jdk
- net-tools
- libxml2-dev
- libxslt1-dev
- python3-dev
- gcc
state: present
update_cache: yes
5. Playbook 실행
Ansible Playbook을 실행하여 Hadoop 컨테이너에 패키지를 설치한다.
ansible-playbook -i inventory.ini setup_containers.yml
이렇게 하면 Terraform으로 배포한 컨테이너에 Ansible을 활용해 필요한 설정을 자동화할 수 있다.
'DevOps' 카테고리의 다른 글
Terraform & Ansible 이용해서 Hadoop, Hbase, Spark 클러스터 구성하기 (0) | 2025.02.21 |
---|---|
Terraform으로 도커 컨테이너 구성하기 (0) | 2025.02.04 |
아직 Terraform을 사용해보지 못했다면 다음과 같은 글을 참조하자.
https://iglu123.tistory.com/entry/Terraform으로-도커-컨테이너-구성하기
Terraform으로 도커 컨테이너 구성하기
테라폼으로 서버 구성을 해보려고 한다. 테라폼 정의테라폼(Terraform)은 인프라스트럭처를 코드로 관리할 수 있게 해주는 오픈소스 도구입니다. 이를 통해 사용자는 클라우드 환경에서 서버, 네
iglu123.tistory.com
테라폼으로 다음과 같이 세 개의 컨테이너를 구성한 상태이다.
name | ip | ||
컨테이너1 | master1 | 172.18.0.2 | |
컨테이너2 | worker1 | 172.18.0.3 | |
컨테이너3 | worker2 | 172.18.0.4 |
1. Ansible 개요
Ansible이란?
Ansible은 에이전트가 필요 없는 IT 자동화 도구로, 서버 설정, 애플리케이션 배포, 프로비저닝, 구성 관리 등을 수행할 수 있다. YAML 기반의 Playbook을 사용해 손쉽게 서버를 관리할 수 있다.
Ansible을 사용하는 이유
- 에이전트 불필요: SSH를 통해 직접 대상 서버에 접속
- 간결한 YAML 문법: 쉬운 자동화 스크립트 작성
- 다양한 환경 지원: 클라우드, 온프레미스, 컨테이너 등 다양한 환경에서 활용 가능
2. 환경 구성
Terraform을 사용하여 Ubuntu 컨테이너를 배포하고, Ansible로 Hadoop 관련 패키지를 설치하고 설정을 적용할 것이다.
Ansible을 사용하려면 각 서버에서 SSH를 통해 연결할 수 있어야 합니다. 기본적으로 Ansible은 SSH를 이용해 원격 서버에 접속하고 명령을 실행합니다.
2.1 Ansible 설치 (Ubuntu) 및 SSH 설정
sudo apt update && sudo apt install -y ansible
Ubuntu에서는 기본적으로 SSH 서버가 설치되지 않은 경우도 있으므로, 필요하면 다음 명령으로 설치합니다.
sudo apt update
sudo apt install -y openssh-server
설치 후 SSH 서비스가 실행 중인지 확인합니다.
sudo systemctl status ssh
만약 비활성화되어 있다면 시작하고 부팅 시 자동 실행되도록 설정합니다.
sudo systemctl enable --now ssh
Ansible 컨트롤 노드에서 대상 서버에 SSH 접속 가능해야 함
Ansible이 실행되는 컨트롤 노드에서 대상 서버로 SSH 접속이 가능해야 합니다. 비밀번호 없이 SSH 접속하려면 SSH 키 기반 인증을 설정하는 것이 좋습니다.
ssh-keygen -t rsa -b 4096
ssh-copy-id root@172.18.0.2 # master1
ssh-copy-id root@172.18.0.3 # worker1
ssh-copy-id root@172.18.0.4 # worker2
SSH 키가 복사되었는지 확인하기 위해 다음 명령을 실행해봅니다.
ssh root@172.18.0.2
비밀번호 없이 접속된다면 SSH 설정이 완료
2.2 프로젝트 디렉토리 생성
mkdir ansible && cd ansible
2.3 인벤토리 파일 (inventory.ini) 작성
Hadoop 클러스터를 위한 노드 목록을 작성한다.
vi inventory.ini
[hadoop]
master1 ansible_host=172.18.0.2
worker1 ansible_host=172.18.0.3
worker2 ansible_host=172.18.0.4
[hadoop:vars]
ansible_user=root
Ansible의 inventory.ini 파일에서 ansible_user를 지정해야 합니다.
기본적으로 Ansible은 ansible_user가 지정된 사용자를 통해 SSH로 접속합니다.
2.4 Ansible 설정 파일 (ansible.cfg)
vi ansible.cfg
[defaults]
inventory = inventory.ini
host_key_checking = False
3. Ansible Playbook 문법 자세히 설명하기
Ansible Playbook은 YAML 형식으로 작성되며, 여러 서버에 대한 자동화 작업을 정의하는 파일입니다. 아래에서 주요 문법 요소를 설명하고, 각 개념별로 예제를 들어 설명하겠습니다.
3.1. Ansible Playbook 기본 구조
Ansible Playbook은 다음과 같은 기본 구조를 가집니다.
- name: 플레이북의 이름
hosts: 적용할 대상 그룹
become: 관리자 권한 사용 여부 (yes/no)
tasks:
- name: 실행할 작업의 이름
module_name:
parameter1: value1
parameter2: value2
예제:
- name: Install and configure Nginx
hosts: webservers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
이 Playbook은 webservers 그룹의 서버에 nginx를 설치하는 작업을 수행합니다.
3.2. 주요 문법 요소
hosts (대상 서버 지정)
- hosts 키워드를 사용하여 Playbook이 실행될 대상 서버를 지정합니다.
- 대상 서버는 inventory 파일에서 정의한 그룹이나 개별 호스트가 될 수 있습니다.
- name: Configure all database servers
hosts: dbservers
tasks:
- name: Ensure MySQL is installed
apt:
name: mysql-server
state: present
become (관리자 권한 사용)
- become: yes를 사용하면 sudo 권한으로 작업을 실행합니다.
- root 권한이 필요하지 않은 경우 become: no로 설정합니다.
- name: Update system packages
hosts: all
become: yes
tasks:
- name: Run apt update
apt:
update_cache: yes
tasks (작업 목록 정의)
- Playbook에서 수행할 작업을 tasks 아래에 정의합니다.
- 각 작업은 name과 실행할 모듈 및 매개변수로 구성됩니다.
tasks:
- name: Ensure curl is installed
apt:
name: curl
state: present
modules (모듈 사용)
Ansible은 다양한 모듈을 제공하며, 자주 사용되는 모듈은 다음과 같습니다.
1) apt (Ubuntu/Debian 패키지 관리)
- name: Install multiple packages
apt:
name:
- git
- vim
- curl
state: present
update_cache: yes
2) yum (CentOS/RHEL 패키지 관리)
- name: Install Nginx on CentOS
yum:
name: nginx
state: present
3) service (서비스 관리)
- name: Ensure Nginx is running
service:
name: nginx
state: started
enabled: yes
4) copy (파일 복사)
- name: Copy index.html to web server
copy:
src: ./index.html
dest: /var/www/html/index.html
owner: root
group: root
mode: '0644'
5) template (Jinja2 템플릿 사용)
- name: Deploy Nginx configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
6) command (임의의 명령 실행)
- name: Run a custom command
command: echo "Hello, Ansible!"
7) shell (쉘 스크립트 실행)
- name: Run a shell script
shell: |
echo "Updating system..."
apt update && apt upgrade -y
handlers (이벤트 기반 작업 실행)
- 특정 작업이 변경될 때만 실행되는 작업입니다.
- 보통 notify 키워드와 함께 사용됩니다.
- name: Install Apache
apt:
name: apache2
state: present
notify: Restart Apache
handlers:
- name: Restart Apache
service:
name: apache2
state: restarted
variables (변수 사용)
변수를 정의하고 Playbook에서 사용할 수 있습니다.
1) Playbook 내부에서 변수 정의
- name: Example with variables
hosts: all
vars:
my_message: "Hello, Ansible!"
tasks:
- name: Print message
debug:
msg: "{{ my_message }}"
2) 변수 파일에서 불러오기
vars_files:
- vars.yml
(예제 vars.yml 파일)
my_message: "Hello from vars.yml!"
loops (반복문 사용)
여러 개의 항목을 반복 실행할 때 사용합니다.
- name: Install multiple packages
apt:
name: "{{ item }}"
state: present
loop:
- git
- vim
- curl
conditions (조건문 사용)
특정 조건이 충족될 때만 작업을 실행할 수 있습니다.
- name: Install MySQL only on Ubuntu
apt:
name: mysql-server
state: present
when: ansible_os_family == "Debian"
4. Ansible Playbook 작성
이제 직접 작성을 해보겠습니다!
setup_containers.yml 작성
이 Playbook은 예시로 Hadoop 컨테이너에 필요한 패키지를 설치하는 역할을 한다.
- name: Set up Hadoop containers
hosts: hadoop
become: yes
tasks:
- name: Upgrade packages
apt:
upgrade: yes
force_apt_get: yes
- name: Install required packages
apt:
name:
- curl
- rsync
- wget
- vim
- iputils-ping
- htop
- openjdk-11-jdk
- net-tools
- libxml2-dev
- libxslt1-dev
- python3-dev
- gcc
state: present
update_cache: yes
5. Playbook 실행
Ansible Playbook을 실행하여 Hadoop 컨테이너에 패키지를 설치한다.
ansible-playbook -i inventory.ini setup_containers.yml
이렇게 하면 Terraform으로 배포한 컨테이너에 Ansible을 활용해 필요한 설정을 자동화할 수 있다.
'DevOps' 카테고리의 다른 글
Terraform & Ansible 이용해서 Hadoop, Hbase, Spark 클러스터 구성하기 (0) | 2025.02.21 |
---|---|
Terraform으로 도커 컨테이너 구성하기 (0) | 2025.02.04 |