사용하는 이유는 무엇일까요?되살리지 요리사,인형극,Ansible SaltStack,또는 CloudFormation

업데이트 월 17 일,2016 년:우리는 이 블로그 게시리즈,확장,그것을 하라는 책으로 되살리:최대&실행!

업데이트,July8,2019 년:우리는데 이 블로그 포스팅 시리즈를 되살리 0.12 및 출시된 이 제 2 판의 되살리:최대&실행!

이것은 Terraform 시리즈에 대한 포괄적 인 가이드의 1 부입니다. 이 시리즈의 소개에서 우리는 모든 회사가 iac(infrastructure-as-code)를 사용해야하는 이유에 대해 논의했습니다. 이 게시물에서,우리는 우리가 선택의 우리의 IAC 도구로 Terraform 을 고른 이유를 논의하기 위하여려고하고있다.

경우 인터넷 검색을 위해”인프라로”코드,그것은 아주 쉽게 올의 목록과 함께 가장 인기 있는 도구:

  • Chef
  • 인형극
  • Ansible
  • SaltStack
  • CloudFormation
  • 되살

What’s 쉽지 않는 파악하고 이들 중 하나를 이용해야 합니다. 이러한 모든 도구를 사용하여 인프라를 코드로 관리할 수 있습니다. 그들 모두가 오픈 소스,에 의해 백업됩 큰 지역 사회의 참가자,그리고 많은 다른 클라우드 제공(과 함께 주목할 만한 예외의 CloudFormation,닫히는 원본 및 AWS-만). 그들 모두는 엔터프라이즈 지원을 제공합니다. 그들 모두는 잘 문서화,모두의 측면에서는 공식 문서 및 커뮤니티 리소스와 같은 블로그 게시물 유래 질문이 있습니다. 그래서 어떻게 결정합니까?

만드는 것이 힘들어도 대부분의 비교를 찾아 온라인 사 이러한 도구는 조금 더 많은 것 보다는 목록의 일반적인 속성이 각각의 도구와 같은 소리 만들 수 있다 동등하게 성공적으로 어떤니다. 그리고 그것이 기술적으로 사실이지만 도움이되지는 않습니다. 그것은 조금처럼 말하는 초보 프로그래밍할 수 있는 동등하게 성공적으로 웹 사이트를 구축 PHP,C,또는 어셈블리는 진술의 기술적으로 진실하다,하지만 하나는 생략의 거대한 양의 정보는 것은 매우 유용한에서 좋은 결정이다.

이 게시물에서는 다른 IAC 도구보다 Terraform 을 고른 이유에 대한 매우 구체적인 이유에 대해 살펴 보겠습니다. 으로 모든 기술 결정을,그것의 문제점과 우선순위,그리고는 동안 당신의 특별한 우선 순위를 다를 수 있습니다 우리보다,우리는 희망을 공유하는 것은 우리의 생각 과정에 도움이 될 것입니다 당신의 자신의 결정이다. 다음은 우리가 고려한 주요 절충안입니다:

  • 구성 관리 vs 프로비저닝
  • 인프라에 변경 가능 vs 변경할 수 없는 인프라
  • 절차 vs 선언
  • 마스터 vs 야기라던
  • 에이전트 대전
  • 큰 커뮤니티 vs 작은 커뮤니티
  • 성숙한 vs 최첨단
  • 사용하는 여러 도구를 함께

