ecole42

cloud-1

cloud-1

cloud-1은 ecole42의 DevOps 프로젝트로, Ansible과 Docker를 사용하여 WordPress 웹사이트를 클라우드 서비스에 배포하는 프로젝트. MariaDB, WordPress 인스턴스 2개, Nginx 로드 밸런서, phpMyAdmin을 Docker 컨테이너로 구성하며, Ansible Playbook을 통해 자동화된 배포와 관리를 구현한다. Let's Encrypt를 통한 SSL 인증서 발급, 로드 밸런싱, 데이터베이스 관리 등을 통해 인프라 자동화와 클라우드 배포 기술을 학습한다

Ansible
Docker
Nginx
MariaDB

개요

cloud-1은 ecole42의 DevOps 프로젝트로, Ansible과 Docker를 사용하여 WordPress 웹사이트를 클라우드 서비스에 배포하는 프로젝트다.

시스템 구성

이 프로젝트는 다음 서비스들을 Docker 컨테이너로 구성한다:

  • MariaDB: WordPress 데이터베이스
  • WordPress: 웹사이트 인스턴스 2개 (로드 밸런싱용)
  • LoadBalancer: Nginx 기반 로드 밸런서 (포트 80, 443)
  • phpMyAdmin: 데이터베이스 관리 도구 (포트 9090)

Ansible이란?

Ansible은 인프라 자동화 및 구성 관리 도구로 SSH를 통해 원격 서버에 접속하여 소프트웨어 설치, 설정, 배포 등의 작업을 자동화할 수 있다. Playbook이라는 YAML 형식의 파일을 작성하여 반복적인 작업을 정의하고, 여러 서버에 동일한 설정을 일괄 적용할 수 있다. 에이전트 설치가 필요 없고, 선언적 방식으로 원하는 상태를 정의하면 Ansible이 자동으로 해당 상태로 만들어준다.

사전 요구사항

  • Vagrant
  • VirtualBox
  • Ansible
  • SSH 키 설정

로컬 개발 환경 설정

1. Vagrant 가상머신 시작

vagrant up

2. 서비스 실행

ansible-playbook ./playbooks/run.yml --limit local

3. 서비스 중지

ansible-playbook ./playbooks/stop.yml --limit local

SSH 설정

SSH 키 생성 및 복사

# SSH 키 생성
ssh-keygen -t ed25519 -C "your comment on this key"

# 서버에 공개키 복사 (서버의 ~/.ssh/authorized_keys에 추가)
ssh-copy-id -i ~/.ssh/id_ed25519.pub [ip_address]

Ansible 명령어

연결 확인

# 호스트 연결 확인
ansible -m ping [hostname]

# 호스트 정보 수집
ansible -m gather_facts [hostname]

Playbook 실행

# 로컬 환경에 배포
ansible-playbook ./playbooks/run.yml --limit local

# 원격 서버에 배포
ansible-playbook ./playbooks/run.yml --limit remote

인증서 관리

SSL 인증서 발급 (Let's Encrypt)

원격 서버에 SSL 인증서를 발급하려면:

ansible-playbook ./playbooks/cert.yml

이 명령은 다음 작업을 수행한다:

  • Nginx 설치 및 설정
  • Let's Encrypt 인증서 발급
  • 인증서를 LoadBalancer에 복사

WordPress 접속 정보

  • 사용자 ID: kychoi
  • 비밀번호: KyubongTest123

MariaDB 접속

명령줄에서 접속

mysql -u wp_user -pWpPassword wordpress

데이터베이스 덤프 (백업)

mysqldump -u [username] -p[password] [database_name] > db_backup.sql

원격 서버에서 파일 복사

원격 서버의 파일을 로컬로 복사:

scp user@remote_host:/root/inception/backup.sql /Users/yourname/Downloads/

프로젝트 구조

cloud-1/
├── ansible.cfg              # Ansible 설정 파일
├── inventory.yml            # 호스트 인벤토리 (로컬/원격 서버 정보)
├── Vagrantfile              # Vagrant 설정 파일
├── playbooks/
│   ├── run.yml              # 서비스 실행 Playbook
│   ├── stop.yml             # 서비스 중지 Playbook
│   └── cert.yml             # SSL 인증서 발급 Playbook
└── roles/
    ├── init/                # 초기 설정 역할
    ├── docker/              # Docker 설치 역할
    ├── inception/           # WordPress 스택 배포 역할
    └── cert/                # SSL 인증서 관리 역할

환경 변수 설정

roles/inception/files/example.env 파일을 참고하여 환경 변수를 설정한다:

  • MYSQL_WP_PASSWORD: WordPress 데이터베이스 비밀번호
  • MYSQL_ROOT_PASSWORD: MariaDB root 비밀번호
  • WP_DOMAIN: WordPress 도메인
  • PMA_HOST: phpMyAdmin 호스트
  • PMA_USER: phpMyAdmin 사용자
  • PMA_PASSWORD: phpMyAdmin 비밀번호
  • PMA_DATABASE: phpMyAdmin 데이터베이스

Vagrant 명령어

vagrant box list              # 사용 가능한 박스 목록
vagrant box remove [box_name] # 박스 제거
vagrant validate              # Vagrantfile 검증
vagrant up                    # 가상머신 시작
vagrant halt                  # 가상머신 중지
vagrant destroy               # 가상머신 삭제
vagrant ssh                   # 가상머신 SSH 접속
vagrant ssh-config            # SSH 설정 확인

참고 자료