코드 저장소에서 DevOps 관련 코드 및 구성을 구성하는 방법은 무엇입니까?


10

우리는 회사로 성장하고 있으며 제품은 확장하고 DevOps 관련 활동과 노력도 증가하고 있습니다. 우리는 배치 파이프 라인 및 기타 플러그인을 사용하여 Bamboo에서보다 유연하고 구성 가능한 Jenkins로 전환했습니다. Ansible로 전환하고 여기 저기 내부에서 Docker를 사용하기 시작했습니다.

이 모든 것들에는 일정 수준의 코딩 또는 구성이 필요합니다. Ansible 스크립트 및 구성, Jenkins 그루비 스크립트, Dockerfile 및 YAML 구성.

지금, 우리는 높은 수준의 디렉토리와 별도의 "작전"저장소를 만든 jenkins, ansible, dockerother(끔찍한 이름이지만, 지금은 모든 "다른"개발 운영 자동화 것들이이있는).

우리의 접근 방식은 옳지 않고 확장되지 않을 수도 있지만 DevOps 관련 코드를 코드 리포지토리 또는 리포지토리에 유지하기위한 모범 사례와 권장 사항은 무엇입니까?


6
"요리 책마다 1 개의 repo를 의미하는 요리사에서"각 부분은 앱, 하나의 앱당 하나의 repo "방법으로갑니다.
Tensibai

@ Tensibai 맞다, 나는 하나의 "ops"레포가 빨리 비실용적이 될까봐 두려웠다. 감사.
alecxe

1
그것은 요리사의 레거시 관리의 레거시 형태였으며, 모든 요리 책이있는 레포 1 개이며 대부분의 경우 발판으로 입증되었지만 변경 사항은 Jenkins 파이프 라인 (v2 인 경우)에 적합하지 않습니다. 도커 파일은 IMO를 처리하는 프로젝트와 함께 살아야하며, 당신이 무엇을 넣었는지 전혀 알지 못하므로 조언을 드릴 수 없습니다.
Tensibai

@ Tensibai는 그것을 얻었다! 기타는 대부분 bash 및 python 유틸리티 또는 여러 내부 도구에 대해 정기적으로 실행되는 스크립트로 구성됩니다. 실제로 어디에도 적합하지 않으며 "other"보다 더 나은 위치를 생각할 수 없습니다. 내용을 게시 할 수 있는지 확인합니다. 질문에 디렉토리의. 감사.
alecxe

1
나는 작업의 '친 화성', 응용 프로그램 X에서 함께 작동하는 스크립트로 두 개의 저장소로 나눕니다. 두 개의 응용 프로그램에서 스크립트를 사용할 수 있지만 응용 프로그램 A가 변경되면 스크립트가 말하는 응용 프로그램을 처리해야합니다 두 개의 분리 된 버전을 사용하는 것이 좋습니다. 따라서 ATEOTD 관련 응용 프로그램과 함께 저장하거나 작업별로 특정 저장소에 여러 응용 프로그램을 포함시키는 경우 항상 배포 된 응용 프로그램과 일치하는 버전을 보유하고 있습니다. 관련없는 스크립트에 동시에 태그를 지정할 필요가 없습니다.
Tensibai

답변:


4

설명하는 코드 및 구성의 현재 구성은 관련된 기술 솔루션으로 구성됩니다. 이것은 유지 보수 활동에 많은 오버 헤드를 추가하고 우리의 방식으로 많은 트랩을 추가하는 나쁜 설계입니다. 대신, 그 조직은 우리가 배포 하는 인공물 을 중심으로 구성되어야합니다 .

그 이유는 인공물 ( 예 : 도커 이미지 또는 소프트웨어 패키지)을 다음 동사의 대상으로 간주하기 때문입니다.

  • 짓다
  • 테스트
  • 전개하다

우리가 수행하려는 최소한의 자동화 된 작업을 고려합니다. 테스트 동사의 구현 방식에 대한 내용을 변경하려는 경우 적절한 저장소에서 해당 아티팩트에 해당하는 폴더를 방문한 후 업데이트해야하는 젠킨스 별 자동화 항목을 쉽게 찾을 수 있습니다. 대신 자동화 레시피가 기술 솔루션을 중심으로 구성되는 경우, 젠킨스가 테스트 절차에 관여하고 있으며 인공물 관련 자동화 항목을 찾아야합니다. 복잡한 상황에서 기술 솔루션을 중심으로 한 조직은 업데이트를 매우 어렵게 만듭니다. 그에 따라 일부 서비스와 관련된 모든 기술 솔루션을 사전에 알고 있어야하기 때문입니다.

예를 들어 웹 사이트 코드와 마이크로 서비스 "a"를 포함하는 저장소에는 다음과 같은 하위 디렉토리가 운영 전용 일 수 있습니다.

./ops/website
./ops/micro-service-a