요리사,인형극,Ansible 및 SaltStack 는 모든 구성 관리 도구를 의미하는,그들은 설치하도록 설계되었고 관리하는 소프트웨어에서 기존 서버입니다. CloudFormation 및 되살리는 도구를 프로비저닝을 의미하는,그들은 설계를 구축 서버 자체(뿐만 아니라 나머지 부분의 인프라,같은 부하를 분산,데이터베이스,네트워킹 구성,etc.),떠나는 일을 구성하는 서버를 다른 도구입니다. 이러한 두 가지 범주되지 않은 상호 배타적으로,대부분의 구성 관리 도구를 할 수 있는 어느 정도의 프로비저닝 그리고 가장비스에 할 수 있는 어느 정도의 구성 관리. 하지만에 초점을 구성 관리 또는 프로비저닝을 의미하는 몇몇은의 도구가 될 것이 더 적합한 특정 형식의 작업을 수행합니다.특히 Docker 또는 Packer 를 사용하는 경우 구성 관리 요구의 대부분이 이미 처리되어 있음을 발견했습니다. 로커고 포장하는,당신은 이미지를 만들 수 있습니다(같은 용기 또는 가상 시스템 이미지)모든 소프트웨어 서버는 이미 설치되고 구성되었습니다. 일단 당신이 그런 이미지를 가지고 있다면,당신이 필요로하는 것은 그것을 실행하는 서버입니다. 는 경우 당신이해야 할 모든 조항의 무리는 서버,다음 프로비저닝 같은 도구를 되살리는 일반적으로가는 것 보다 더 잘 맞는 구성 관리 도구(의 예는 다음과 같은 방법을 사용 되살리 배포 도커에 AWS).

변경 가능한 인프라에 변경할 수 없는 대 Infrastructure

구성 관리 도구 등의 요리사,인형극,Ansible 및 SaltStack 일반적으로 기본으로 변경 가능한 인프라는 고정관념이라 할 수 있습니다. 예를 들어 Chef 에게 OpenSSL 의 새 버전을 설치하라고 말하면 기존 서버에서 소프트웨어 업데이트를 실행하고 변경 사항이 현장에서 발생합니다. 시간이 지남에 따라 점점 더 많은 업데이트를 적용함에 따라 각 서버는 고유 한 변경 내역을 구축합니다. 이 종종 현상 알려진으로 구성프,각 서버가 약간 다른 모든 다른 사람보다는 선도,미묘한 구성된 버그를 진단하고 거의 불가능을 재현한다.

를 사용하는 경우 프로비저닝 같은 도구를 되살리를 배포하는 기계를 만들어진 이미지로커 또는 포장업자,그 모든 변경””은 실제로 배포의 새로운 서버(처럼 모든 변경””변수형 프로그래밍에서 실제로 반환하는 새로운 변수). 예를 들어,배포하는 새로운 버전의 OpenSSL,당신은 새로운 이미지를 만들어 사용하는 포장업자 또는 독 노동자의 새로운 버전으로 이미 설치된 OpenSSL,배포하는 이미지 집합에 완전히 새로운 서버를 다음의 배포를 취소합니다 오래된 서버에 있습니다. 이 접근 방식의 가능성을 감소 구성프,버그를 보다 쉽게 알 수 있을 정확히 무슨 소프트웨어가 서버에서 실행되고 있는 이제껏 배포하는 모든 이전 버전의 소프트웨어에서 어떤 시간입니다. 물론 그것은 가능한 가을 강제로 구성 관리 도구하지 변경할 수 없는 너무 배포하지만,그것은 관용적 접근을 위해 이러한 도구는 반면,그것의 자연적인 방법을 사용하여 프로비저닝 도구입니다.

절차 vs 선언

요리사와 Ansible 장려하는 절차를 작성하는 코드,지정하고,단계별하는 방법을 달성하는 몇 가지 원하는 종료 상태입니다. 되살,CloudFormation,SaltStack,꼭두각시 모든 장려를 더 선언적 스타일은 당신의 코드 작성을 지정하는 여러분이 원하는 마지막 상태이며,IAC 도구 자체에 대한 책임을 파악하는 방법을 달성하는 상태입니다.

예를 들어,앱의 v1 을 실행하기 위해 10 개의 서버(AWS lingo 의”EC2 인스턴스”)를 배포하고 싶다고 가정 해 보겠습니다. 여기에 간단한 예제의 Ansible 템플릿는 이와 절차 상의 접근 방식:

