Ansible: 인프라 as Code 구현 🚀
현대 IT 환경에서 인프라 관리는 점점 더 복잡해지고 있습니다. 클라우드 컴퓨팅, 마이크로서비스 아키텍처, 컨테이너화 등의 기술이 발전하면서 인프라 관리의 중요성이 더욱 부각되고 있죠. 이러한 복잡성을 효과적으로 다루기 위해 '인프라 as Code' (IaC) 개념이 등장했습니다. 그리고 이 개념을 실현하는 강력한 도구 중 하나가 바로 Ansible입니다.
Ansible은 Red Hat에서 개발한 오픈소스 자동화 도구로, 시스템 구성, 소프트웨어 배포, 지속적 배포 등 다양한 IT 작업을 자동화할 수 있습니다. 특히 Ansible은 에이전트리스(agentless) 아키텍처를 채택하고 있어, 관리 대상 시스템에 별도의 소프트웨어를 설치할 필요가 없다는 큰 장점이 있습니다.
이 글에서는 Ansible을 활용한 '인프라 as Code' 구현에 대해 상세히 알아보겠습니다. Ansible의 기본 개념부터 시작해 실제 사용 사례, 고급 기능, 그리고 최근의 트렌드까지 폭넓게 다룰 예정입니다. 특히 DB/서버 관리 측면에서 Ansible의 활용에 초점을 맞추어 설명하겠습니다.
IT 전문가들뿐만 아니라, 재능넷과 같은 플랫폼에서 활동하는 개발자, 시스템 관리자, 그리고 DevOps 엔지니어들에게도 유용한 정보가 될 것입니다. Ansible을 통해 인프라 관리의 효율성을 높이고, 더 나아가 여러분의 IT 역량을 한 단계 업그레이드할 수 있는 기회가 되길 바랍니다.
자, 그럼 Ansible의 세계로 함께 떠나볼까요? 🧭✨
1. Ansible 기초 이해하기 📚
1.1 Ansible이란?
Ansible은 IT 자동화 도구로, 시스템 구성, 소프트웨어 배포, 애플리케이션 배포 등 다양한 IT 작업을 자동화할 수 있는 강력한 플랫폼입니다. Python으로 작성되었으며, 간단하고 사용하기 쉬운 YAML 문법을 사용하여 자동화 작업을 정의합니다.
Ansible의 주요 특징은 다음과 같습니다:
- 에이전트리스(Agentless): 관리 대상 시스템에 별도의 소프트웨어를 설치할 필요가 없습니다.
- 멱등성(Idempotency): 동일한 작업을 여러 번 실행해도 결과가 항상 같습니다.
- 병렬 실행: 여러 시스템에 대해 동시에 작업을 수행할 수 있습니다.
- 모듈화: 다양한 모듈을 통해 거의 모든 IT 작업을 자동화할 수 있습니다.
- 플레이북(Playbook): YAML 형식의 스크립트로 복잡한 자동화 작업을 정의할 수 있습니다.
1.2 Ansible의 아키텍처
Ansible의 아키텍처는 크게 세 가지 주요 구성 요소로 이루어져 있습니다:
- Control Node: Ansible이 설치되어 있고, 자동화 작업을 실행하는 시스템입니다.
- Managed Nodes: Ansible을 통해 관리되는 대상 시스템들입니다.
- Inventory: 관리 대상 시스템들의 목록을 정의하는 파일입니다.
1.3 Ansible의 작동 원리
Ansible은 SSH를 통해 관리 대상 시스템과 통신합니다. 기본적인 작동 과정은 다음과 같습니다:
- Control Node에서 Playbook을 실행합니다.
- Ansible은 Inventory를 참조하여 대상 시스템을 식별합니다.
- SSH를 통해 대상 시스템에 연결합니다.
- 필요한 모듈을 대상 시스템으로 전송합니다.
- 모듈을 실행하고 결과를 수집합니다.
- 작업이 완료되면 모듈을 제거합니다.
이러한 과정을 통해 Ansible은 에이전트리스로 동작하면서도 효율적인 자동화를 구현할 수 있습니다.
1.4 Ansible vs 다른 자동화 도구
Ansible은 다른 인프라 자동화 도구들과 비교했을 때 몇 가지 독특한 장점을 가지고 있습니다:
도구 | 장점 | 단점 |
---|---|---|
Ansible |
- 에이전트리스 - 쉬운 학습 곡선 - YAML 기반의 간단한 문법 |
- 대규모 환경에서의 성능 이슈 - 상태 관리의 한계 |
Puppet |
- 강력한 상태 관리 - 대규모 환경에 적합 |
- 에이전트 필요 - 복잡한 설정 |
Chef |
- 유연한 Ruby 기반 DSL - 풍부한 커뮤니티 리소스 |
- 높은 학습 곡선 - 에이전트 필요 |
SaltStack |
- 높은 확장성 - 실시간 명령 실행 |
- 복잡한 설정 - 에이전트 필요 (선택적) |
Ansible의 에이전트리스 아키텍처와 간단한 YAML 문법은 특히 중소규모 환경이나 빠른 자동화 구현이 필요한 경우에 큰 장점이 됩니다. 하지만 모든 도구가 그렇듯 Ansible도 완벽하지는 않습니다. 대규모 환경에서는 성능 이슈가 발생할 수 있으며, 상태 관리 측면에서는 Puppet이나 Chef가 더 강력한 기능을 제공할 수 있습니다.
따라서 프로젝트의 규모, 복잡성, 팀의 기술 스택 등을 고려하여 적절한 도구를 선택하는 것이 중요합니다. Ansible은 특히 빠른 시작과 간단한 자동화 작업에 적합하며, DB/서버 관리 측면에서도 강력한 기능을 제공합니다.
다음 섹션에서는 Ansible을 실제로 설치하고 사용하는 방법에 대해 자세히 알아보겠습니다. 🛠️
2. Ansible 설치 및 구성 🔧
2.1 Ansible 설치하기
Ansible은 다양한 운영 체제에서 설치할 수 있습니다. 여기서는 주요 운영 체제별 설치 방법을 살펴보겠습니다.
Ubuntu/Debian 계열:
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
CentOS/RHEL 계열:
sudo yum install epel-release
sudo yum install ansible
macOS (Homebrew 사용):
brew install ansible
Windows:
Windows에서는 Ansible을 직접 실행할 수 없지만, Windows Subsystem for Linux (WSL)를 통해 사용할 수 있습니다. WSL에 Ubuntu를 설치한 후, Ubuntu 설치 방법을 따르면 됩니다.
2.2 Ansible 구성 파일
Ansible의 주요 구성 파일은 다음과 같습니다:
- ansible.cfg: Ansible의 기본 설정 파일
- inventory: 관리 대상 호스트 목록
- playbook.yml: 자동화 작업을 정의하는 YAML 파일
ansible.cfg 예시:
[defaults]
inventory = ./inventory
remote_user = ansible
private_key_file = ~/.ssh/id_rsa
host_key_checking = False
inventory 예시:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
[all:vars]
ansible_python_interpreter=/usr/bin/python3
2.3 SSH 키 설정
Ansible은 SSH를 통해 원격 시스템에 접속합니다. 따라서 SSH 키 설정이 중요합니다.
- SSH 키 생성:
ssh-keygen -t rsa -b 4096
- 공개 키를 원격 시스템에 복사:
ssh-copy-id user@remote_host
2.4 Ansible 테스트
설치와 구성이 완료되면 간단한 명령어로 Ansible이 제대로 작동하는지 테스트할 수 있습니다.
ansible all -m ping
이 명령어는 inventory에 정의된 모든 호스트에 대해 ping 모듈을 실행합니다. 성공적으로 연결되면 다음과 같은 결과를 볼 수 있습니다:
web1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
2.5 Ansible Galaxy 소개
Ansible Galaxy는 커뮤니티에서 제작한 다양한 Ansible 역할(Role)과 컬렉션(Collection)을 공유하는 플랫폼입니다. 이를 통해 복잡한 설정을 쉽게 재사용할 수 있습니다.
역할 설치 예시:
ansible-galaxy install geerlingguy.mysql
이 명령어는 MySQL 설치와 구성을 위한 역할을 설치합니다.
Ansible Galaxy를 활용하면 재능넷과 같은 플랫폼에서 활동하는 개발자들이 효율적으로 인프라를 관리할 수 있습니다. 특히 DB/서버 관리에 필요한 다양한 역할과 컬렉션을 쉽게 찾아 사용할 수 있어, 개발 생산성을 크게 향상시킬 수 있습니다.
다음 섹션에서는 Ansible의 핵심 개념인 플레이북(Playbook)에 대해 자세히 알아보겠습니다. 플레이북을 통해 복잡한 인프라 구성과 애플리케이션 배포를 어떻게 자동화할 수 있는지 살펴보겠습니다. 🚀
3. Ansible Playbook 작성하기 📝
3.1 Playbook이란?
Ansible Playbook은 시스템 구성, 배포, 오케스트레이션을 위한 스크립트입니다. YAML 형식으로 작성되며, 하나 이상의 '플레이(play)'로 구성됩니다. 각 플레이는 특정 호스트 그룹에 대해 수행할 작업(task)들의 집합입니다.
3.2 기본 Playbook 구조
간단한 Playbook의 구조는 다음과 같습니다:
---
- name: My first playbook
hosts: webservers
become: yes
tasks:
- name: Ensure Apache is installed
apt:
name: apache2
state: present
- name: Ensure Apache is running
service:
name: apache2
state: started
이 Playbook은 'webservers' 그룹의 모든 호스트에 Apache 웹 서버를 설치하고 실행합니다.
3.3 변수 사용
Playbook에서 변수를 사용하면 더 유연한 자동화 스크립트를 작성할 수 있습니다.
---
- name: Install and configure web server
hosts: webservers
vars:
http_port: 80
max_clients: 200
tasks:
- name: Install Apache
apt:
name: apache2
state: present
- name: Configure Apache
template:
src: apache2.conf.j2
dest: /etc/apache2/apache2.conf
notify: Restart Apache
handlers:
- name: Restart Apache
service:
name: apache2
state: restarted
이 예제에서는 `http_port`와 `max_clients` 변수를 정의하고, 이를 Apache 구성 파일 템플릿에서 사용할 수 있습니다.
3.4 조건문과 반복문
Ansible Playbook에서는 조건문과 반복문을 사용하여 더 복잡한 로직을 구현할 수 있습니다.
조건문 예시:
- name: Install web server
apt:
name: apache2
state: present
when: ansible_distribution == 'Ubuntu'
반복문 예시:
- name: Install multiple packages
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- mysql-server
- php-fpm
3.5 역할(Roles) 사용하기
역할은 Playbook을 구조화하고 재사용 가능한 컴포넌트로 만드는 방법입니다. 역할을 사용하면 복잡한 구성을 더 쉽게 관리할 수 있습니다.
역할의 기본 구조:
roles/
webserver/
tasks/
main.yml
handlers/
main.yml
templates/
apache2.conf.j2
vars/
main.yml
역할을 사용하는 Playbook 예시:
---
- name: Configure webservers
hosts: webservers
roles:
- webserver
3.6 Playbook 모범 사례
- 명확한 이름 사용: 각 작업에 명확하고 설명적인 이름을 부여합니다.
- 멱등성 유지: 작업이 여러 번 실행되어도 동일한 결과를 보장하도록 합니다.
- 변수 사용: 하드코딩된 값 대신 변수를 사용하여 유연성을 높입니다.
- 역할 활용: 복잡한 구성은 역할로 분리하여 관리합니다.
- 버전 관리: Playbook을 Git과 같은 버전 관리 시스템에서 관리합니다.
Ansible Playbook은 인프라 as Code의 핵심입니다. 잘 작성된 Playbook을 통해 복잡한 인프라 구성과 애플리케이션 배포를 자동화할 수 있습니다. 특히 DB/서버 관리 측면에서 Playbook은 일관성 있고 반복 가능한 프로세스를 구현하는 데 큰 도움이 됩니다.
재능넷과 같은 플랫폼에서 활동하는 개발자들은 Ansible Playbook을 활용하여 개발 환경 설정, 데이터베이스 구성, 서버 프로비저닝 등을 자동화할 수 있습니다. 이를 통해 개발 생산성을 높이고, 인프라 관리에 드는 시간과 노력을 크게 줄일 수 있습니다.
다음 섹션에서는 Ansible을 사용한 실제 DB/서버 관리 사례를 살펴보겠습니다. 데이터베이스 설치, 구성, 백업 등 다양한 작업을 Ansible로 어떻게 자동화할 수 있는지 자세히 알아보겠습니다. 🗃️💻
4. Ansible을 활용한 DB/서버 관리 🖥️
4.1 데이터베이스 서버 설치 및 구성
Ansible을 사용하여 데이터베이스 서버를 설치하고 구성하는 과정을 살펴보겠습니다. 여기서는 MySQL을 예로 들겠습니다.
---
- name: Install and Configure MySQL
hosts: dbservers
become: yes
vars:
mysql_root_password: "secure_password"
mysql_databases:
- name: myapp_db
encoding: utf8mb4
collation: utf8mb4_unicode_ci
mysql_users:
- name: myapp_user
password: "user_password"
priv: "myapp_db.*:ALL"
host: "%"
tasks:
- name: Install MySQL
apt:
name:
- mysql-server
- python3-mysqldb
state: present
- name: Start MySQL Service
service:
name: mysql
state: started
enabled: yes
- name: Set MySQL Root Password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Create MySQL Databases
mysql_db:
name: "{{ item.name }}"
encoding: "{{ item.encoding | default('utf8') }}"
collation: "{{ item.collation | default('utf8_general_ci') }}"
state: present
loop: "{{ mysql_databases }}"
- name: Create MySQL Users
mysql_user:
name: "{{ item.name }}"
password: "{{ item.password }}"
priv: "{{ item.priv | default('*.*:USAGE') }}"
host: "{{ item.host | default('localhost') }}"
state: present
loop: "{{ mysql_users } }}"
- name: Configure MySQL for Remote Access
lineinfile:
path: /etc/mysql/mysql.conf.d/mysqld.cnf
regexp: '^bind-address'
line: 'bind-address = 0.0.0.0'
notify: Restart MySQL
handlers:
- name: Restart MySQL
service:
name: mysql
state: restarted
이 Playbook은 MySQL 서버를 설치하고, 루트 비밀번호를 설정하며, 데이터베이스와 사용자를 생성합니다. 또한 원격 접속을 위해 MySQL 구성을 수정합니다.
4.2 데이터베이스 백업 자동화
정기적인 데이터베이스 백업은 중요한 관리 작업입니다. Ansible을 사용하여 이 과정을 자동화할 수 있습니다.
---
- name: Automate MySQL Backup
hosts: dbservers
become: yes
vars:
backup_dir: /var/backups/mysql
mysql_user: root
mysql_password: "{{ mysql_root_password }}"
tasks:
- name: Ensure backup directory exists
file:
path: "{{ backup_dir }}"
state: directory
mode: '0755'
- name: Perform MySQL backup
mysql_db:
state: dump
name: all
target: "{{ backup_dir }}/all_databases_{{ ansible_date_time.date }}.sql"
login_user: "{{ mysql_user }}"
login_password: "{{ mysql_password }}"
- name: Compress backup file
archive:
path: "{{ backup_dir }}/all_databases_{{ ansible_date_time.date }}.sql"
dest: "{{ backup_dir }}/all_databases_{{ ansible_date_time.date }}.sql.gz"
remove: yes
- name: Remove old backups
find:
paths: "{{ backup_dir }}"
patterns: "*.sql.gz"
age: 7d
recurse: yes
register: old_backups
- name: Delete old backup files
file:
path: "{{ item.path }}"
state: absent
loop: "{{ old_backups.files }}"
이 Playbook은 모든 데이터베이스를 백업하고, 백업 파일을 압축한 후, 7일 이상 된 오래된 백업을 삭제합니다.
4.3 서버 모니터링 설정
서버 모니터링은 시스템 관리의 핵심 부분입니다. Ansible을 사용하여 Prometheus와 Node Exporter를 설치하고 구성하는 방법을 살펴보겠습니다.
---
- name: Install and Configure Prometheus and Node Exporter
hosts: all
become: yes
vars:
prometheus_version: 2.30.3
node_exporter_version: 1.2.2
tasks:
- name: Download and install Node Exporter
get_url:
url: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
dest: /tmp/node_exporter.tar.gz
- name: Extract Node Exporter
unarchive:
src: /tmp/node_exporter.tar.gz
dest: /usr/local/bin
remote_src: yes
extra_opts: [--strip-components=1]
- name: Create Node Exporter systemd service
template:
src: node_exporter.service.j2
dest: /etc/systemd/system/node_exporter.service
notify: Restart Node Exporter
- name: Download and install Prometheus
get_url:
url: "https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/prometheus-{{ prometheus_version }}.linux-amd64.tar.gz"
dest: /tmp/prometheus.tar.gz
when: inventory_hostname in groups['monitoring']
- name: Extract Prometheus
unarchive:
src: /tmp/prometheus.tar.gz
dest: /usr/local/bin
remote_src: yes
extra_opts: [--strip-components=1]
when: inventory_hostname in groups['monitoring']
- name: Create Prometheus configuration
template:
src: prometheus.yml.j2
dest: /etc/prometheus/prometheus.yml
when: inventory_hostname in groups['monitoring']
notify: Restart Prometheus
- name: Create Prometheus systemd service
template:
src: prometheus.service.j2
dest: /etc/systemd/system/prometheus.service
when: inventory_hostname in groups['monitoring']
notify: Restart Prometheus
handlers:
- name: Restart Node Exporter
systemd:
name: node_exporter
state: restarted
daemon_reload: yes
- name: Restart Prometheus
systemd:
name: prometheus
state: restarted
daemon_reload: yes
when: inventory_hostname in groups['monitoring']
이 Playbook은 모든 서버에 Node Exporter를 설치하고, 모니터링 서버에 Prometheus를 설치합니다.
4.4 서버 보안 강화
서버 보안은 매우 중요한 관리 작업입니다. Ansible을 사용하여 기본적인 보안 설정을 자동화할 수 있습니다.
---
- name: Harden Server Security
hosts: all
become: yes
tasks:
- name: Update all packages
apt:
upgrade: dist
update_cache: yes
- name: Install fail2ban
apt:
name: fail2ban
state: present
- name: Enable and start fail2ban
systemd:
name: fail2ban
enabled: yes
state: started
- name: Configure SSH
lineinfile:
path: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }
- { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
notify: Restart SSH
- name: Set up UFW
ufw:
rule: allow
port: "{{ item }}"
loop:
- "22"
- "80"
- "443"
- name: Enable UFW
ufw:
state: enabled
handlers:
- name: Restart SSH
service:
name: sshd
state: restarted
이 Playbook은 시스템을 업데이트하고, fail2ban을 설치하며, SSH 설정을 보안 강화하고, 기본적인 방화벽 규칙을 설정합니다.
4.5 애플리케이션 배포 자동화
Ansible을 사용하여 애플리케이션 배포 프로세스를 자동화할 수 있습니다. 여기서는 간단한 웹 애플리케이션 배포 예제를 살펴보겠습니다.
---
- name: Deploy Web Application
hosts: webservers
become: yes
vars:
app_dir: /var/www/myapp
repo_url: https://github.com/myuser/myapp.git
tasks:
- name: Install required packages
apt:
name:
- git
- nginx
- python3-pip
state: present
- name: Clone application repository
git:
repo: "{{ repo_url }}"
dest: "{{ app_dir }}"
version: master
notify: Restart Nginx
- name: Install Python dependencies
pip:
requirements: "{{ app_dir }}/requirements.txt"
- name: Configure Nginx
template:
src: nginx_site.conf.j2
dest: /etc/nginx/sites-available/myapp
notify: Reload Nginx
- name: Enable Nginx site
file:
src: /etc/nginx/sites-available/myapp
dest: /etc/nginx/sites-enabled/myapp
state: link
notify: Reload Nginx
- name: Start application
systemd:
name: myapp
state: started
enabled: yes
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
- name: Reload Nginx
service:
name: nginx
state: reloaded
이 Playbook은 Git 저장소에서 애플리케이션 코드를 가져오고, 필요한 의존성을 설치하며, Nginx를 구성하고 애플리케이션을 시작합니다.
4.6 데이터베이스 마이그레이션
데이터베이스 스키마 변경이나 데이터 마이그레이션도 Ansible을 사용하여 자동화할 수 있습니다.
---
- name: Perform Database Migration
hosts: dbservers
become: yes
vars:
app_dir: /var/www/myapp
db_name: myapp_db
db_user: myapp_user
db_password: "{{ db_user_password }}"
tasks:
- name: Run database migrations
command:
cmd: python manage.py migrate
chdir: "{{ app_dir }}"
environment:
DATABASE_URL: "mysql://{{ db_user }}:{{ db_password }}@localhost/{{ db_name }}"
- name: Check migration status
command:
cmd: python manage.py showmigrations
chdir: "{{ app_dir }}"
register: migration_status
- name: Display migration status
debug:
var: migration_status.stdout_lines
이 Playbook은 Django 애플리케이션의 데이터베이스 마이그레이션을 실행하고 그 상태를 확인합니다.
이러한 Ansible Playbook들을 통해 DB/서버 관리 작업을 크게 자동화할 수 있습니다. 이는 재능넷과 같은 플랫폼에서 활동하는 개발자들에게 큰 도움이 될 수 있습니다. 반복적인 작업을 자동화함으로써 시간을 절약하고, 인적 오류를 줄이며, 일관된 환경을 유지할 수 있습니다.
다음 섹션에서는 Ansible을 사용할 때의 모범 사례와 고급 기능에 대해 알아보겠습니다. 이를 통해 더욱 효율적이고 강력한 자동화 시스템을 구축할 수 있을 것입니다. 🚀
5. Ansible 모범 사례 및 고급 기능 🏆
5.1 모범 사례
- 버전 관리 사용: Ansible 코드를 Git과 같은 버전 관리 시스템에서 관리하세요.
- 변수 사용: 환경별로 다른 값들은 변수로 관리하고, 가능한 한 하드코딩을 피하세요.
- 역할 활용: 복잡한 작업은 재사용 가능한 역할로 분리하세요.
- 멱등성 유지: 작업이 여러 번 실행되어도 동일한 결과를 보장하도록 설계하세요.
- 보안 유지: 민감한 정보는 Ansible Vault를 사용하여 암호화하세요.
- 테스트 자동화: Molecule과 같은 도구를 사용하여 Ansible 코드를 테스트하세요.
- 문서화: 각 Playbook과 역할의 목적과 사용 방법을 명확히 문서화하세요.
5.2 Ansible Vault
Ansible Vault는 민감한 데이터를 암호화하여 안전하게 관리할 수 있게 해주는 기능입니다.
# 파일 암호화
ansible-vault encrypt secrets.yml
# 암호화된 파일 편집
ansible-vault edit secrets.yml
# Playbook 실행 시 암호화된 파일 사용
ansible-playbook site.yml --ask-vault-pass
5.3 동적 인벤토리
클라우드 환경에서는 서버가 동적으로 생성되고 삭제됩니다. 동적 인벤토리 스크립트를 사용하면 이러한 환경에서도 효과적으로 Ansible을 사용할 수 있습니다.
#!/usr/bin/env python
import json
import subprocess
def get_ec2_instances():
# AWS CLI를 사용하여 EC2 인스턴스 정보 가져오기
cmd = ["aws", "ec2", "describe-instances"]
result = subprocess.run(cmd, stdout=subprocess.PIPE)
instances = json.loads(result.stdout)
inventory = {
"webservers": {
"hosts": [],
"vars": {}
},
"dbservers": {
"hosts": [],
"vars": {}
}
}
for reservation in instances["Reservations"]:
for instance in reservation["Instances"]:
if instance["State"]["Name"] == "running":
if "web" in instance["Tags"]:
inventory["webservers"]["hosts"].append(instance["PublicIpAddress"])
elif "db" in instance["Tags"]:
inventory["dbservers"]["hosts"].append(instance["PublicIpAddress"])
return inventory
if __name__ == "__main__":
inventory = get_ec2_instances()
print(json.dumps(inventory))
5.4 Ansible Galaxy
Ansible Galaxy를 활용하면 커뮤니티에서 제작한 고품질의 역할을 쉽게 사용할 수 있습니다.
# 역할 설치
ansible-galaxy install geerlingguy.mysql
# 역할을 사용하는 Playbook 예시
---
- hosts: dbservers
roles:
- geerlingguy.mysql
5.5 Ansible Tower / AWX
Ansible Tower(상용) 또는 AWX(오픈소스)는 Ansible의 웹 기반 UI와 REST API를 제공합니다. 이를 통해 팀 협업, 작업 스케줄링, 접근 제어 등 고급 기능을 사용할 수 있습니다.
5.6 Ansible과 CI/CD
Ansible을 CI/CD 파이프라인에 통합하면 지속적 배포를 자동화할 수 있습니다. 예를 들어, Jenkins와 Ansible을 함께 사용하는 파이프라인을 구성할 수 있습니다.
pipeline {
agent any
stages {
stage('Deploy') {
steps {
ansiblePlaybook(
playbook: 'deploy.yml',
inventory: 'inventory.ini',
credentialsId: 'ansible-ssh-key'
)
}
}
}
}
5.7 Ansible 성능 최적화
- SSH 멀티플렉싱: SSH 연결을 재사용하여 성능을 향상시킵니다.
- 팩트 캐싱: 시스템 정보를 캐시하여 실행 시간을 단축합니다.
- 비동기 작업과 폴링: 장시간 실행되는 작업을 비동기로 처리합니다.
- 병렬 실행: 여러 호스트에 대해 작업을 병렬로 실행합니다.
# ansible.cfg
[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
[defaults]
forks = 20
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache
fact_caching_timeout = 86400
이러한 모범 사례와 고급 기능을 활용하면 Ansible을 사용한 인프라 관리를 더욱 효율적이고 안전하게 수행할 수 있습니다. 특히 재능넷과 같은 플랫폼에서 활동하는 개발자들은 이러한 기술을 통해 복잡한 시스템을 더 쉽게 관리하고, 개발 생산성을 크게 향상시킬 수 있습니다.
다음 섹션에서는 Ansible을 사용한 실제 사례 연구와 최근의 트렌드에 대해 알아보겠습니다. 이를 통해 Ansible이 실제 비즈니스 환경에서 어떻게 활용되고 있는지, 그리고 앞으로 어떤 방향으로 발전할 것인지 이해할 수 있을 것입니다. 🌟