[Ansible] 2. playbook을 이용해 WAS-DB 한 번에 띄우기
* 참고 - 로컬 환경에서 ansible 설치 https://subbak2.tistory.com/206
* 사전 준비사항 :
python, docker, ansible 설치
1. 설계
ansible 실습을 위해 아래와 같은 환경을 생각했다.
playbook 을 통해 WAS, DB의 환경을 작성하고 docker container로 구동.
그러기 위해 2가지 파일을 준비했다.
1) inventory - playbook 의 실행 환경에 대한 설정파일 /etc/ansible/hosts로 해도 되지만 따로 작성했다
2) playbook - 실제 수행할 액션 기록
+ 참고용으로 playbook과 동일한 docker compose yaml 파일을 작성해봤다
3) docker_compose.yml - playbook과 동일한 내용을 명시한 파일 (ansible이 아닌 docker compose를 사용할때 필요한 파일)
2. 코드
~/ansible/ 폴더를 새로 만들고 그 밑에 3개의 파일을 작성했다
(ansible에서 필요한 파일은 inventory와 playbook 2개)
1) inventory
[local]
localhost ansible_connection=local ansible_python_interpreter=/usr/bin/python3
- 네트워크를 따로 구성하지 않았기 때문에 ssh 요청시 문제가 없도록 connection을 local로 명시
- 여러개의 python 버전을 사용 중이라 사용할 python 버전 명시
2) deploy_containers.yml (playbook)
---
- name: Deploy PostgreSQL and Flask containers
hosts: localhost
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Create network
docker_network:
name: my_network
driver: bridge
- name: Run PostgreSQL container
docker_container:
name: postgres
image: postgres:15
state: started
ports:
- "5432:5432"
env:
POSTGRES_USER: "flaskuser"
POSTGRES_PASSWORD: "flaskpassword"
POSTGRES_DB: "flaskdb"
networks:
- name: my_network
- name: Create Flask app directory
file:
path: ./flask_app
state: directory
- name: Write Flask app file
copy:
content: |
from flask import Flask
import psycopg2
app = Flask(__name__)
def connect_db():
conn = psycopg2.connect(
dbname="flaskdb",
user="flaskuser",
password="flaskpassword",
host="postgres"
)
return conn
@app.route('/')
def hello_world():
conn = connect_db()
conn.close()
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
dest: ./flask_app/app.py
- name: Write requirements file for Flask
copy:
content: |
requests
flask
psycopg2-binary
dest: ./flask_app/requirements.txt
- name: Run Flask container
docker_container:
name: flask
image: python:3.10
state: started
ports:
- "5000:5000"
command: >
sh -c "pip install -r /app/requirements.txt && python /app/app.py"
volumes:
- ./flask_app:/app
networks:
- name: my_network
- network구성 / DB 컨테이너 가동 / WAS 디렉토리 생성 / WAS 파일 작성 (app.py) / WAS requirements 작성 / WAS 가동
순서로 tasks를 구성했다
3) docker_compose.yml
version: '3.7'
services:
postgres:
image: postgres:15
environment:
POSTGRES_USER: "flaskuser"
POSTGRES_PASSWORD: "flaskpassword"
POSTGRES_DB: "flaskdb"
ports:
- "5432:5432"
networks:
- my_network
flask:
image: python:3.10
command: >
sh -c "pip install -r /app/requirements.txt && python /app/app.py"
volumes:
- ./flask_app:/app
ports:
- "5000:5000"
networks:
- my_network
networks:
my_network:
driver: bridge
ansible 대신 docker compose를 사용할 경우 필요한 파일이며, 디렉토리 생성, 코드 작성, 의존성 파일 작성 등은 할 수 없다
(참고용으로 작성)
3. 결과
1) 로그
ansible-playbook -i inventory deploy_containers.yml
2) 웹 화면
playbook에서 작성한대로 app.py에 작성한 Hello,World!가 잘 나온다
3) docker desktop 화면
컨테이너가 정상적으로 동작 중이다
참고자료 :
https://docs.ansible.com/ansible/latest/index.html