- ec2:
count: 10
image: ami-v1
instance_type: t2.micro

고 여기에 간단의를 되살리는 템플릿가 동일한 것을 사용하여 선언적인 접근 방식:

resource "aws_instance" "example" {
count = 10
ami = "ami-v1"
instance_type = "t2.micro"
}

지,표면에 이러한 두 가지 방법과 유사할 수 있습니다,그 때 처음 실행으로 그들을 Ansible 나 되살, 그들은 생산 유사한 결과입니다. 흥미로운 점은 변화를 원할 때 일어나는 일입니다.예를 들어 트래픽이 올라가고 서버 수를 15 개로 늘리고 싶다고 상상해보십시오. 와 Ansible,절차 코드는 이전에 쓴 것은 더 이상 유용한 경우 업데이트 서버의 수를 15 재실행하는 코드,그것은 배포 15 새로운 서버를주고,당신은 총 25! 그래서 그 대신,당신이 알고 있어야의 이미 배치 및 쓰기 완전히 새로운 절차 스크립트를 추가로 5 는 새로운 서버:

- ec2:
count: 5
image: ami-v1
instance_type: t2.micro

으로 선언하는 코드,이후 당신이 모든 선언의 최종 상태 및 되살림을 얻는 방법을 끝나는 상태로 되살리는 것도 알고 있어야 모든 국가가 그것을 만들어집니다. 따라서,배포하 5 이상의 서버,당신이해야 할 모든 것은 돌 같은 되살 템플릿 및 업데이트 개수에서 10~15:

resource "aws_instance" "example" {
count = 15
ami = "ami-v1"
instance_type = "t2.micro"
}

실행할 경우 이 템플릿을 되살리 것을 깨닫고 그것은 이미 만들어 10 서버 및 따라서 모든 필요를 만들 5 는 새로운 서버입니다. 에 사실은,실행하기 전에 이 템플릿을 사용할 수 있습 되살의plan명령을 미리보기 어떤 변화를 만들 것입니다.

$ terraform plan+ aws_instance.example.11
ami: "ami-v1"
instance_type: "t2.micro"+ aws_instance.example.12
ami: "ami-v1"
instance_type: "t2.micro"+ aws_instance.example.13
ami: "ami-v1"
instance_type: "t2.micro"+ aws_instance.example.14
ami: "ami-v1"
instance_type: "t2.micro"+ aws_instance.example.15
ami: "ami-v1"
instance_type: "t2.micro"Plan: 5 to add, 0 to change, 0 to destroy.

이제 어떻게 배포하고자 할 때 v2 서비스? 과 절차적인 접근 방식 모두의 이전 Ansible 템플릿은 다시 유용하지 않은,그래서 당신이 쓰는 또 다른 템플릿을 추적하는 10 서버 배포 이전(또는 그것 15?)그리고 신중하게 각각을 새 버전으로 업데이트하십시오. 으로 선언적의 접근 방식을 되살리,당신이 정확히 동일한 템플릿을 다시 한번 간단히 변경 ami 버전 번호를 v2:

resource "aws_instance" "example" {
count = 15
ami = "ami-v2"
instance_type = "t2.micro"
}

