
지금까지 1년 반 동안 일해 온 시스템을 배포하는 데 도움이 필요합니다. 저의 우려 사항을 이해하실 수 있도록 당사 인프라에 대해 조금 설명하겠습니다.
우리 시스템에 대한 다양한 테스트 환경을 갖춘 서버(TESTING_SERVER라고 함)가 있습니다. 이러한 각 환경은 전적으로 docker로 실행됩니다. 테스트 환경의 각 인스턴스는 다음으로 구성됩니다. 1. nginx가 프록시 역할을 하는 Docker 컨테이너 2. Django 웹이 있는 Docker 컨테이너 3. mysql이 있는 Docker 컨테이너
테스트 목적으로 새 환경을 구축해야 할 때마다(예: QA가 새 기능을 테스트하려고 함) TESTING_SERVER에서 다음 작업을 실행하는 Ansible 플레이북을 사용합니다.
- 도커 네트워크 만들기
- 데이터베이스 컨테이너 생성
- TESTING_SERVER 어딘가에 django git repo를 복제하거나 업데이트하세요.
- django 컨테이너 생성
- django 컨테이너 내에서 django Collectstatic 명령 실행
- django 컨테이너 내에서 django migration 명령 실행
- nginx 컨테이너 생성
우리 프로덕션 환경에는 mysql, django 및 nginx를 실행하는 일반 우분투 서버(PRODUCTION_SERVER)가 있습니다. 프로덕션에 배포해야 할 때마다 위에 나열된 단계를 (거의) 반복하는 Ansible 플레이북을 실행합니다.
- mysql 연결을 확인하십시오 (db는 다른 서버에 있습니다)
- PRODUCTION_SERVER 어딘가에 django git repo를 복제하거나 업데이트하세요.
- gunicorn을 확인하고 다시 시작합니다(django 컨테이너 생성과 동일).
- django Collectstatic 실행
- django 마이그레이션 실행
- nginx 구성 확인
이 두 플레이북은 서로 다르지만 공통점이 많습니다. 각 단계를 ansible 작업으로 변환하고 조건을 사용하여 어떤 작업(dockerized 또는 direct)을 실행해야 하는지 파악하려고 했습니다. 하지만 여전히 각 단계마다 다른 작업이 있습니다(동일한 플레이북이지만 약간 까다로워 보입니다).
내 질문은: 이러한 플레이북을 반복하지 않고 하나만 갖도록 "병합"하는 방법이 있습니까?
답변1
모범 사례 문서에 설명된 것과 유사하게 "작업"별로 역할을 생성하고 플레이북에서 사용합니다.
http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#directory-layout
예를 들어
roles/
create_a_docker_network/
tasks/
main.yml
create_database_container/...
...
Create_nginx_container/
플레이북에서 역할을 호출하세요.
테스트.yml
- hosts: testserver
roles:
- create_a_docker_network
- create_database_container
- ...