아키텍처 Architecture/Cloud Architecture

[Ansible] 2. playbook을 이용해 WAS-DB 한 번에 띄우기

섭코딩 2024. 6. 8. 17:18

 

 

 

 

* 참고 - 로컬 환경에서 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

 

Ansible Documentation — Ansible Community Documentation

© Copyright Ansible project contributors. Last updated on Jun 06, 2024.

docs.ansible.com

 

반응형