물론,위의 예제는 단순화된다. Ansible 당신이 태그를 사용하여 검색에 대한 기존 EC2instances 배포하기 전에 새로운 것을(예를 들어를 사용하는instance_tagscount_tag매개 변수),하지만 수동으로 그의 이런 종류의 논리를 위해 매일 자신과 관리 Ansible,각각에 따라 자원의 과거 역사될 수 있는 놀라 울 정도로 복잡한(예: 태그뿐만 아니라 이미지 버전,가용 영역 등)으로 기존 인스턴스를 찾습니다. 이 하이라이트는 다음과 같은 두 가지 중요한 문제와 절차 IAC 구:

  1. 때와 처리 절차 상의 코드의 상태는 인프라가지 않을 완벽하게 캡처에는 코드입니다. 우리가 위에서 만든 세 가지 Ansible 템플릿을 통해 읽는 것은 배포 된 내용을 알기에 충분하지 않습니다. 당신은 또한 우리가 그 템플릿을 적용한 순서를 알아야합니다. 우리는 그들을 적용하는 다른 순서,우리가 끝까지와는 다른 인프라,그리고 무언가가 아니에서 볼 수 있는 기본 코드 자체입니다. 즉,Ansible 또는 Chef 코드베이스에 대해 추론하기 위해 지금까지 일어난 모든 변화의 전체 역사를 알아야합니다.
  2. 코드베이스의 현재 상태를 수동으로 고려해야하기 때문에 절차 코드의 재사용 가능성은 본질적으로 제한됩니다. 이는 국가는 끊임없이 변화하는 코드를 사용되는 일주일 전에 수 없습니다 더 이상 사용할 수 있기 때문에 그것을 설계되었을 수정하의 국가 인프라는 더 이상 존재하지 않습니다. 결과적으로 절차 적 코드 기반은 시간이 지남에 따라 크고 복잡 해지는 경향이 있습니다.

반면에 Terraform 에서 사용되는 선언적 접근 방식의 종류와 함께 코드는 항상 인프라의 최신 상태를 나타냅니다. 한눈에 히스토리 나 타이밍에 대해 걱정할 필요없이 현재 배포 된 내용과 구성 방법을 알 수 있습니다. 또한 세계의 현재 상태를 수동으로 설명 할 필요가 없으므로 재사용 가능한 코드를 쉽게 만들 수 있습니다. 대신에,당신은 단지에 초점을 설명하는 원하는 상태로 되살 수치를 한 상태에서 다른 자동으로 합니다. 결과적으로 테라 폼 코드베이스는 작고 이해하기 쉬운 경향이 있습니다.

물론 선언적 언어에도 단점이 있습니다. 전체 프로그래밍 언어에 대한 액세스 권한이 없으면 표현력이 제한됩니다. 예를 들어,어떤 형태의 인프라에 변경 등으로 회전,가동 중지 시간이 없는 배포드 익스프레스에서 순수하게 선언하는 용어입니다. 마찬가지로,없이 할 수있는 능력을”로직”(예를 들어-문,루프)만들고,일반 재사용할 수 있는 코드는 까다로운 일이 될 수 있(특히 CloudFormation). 다행히도,되살의 번호를 제공하는 강력한 기본 형식과 같은 변수를 입력,출력은 변수,모듈,create_before_destroy,andcount&트:루프는 경우,-문과 함정이 있습니다.

마스터 대야기라던

기본적으로 요리사,인형,SaltStack 모두 필요로 실행되는 마스터 서버에 대한 저장 상태의 인프라 및 배포 업데이트됩니다. 모든 시간에 업데이트할 무언가에서의 인프라,클라이언트를 사용할(예를 들어,명령행 도구)의 문제는 새로운 명령을 마스터는 서버,그리고 마스터 서버 중 하나를 밀어 업데이트를 다른 모든 서버에,또는 그 서버에 끌어 최신 업데이트 내 마스터 서버에서 정기적으로.마스터 서버는 몇 가지 장점을 제공합니다. 첫째,인프라의 상태를보고 관리 할 수있는 단일 중앙 장소입니다. 많은 구성 관리 도구는 마스터 서버에 웹 인터페이스(예:Chef 콘솔,Puppet Enterprise Console)를 제공하여 진행 상황을 쉽게 볼 수 있도록합니다. 둘째,일부 마스터 서버는 백그라운드에서 지속적으로 실행하고 구성을 적용 할 수 있습니다. 는 방법으로는 경우에,누군가가 수동 변경하는 서버에서,마스터는 서버가 되돌릴 수 있는 변경을 방지하는 구성이다.

