Ansible 다중 애플리케이션 역할 접근 방식

Ansible 다중 애플리케이션 역할 접근 방식

약간의 배경지식을 말씀드리자면, 저는 Puppet을 3년 동안 사용해왔고 그것이 아키텍처라는 것을 꽤 잘 이해하고 있었습니다. 우리 회사는 마이크로서비스 아키텍처를 기반으로 전체 제품을 리팩터링하고 있으며 지속적인 통합/배포를 사용하기 시작했습니다. 저는 이 기회를 이용하여 구성 관리를 Ansible로 전환하여 배포와 구성/오케스트레이션 모두에 하나의 도구만 사용할 수 있었습니다.

우리의 아키텍처는 라이브, 스테이징 및 3가지 통합/QA 환경을 갖춘 AWS를 기반으로 합니다. 각 마이크로서비스에는 자체적인 별도의 배포 프로세스가 있으며 통합/QA 환경은 단일 인스턴스에 모든 애플리케이션을 보유하는 반면 라이브/스테이징에는 여러 인스턴스가 있고 경우에 따라 마이크로서비스당 서로 다른 인스턴스 풀이 있습니다.

내 목표는 환경을 통해 템플릿을 매개변수화하는 변수를 사용하여 모든 환경에 대해 단일 Ansible 구성/배포 "리포지토리"를 갖는 것입니다. 이렇게 하면 전체 개발 주기에 걸쳐 일관된 구성 및 배포 프로세스가 있음을 알 수 있습니다.

지금 내가 의구심을 갖고 있는 것은 이러한 여러 애플리케이션에 대한 역할 생성에 어떻게 접근하는지에 관한 것입니다. 내가 찾은 대부분의 게시물은 간단한 튜토리얼이나 단일 애플리케이션 배포 예제이기 때문에 이 주제를 "구글"하기가 매우 어렵다는 것을 알았습니다.

제가 지금 고려하고 있는 것은 다음과 같습니다.

  1. nginx, java, logstash 등과 같이 필요한 각 "서비스"에 대해 별도의 역할을 각 애플리케이션 구성 파일과 함께 갖습니다. 이런 방식으로 역할 재사용성을 유지하고 두 개 이상의 앱이 변수를 통해 다르게 만들 수 있는 매우 유사한 구성 파일을 사용할 때 반복되는 것을 방지합니다. 또한 모든 배포 작업이 포함된 배포 역할도 갖게 됩니다. 이것은 Puppet으로 작업할 때 일반적으로 취하는 접근 방식이지만 구성이 분산되어 한 응용 프로그램 구성의 변경 사항이 다른 응용 프로그램 구성에 영향을 미칠 수 있는 몇 가지 사례를 찾아 추가하기가 "어려울 수 있습니다"(주로 둘 이상의 단일 템플릿을 제공하는 단일 템플릿으로 인해) 앱).

  2. 마이크로서비스에 대해 하나의 역할을 갖습니다. 모든 구성과 변수가 동일한 역할을 하기 때문에 작업하기가 더 쉽지만, 각 마이크로서비스에 대해 작업과 구성을 반복해야 하므로 조금 움츠러들게 됩니다.

이 질문의 이유는 동일한 문제에 직면한 사람들이 이를 어떻게 처리하는지 측정하기 위한 것입니다. Google 검색을 통해 이에 대한 합리적인 답변을 찾는 것이 거의 불가능하고 Ansible/다중 앱 배포를 사용하는 친구/지인이 없기 때문입니다.

제가 충분히 명확하지 않거나 혼란스럽다면 죄송합니다. 제게 주실 수 있는 모든 통찰력에 감사드립니다.

답변1

내가 할 일은 각각의 역할을 지정하는 것입니다.시스템 서비스귀하의 애플리케이션에 필요한놀다그리고역할각 애플리케이션/마이크로서비스에 대해그룹 및/또는 호스트 변수그리고역할 변수 및 기본값무엇을 해야할지 정의합니다.

저는 많은 PHP 기반 애플리케이션을 배포하므로 다음과 같습니다.

나는 연극을 할 것이다 app_microservice.yml:

---
- hosts: app_microservice_servers
  roles:
    - nginx
    - mariadb
    - php-fpm
    - app_microservice

그래서 나는역할 roles/app_microservice코드를 배포합니다. 이 플레이를 실행하면 nginx, mariadb 및 php-fpm 필수 구성 요소가 아직 설치되지 않은 경우 먼저 설치 및 구성됩니다.

콜링 외에도 roles플레이는 임의로 실행될 수도 있습니다 tasks. 완전한 역할이 요구되지 않을 정도로 단순한 것이 있다면 자유롭게 혼합하고 일치시키십시오.

이 연극도 all.yml다른 연극과 병행해서 가끔 할 수 있어요 ansible-playbook all.yml. Ansible은 Puppet처럼 멱등성을 보장하지 않으므로 주의해야 한다는 점을 기억하세요.

- include: app_microservice.yml

나는 사용한다그룹그룹에 공통적인 것을 정의하는 변수(비록 그룹에 맞지 않는 귀중한 소수가 있지만)역할대신 변수 또는 기본값), all전역 항목에 대한 그룹 변수 및주인호스트에 고유한 모든 것에 대한 변수입니다.

예를 들어, 나는 모든 호스트에 고유한 MySQL 루트 비밀번호를 제공하지만 SSL 암호 및 프로토콜을 정의하여 group_vars/all/main.yml변경해야 하는 경우 이를 위한 단일 소스가 있습니다.

관련 정보