각각 build, test및 이라는 3 개의 스크립트가 deploy있습니다. 이제 자동화 항목의 구성이 명확 해 졌으므로 구성에 대한주의를 기울 이겠습니다.

구성 조직에 대한 기본 조건 및 요구 사항은 deploy서비스 유사 아티팩트에 적용될 때 동사에 의해 설정됩니다 . deploy동사는 다음과 같은 매개 변수가 있어야합니다

  • 배포 할 아티팩트 버전
  • 아티팩트의 배포 대상. 배포 된 아티팩트가 실행될 구체적인 환경 ( 예 : 클러스터 및 엔드 포인트와 통신해야하는 엔드 포인트)을 설명합니다.
  • 다른 엔드 포인트 ( 예 : 데이터베이스) 에 연결하는 데 사용해야하는 자격 증명
  • (캐시 항목의 수명 등) 런타임 구성

운영 관점에서이 매개 변수 분석은 런타임 구성과 번들로 제공 될 수있는 자격 증명을 제외하고는 배포 문제의 자연스러운 자유 도와 일치하지만 부주의하게 퍼지지 않도록 분리하는 것이 좋습니다.


5

도커를 사용하는 가장 좋은 방법 중 하나는 도커 파일과 작성 파일을 프로젝트의 동일한 저장소에 보관하는 것입니다. 따라서 프로젝트를 복제 할 때마다 도커 이미지를 만들 수 있습니다. 여러 버전의 docker compose 파일 (예 : prod, staging, dev)을 유지하면 이미지를 빌드하고 각 env에 대한 특정 옵션으로 컨테이너를 실행할 수 있습니다. 예를 들어 dev 컴퓨터의 경우 특정 네트워크를 사용하고 더 많은 종속성 컨테이너를 실행할 수 있습니다.


4

각 도구의 코드는 자체 저장소에 들어갑니다. 예를 들어

  1. Jenkins 저장소에 Jenkins Groovy 템플릿
  2. 역할, 작업, 인벤토리 하위 디렉토리가있는 자체 리포지토리의 YAML 플레이 북
  3. 자체 저장소에 Cloudformation / Terrform 템플릿
  4. 자체 Docker 파일 5.

이는 프로세스 오케스트레이션 및 각 환경에 대한 다양한 브랜치 유지 측면에서 확장 성을 향상시키는 데 도움이됩니다.

이를 통해보다 세밀한 제어를 제공하고 모든 버전 관리 오버 헤드를 버전 제어 시스템으로 오프로드 할 수 있습니다. 또한 각 환경에 대해 별도의 분기를 만들고 모든 응용 프로그램 릴리스에 대한 코드에 태그를 지정합니다 (응용 프로그램 코드 기반과 동일). 코드 측면에서 인프라를 생각하고 처리하십시오. (애플리케이션과 유사하게 프로세스의 모든 변경 사항을 체계화하여 QA, SIT, UAT로 보낸 후 PROD로 전송해야 함)

예를 들어 프로덕션에서는 V2.1 Ansible (마스터 브랜치)을 실행하지만 Prod (마스터 브랜치)에서 실행되는 도커 컨테이너의 V2.0을 가질 수 있습니다.

마찬가지로 DB 스크립트 / bash 스크립트를 자체 저장소에 보관하고 추적 및 자동화 목적으로 배포 된 각 URL의 모든 도구 / 부품 버전을 표시하도록 HealthCheck 파일 (JSON / YAML)을 구성 할 수 있습니다. (웹훅이 URL을 읽고 배포를 자동화하도록)


2
이 접근법의 함정은 v2.1이 qa에 있고 유효성이 검증되지 않았으며 긴급하게 프로덕션을 패치해야한다는 것입니다. v2.0을 수정할 수 없으며이 패치에 대해 v2.2를 만들면 위험이 높습니다. v2.1이 프로덕션 환경에
들어가서

3
브랜치를 사용하여 환경 / 배포 관련 정보를 추적하는 것은 나에게 개미 패턴처럼 보입니다. 20 개의 환경이있는 경우 20 개의 브랜치를 동기화해야한다는 의미입니다. 오류와 혼동의 원인이 될 수 있습니다. 환경 / 배포 관련 정보를 추적하기 위해 구성 파일을 사용하지 않는 이유와 이러한 분기에 대한 워크 플로우는 무엇인지 설명 할 수 있습니까? 이것들은 사소한 문제가 아닙니다!
Michael Le Barbier Grünewald

3

Ops, Dev 및 DevOps를 구분하면 격리가 촉진되고 "벽에 던져"사고 방식이 적용됩니다. 팀 간의 협력을 높이려면 프로젝트를 빌드하고 배포하는 데 필요한 모든 것을 저장소에 배치해야합니다.

그 질문에 대한 대답은 다음과 같습니다.

코드 저장소에서 DevOps 관련 코드 및 구성을 구성하는 방법은 무엇입니까?

프로젝트를 실행하기 위해 구성이 필요한 경우 동일한 디렉토리에 배치해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.