그러나 마스터 서버를 실행해야하는 데는 몇 가지 심각한 단점이 있습니다:

  • 추가 인프라 배포해야는 추가 서버 또는 클러스터의 서버(대해 높은 가용성과 확장성)를 실행하는 마스터입니다.
  • 유지 관리:마스터 서버를 유지,업그레이드,백업,모니터링 및 확장해야 합니다.
  • 보안:수 있는 방법을 제공한 클라이언트와 통신하는 마스터 서버(s)와 방법을 마스터 서버(s)과 통신하는 모든 다른 서버가 일반적으로 열 추가 포트 구성하는 여분의 인증 시스템의 모든 증가시키는 당신의 표면적을 합니다.

요리사,인형,SaltStack 할 수 있는 다양한 수준의 지원을 위해야기라던 모드를 실행하는 그들의 에이전트에 소프트웨어의 각각의 서버의 일반적으로 정기적인 일정으로(예를 들어,cron 작업이 실행되는 모든 5 분),그리고 사용하는 것을 아래로 당겨에서 최신 업데이트 버전 제어(보다 마스터 서버로부터). 이 수를 크게 감소의 이동 부속,그러나,다음 절에서 설명하는,이것은 여전히 남수의 답
질문이 특히,하는 방법에 대한 규정은 서버와 에이전트를 설치에 소프트웨어에서 그들의 첫 번째 장소입니다.

Ansible,CloudFormation,Heat 및 Terraform 은 기본적으로 모두 마스터리스 입니다. 거나,좀더 정확히 말하면,그들 중 일부에 의존할 수 있습 마스터 서버,하지만 그것은 이미 부분의 인프라를 사용하고 있지 않은 추가 작품을 관리할 수 있습니다. 예를 들어,되살과 통신하는 클라우드 공급자를 사용하여 클라우드 제공자의 Api,그래서 어떤 의미에서,API 서버는 마스터 서버를 제외하고,그들이 필요로 하지 않는 모든 여분의 인프라 또는 추가 메커니즘 인증(즉,단지 사용의 API 를 키로). Ansible 은 SSH 를 통해 각 서버에 직접 연결하여 작동하므로 추가 인프라를 실행하거나 추가 인증 메커니즘을 관리 할 필요가 없습니다(예:SSH 키 사용).

에이전트 대 에이전트없는

Chef,Puppet 및 SaltStack 은 모두 구성하려는 각 서버에 에이전트 소프트웨어(예:Chef 클라이언트,Puppet 에이전트,Salt Minion)를 설치해야합니다. 에이전트는 일반적으로 각 서버에서 백그라운드에서 실행되며
최신 구성 관리 업데이트 설치를 담당합니다.이것은 몇 가지 단점이 있습니다.

  • 부트 스트랩: 당신은 어떻게 당신의 서버를 프로비저닝하고 처음에 그들에 에이전트 소프트웨어를 설치합니까? 일부를 구성 관리 도구 킥할 수 있는 길고 가정하면,일부 외부 프로세스는 이들을 위해(예를 들어,당신은 처음 사용 되살리를 배포하는 무리의 서버 VM 이미지는 에이전트가 이미 설치);기타 구성 관리 도구가 있는 특별한 부트스트랩 프로세스를 실행하는 one-off 명령을 제공한 서버 클라우드를 사용하여 공급자의 Api 를 설치하고 에이전트에 소프트웨어를 이러한 서버 SSH.
  • 유지 보수: 당신은 신중하게 하나가있는 경우 마스터 서버와 동기화 유지주의,주기적으로 에이전트 소프트웨어를 업데이트해야합니다. 또한 에이전트 소프트웨어를 모니터링하고 충돌하는 경우 다시 시작해야합니다.
  • 보안 경우 에이전트 소프트웨어는 아래로 끌어 구성에서 마스터 서버(또는 어떤 다른 서버를 사용하지 않는 경우 마스터),다음을 열어야 합 아웃바운드 포트에서 모든 서버입니다. 마스터 서버가 에이전트에 구성을 푸시하는 경우 모든 서버에서 인바운드 포트를 열어야합니다. 두 경우 모두,말하는 서버에 에이전트를 인증하는 방법을 알아 내야합니다. 이 모든 것이 공격자에게 표면적을 증가시킵니다.

,다시 한 번 요리사,인형,SaltStack 할 수 있는 다양한 수준의 지원을 위한 에이전트 없이 모드(예를 들어,소금 ssh),하지만 이러한 느끼게 되는 경우가 많았 식로 군더더기 없이 항상 지원 기능을 구성 관리 도구이다. 그 이유는 야생에서 기본값 또는 관용적 구성을 위한 요리사,인형,SaltStack 거의 항상 포함하는 일반적으로 너무 마스터.

이러한 추가 이동 부품은 모두 인프라에 많은 수의 새로운 장애 모드를 도입합니다. 매번 당신은 버그를 보고서에서 오전 3 시,당신은 그 밖의 경우 버그에서의 응용 프로그램 코드,또는 당신의 IAC 코드,또는 구성 관리 클라이언트,또는 마스터 서버(s),방법 또는 클라이언트에게 회담 마스터 서버(s),또는 다른 방법으로 서버가 이야기하는 마스터 서버(s),또는…

Ansible,CloudFormation,열, 고 되살리지 않을 설치할 필요가 여분의 에이전트. 또는 더 정확하게하기 위해 그 중 일부는 에이전트가 필요하지만 일반적으로 사용중인 인프라의 일부로 이미 설치되어 있습니다. 예를 들어,AWS,Azure,Google 클라우드,그리고 다른 모든 클라우드 공급자를 돌봐의 설치,관리,인증 agent 소프트웨어에 각각의 그들의 실제 서버에 있습니다. 으로 사용자의 되살리는,당신은 걱정하지 않아도 모든다:당신이 그 명령을 실행하고 클라우드 제공업체의 에이전트를 실행
그들은 당신을 위해서 모든 서버에 있습니다. Ansible 을 사용하면 서버는
SSH 데몬을 실행해야합니다.이 데몬은 어쨌든 대부분의 서버에서 실행되는 것이 일반적입니다.

대형 커뮤니티 대 소규모 커뮤니티

기술을 선택할 때마다 커뮤니티도 선택하고 있습니다. 많은 경우 프로젝트 주변의 생태계는 기술 자체의 고유 한 품질보다 경험에 더 큰 영향을 미칠 수 있습니다. 커뮤니티을 결정하는 방법을 많은 사람들이 프로젝트에 기여하는 방법은,플러그인
통합,확장,사용할 수 있는 것이 얼마나 쉬운 도움을 찾기 위해 온라인(예를 들어,블로그 게시물에 대한 질문에 유래),그리고 얼마나 쉽게 그것은 사람을 고용하는 데 도움 당신은(예를 들어,직원,컨설턴트,이나 지원을 회사).

커뮤니티 간의 정확한 비교를 수행하기는 어렵지만 온라인으로 검색하여 몇 가지 추세를 발견 할 수 있습니다. 아래 표는 비교의 인기있는 IAC 도구를 함께 데이터 수집 중 수 있습 2019,지 여부를 포함하여 IAC 도구는 오픈 소스 또는 폐쇄원,클라우드 공급자를 지원 총수의 참가자와 별에 GitHub,얼마나 많은 커밋 및 활성 문제가 있었 한 달 기간 중순에 월 중순할 수 있는 방법을 많이 오픈 소스 라이브러리를 사용할 수 있는 도구의 수가 질문을 나열하는 도구에서 유래, 와 작업의 수를 언급하 도구 Indeed.com.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다