Ansible은 Vagrant에서 프로비저닝 bash 쉘을 실행하는 것과 어떻게 다릅니 까?


37

셸 스크립팅을 사용하여 문제를 해결 한 경험이있는 IT sysadmin 팀은 Ansible을 대신 사용하려고합니다.

쉘 스크립트 작성을 계속하기 위해 Ansible을 사용하기 시작해야하는 실질적인 차이점과 이유가 있습니까?

답변:


28

나는 Ansible을 사용한 적이 없지만 몇 주 동안 쉘 스크립과 비교할 때 Ansible이 좋은지 알아 내려고 노력합니다. 적어도 제 경우에는 그들이 운영하는 유령 광고 캠페인이 효과적이라는 것을 증명합니다! 가장 명백한 질문 중 하나에 대한 답변이 문서에 실패한 것으로 입증 된 많은 시도가 실패한 후, 나는 마침내 그것을 얻었다 고 생각합니다.

이제 소개 비디오를보고 Ansible ans에 대한 소개 자료를 통해 잠재적 인 새로운 사용자로 무작위로 이동합시다. 숙련 된 쉘 프로그래머가 즉시 선반에서 생산할 수있는 것과 비교해 봅시다.

필자의 결론은 쉘 스크립팅을 통해 본질적으로 1. 시스템이 원하는 상태와 일치하는지 확인할 가능성, 2. 모니터링 능력을 포함하는 유료 시스템 인 Ansible Tower와의 통합 기능을 제공한다는 것입니다. 변경 불가능한 서버 패턴을 구현할 때와 같이 일부 중요한 경우 포인트 1은 그다지 유용하지 않으므로 목록이 약간 얇습니다.

필자의 결론은 셸 스크립팅에 비해 Ansible이 제공하는 이점은 문서가 제시하는 것처럼 사용 가능한 모듈로 잘 다루어 져 있지만 일반적인 경우에는 작거나 가설 적 인 소수의 낙관적 인 경우에 합리적 일 수 있다는 것입니다. 숙련 된 셸 프로그래머에게는 아마도 이러한 이점이 다른 측면에 의해 균형을 이루게 될 가능성이 높습니다.

그러나 이것은 소개 자료가 얼마나 나쁜지를 증명할 수 있습니다!

빠른 시작 비디오 :

빠른 시작 비디오 . 글쎄, 이것들은 실제로 주장이 아니며, 글 머리표 목록이며, 프리젠 테이션에서 비판적 판단을 중단하는 데 일반적으로 사용되는 인공물입니다 (논리가 표시되지 않기 때문에 비판 할 수 없습니다!)

1. Ansible은 간단하다 :

1.1 사람이 읽을 수있는 자동화 – 사양은 기술 문서입니다.

  name: upgrade all packages
  yum:
    name: '*'
    state: latest

쉘 스크립트에서 찾은 해당 yum 호출 보다 읽기 쉽습니다 . 또한 AppleScript에 연락 한 사람은 "사람이 읽을 수있는 자동화"를 읽을 때 웃으면 서 죽습니다.

1.2 특별한 코딩 기술이 필요하지 않음 – 공식 사양을 작성하지 않으면 코딩이란 무엇입니까? 조건부, 변수가 있으므로 어떻게 코딩하지 않습니까? 그리고 왜 내가 프로그래밍 할 수없는 것을 필요로합니까? 성명은 행복하지 않습니다!

1.3 순서대로 실행 된 작업 – 아마도 일부 골프 골 애호가 들은 무질서한 작업을 수행하는 언어를 알고 있지만 작업을 순서대로 실행하는 것은 예외적으로 보이지 않습니다.

1.4 생산성 향상 – 숙련 된 셸 프로그래머는 현재 생산성이 높습니다. 이 반론은 초기 논증만큼이나 심각합니다.

2. Ansible은 강력하다

인공물을 판매하는 인기있는 영업 사원의 트릭은 사람들이 이러한 인공물의 "힘"을 획득 할 것이라고 믿도록 속이는 것입니다. 자동차 또는 등장 성 음료 광고의 역사는 설득력있는 예제 목록을 제공해야합니다.

여기서 Ansible은 "앱 배포"를 수행 할 수 있지만 쉘 스크립트는 반드시 "구성 관리"를 수행하지만 이는 기능이 아니라 툴의 목적에 대한 단순한 설명 일 뿐이며 약간의 소박하지만 예가없는 "워크 플로 오케스트레이션"입니다. 것 이상의 GNU 평행 할 수 있습니다.

3. Ansible은 에이전트없는

컬럼을 채우기 위해 이들은 모두 ssh 만 필요로하는 세 가지 다른 방식으로 작성했습니다 . 이는 누구나 알고있는 데몬 이며 세계 구성 관리에 널리 퍼져있는 에이전트 와는 아무런 관련이 없습니다 !

비디오의 나머지

나머지 비디오에서는 서버와 같은 정적 리소스 목록 인 인벤토리를 소개하고 3 대의 서버에 Apache를 동시에 배포하는 방법을 보여줍니다. 리소스가 매우 동적이며 클라우드 공급자가 제공하는 명령 줄 도구로 열거하고 파이프 |연산자를 사용하여 셸 함수에서 사용할 수있는 작업 방식과 실제로 일치하지 않습니다 . 또한 세 대의 서버에 Apache를 동시에 배포하지 않고 마스터 인스턴스 이미지를 빌드 한 다음 정확한 복제 본인 3 개의 인스턴스를 시작하는 데 사용합니다. 따라서 논증의“조정”부분은 그다지 적절하지 않은 것으로 보입니다.

임의의 문서 1 단계 : EC2와 통합

EC2는 Amazon의 컴퓨팅 서비스로, 일부 Ansible 모듈에서 이를 지원 합니다 . (기타 인기있는 클라우드 컴퓨팅 제공 업체도 제공됨) :

# demo_setup.yml

- hosts: localhost
  connection: local
  gather_facts: False

  tasks:

    - name: Provision a set of instances
      ec2:
         key_name: my_key
         group: test
         instance_type: t2.micro
         image: "{{ ami_id }}"
         wait: true
         exact_count: 5
         count_tag:
            Name: Demo
         instance_tags:
            Name: Demo
      register: ec2

해당 쉘 스크립트는 본질적으로 JSON으로 대체 된 YAML과 동일합니다.

provision_a_set_of_instances()
{
  aws --output=text ec2 run-instances --image-id …   
}

또는 JSON 버전

provision_a_set_of_instances()
{
  aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"  
}

provision_a_set_of_instances__json()
{
  cat <<EOF
{
    "ImageId": … 
}
EOF
}

두 버전 모두 본질적으로 동일하며, 페이로드의 대부분은 YAML 또는 JSON 구조의 초기화 값 열거입니다.

무작위 문서 2 단계 : 지속적인 전달 및 롤링 업그레이드

이 안내서 의 가장 큰 부분에는 실제로 흥미로운 기능이 표시되지 않습니다. 변수를 소개합니다 (IIRC, 셸 스크립트에도 변수가 있습니다)! XY에 대한 특권으로”

# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF

"어떻게에서 XY에 권한이있는 MySQL 사용자를 만들려면 어떻게해야합니까 후 당신은 검색 ansible "와와 끝까지

- name: Create Application DB User
  mysql_user: name={{ dbuser }} password={{ upassword }}
              priv=*.*:ALL host='%' state=present

그 차이는 여전히별로 의미가 없습니다. 이 페이지에서 Ansible에 템플릿 메타 프로그래밍 언어가 있음을 발견했습니다.

{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}

이것을 볼 때, 나는 정말로 나의 안락 지대에있게됩니다. 선언적 언어를위한 이런 종류의 간단한 메타 프로그래밍은 BSD Makefile과 이론적으로 동일한 패러다임입니다! 내가 어떤 광범위하게 프로그래밍 한 일이 (내가 YAML 파서를 통해 내 플레이 북을 실행할 수 있도록이 발췌 쇼 우리 YAML 파일 작업의 약속이 깨진 것을 예를 들면 ). 또한 Ansible은 평가 순서의 미묘한 기술에 대해 논의해야한다는 것을 보여줍니다. 변수의 언어가 선언적 부분인지 또는 언어의“제 국적”메타 부분에서 변수가 확장되는지 결정해야합니다. 여기서 쉘 프로그래밍은 더 간단하고 명시 적 eval 또는 외부 스크립트 소싱 외에 메타 프로그래밍이 없습니다 . 가상의 동등한 셸 발췌는 다음과 같습니다.

enumerate_group 'monitoring' | {
  while read host; do
    …
  done
}

Ansible 변형에 비해 복잡성이 용납 될 수 있습니다. 언어의 평범하고 규칙적인 지루한 구성 만 사용합니다.

무작위 문서화 3 단계 : 테스트 전략

마지막으로, 실제로 Ansible 의 첫 번째 흥미로운 기능인 것으로 밝혀졌습니다 .“Ansible 리소스는 원하는 상태의 모델입니다. 따라서 서비스가 시작되었는지, 패키지가 설치되었는지 또는 기타 다른 것들을 테스트 할 필요는 없습니다. 이러한 것들이 선언적으로 사실인지 확인하는 시스템이 있습니다. 대신, 당신의 플레이 북에 이런 것들을 주장하십시오.”이제 조금 흥미로워지기 시작하지만,

  1. 사용 가능한 모듈로 쉽게 구현할 수있는 몇 가지 표준 상황 외에도 테스트를 직접 구현하는 비트를 공급해야합니다. 여기에는 아마도 일부 쉘 명령이 포함됩니다.

  2. 변경할 수없는 서버 패턴이 구현되는 상황에서 설치 적합성 검사는 그다지 중요하지 않을 수 있습니다. 실행중인 모든 시스템은 일반적으로 마스터 이미지 (예 : 인스턴스 이미지 또는 도커 이미지)에서 생성되고 업데이트되지 않습니다. 대신 새로운.

해결되지 않은 관심사 : 유지 보수성

Ansible 의 소개 자료 는 유지 보수성 문제를 무시합니다. 본질적으로 유형 시스템이 없으므로 쉘 스크립팅은 JavaScript, Lisp 또는 Python의 유지 관리 용이성을 제공합니다. 광범위한 자동 리팩터링은 광범위한 자동화 된 테스트 슈트 또는 최소한의 대화식 테스트를 허용하는 디자인을 통해서만 성공적으로 달성 할 수 있습니다. 즉, 쉘 스크립팅은 시스템 구성 및 유지 관리 의 링구아 프랑카 이지만 거의 각 프로그래밍 언어에는 쉘에 대한 인터페이스가 있습니다. 따라서 다양한 언어의 쉘 구성 비트를 서로 연결하기 위해 고급 언어를 사용하여 고급 언어의 유지 관리 이점을 활용할 수 있습니다. OCaml을 위해 Rashell을 썼습니다 기본적으로 하위 프로세스에 공통적 인 상호 작용 패턴을 제공하므로 구성 스크립트를 OCaml로 변환하는 것이 간단합니다.

Ansible의 측면에서 볼 때, 매우 약한 플레이 북 구조와 메타 프로그래밍 기능의 존재는 Ansible에 대한 단위 테스트를 작성하는 방법이 명확하지 않다는 점을 제외하고는 쉘 스크립팅의 경우와 같이 상황을 본질적으로 나쁘게 만듭니다. 고급 언어를 임시로 도입한다는 주장은 모방 할 수 없습니다.

구성 단계의 dem 등성

Ansible의 문서는 dem 등원 구성 단계를 작성해야 할 필요성에 주목합니다. 보다 정확하게는, 구성 단계는 단계 시퀀스 abaab 로 단순화 될 수 있도록 작성되어야한다 . 즉, 구성 단계를 반복 할 필요가 없다. 이것은 dem 등식보다 더 강한 조건입니다. Ansible은 플레이 북이 임의의 셸 명령을 사용할 수 있도록 허용하므로 Ansible 자체는이 강력한 조건을 준수한다고 보장 할 수 없습니다. 이것은 프로그래머의 훈련에만 의존합니다.


이것은 매뉴얼처럼 보입니다 ... 인상적입니다!
Pierre.Vriens

4
더 동의 할 수 없었습니다. 우리는 1 년 넘게 Ansible을 사용해 왔으며 이제는 좋은 평범한 bash 스크립트로 빌드 된 Docker 컨테이너를 사용하고 있습니다. 상태를 정의하는 것도 내 의견으로는 가장 흥미로운 기능이지만, 이미 언급했듯이 해당 Ansible 모듈이없는 많은 서비스가 있으므로 항상 bash 명령으로 대체해야합니다. 또한 변경 불가능한 컨테이너 만 서버에 배포하므로이 경우 상태를 정의하는 것이 실제로 유리한 것은 아닙니다.
Andreas

1
철저한 사용 후 나는 선험적으로 한 모든 요점을 확인할 수 있습니다. Idempotency는 가능 하지만 ansible에 의해 시행되지 는 않습니다 (나쁜 시민의 경우 vmware_guest 모듈 참조). (플레이 북 형식은 치료 없이는 유닉스 파일 모드를 먹을 수 없습니다) 그리고 유일하게 유용한 것은 유용한 기능을로드 할 수 있도록 작성된 것입니다. 따라서 Red Hat이 해당 제품을 추진하지 않았다면 폭 넓은 채택을 이해할 수 없습니다.
Michael Le Barbier Grünewald

1
@Andreas 나는 당신이 여전히 당신의 놀라운 놀이가 pot 등 할 수 없다는 것을 의미하지 않는 쉘이나 명령 모듈로 넘어 가야하는 많은 경우에 동의합니다. 코어 모듈 자체는 조치를 수행해야하는지 확인하여 by 등성을 유지합니다. 먼저 수행해야 할 작업을 확인하고 출력을 등록한 다음 첫 번째 작업의 출력을 기반으로 두 번째 작업에 대한 조건부 작업을 수행하여 셸 또는 명령 모듈과 동일한 작업을 수행 할 수 있습니다.
레위

1
@ MichaelLeBarbierGrünewald, Ansible과 함께 일할 때 실행에 어려움을 겪었고 이전 클라우드 기반 회사의 인프라에 연결하기 위해 플레이 북을 함께 가져 오는 데 몇 주가 걸리며 Linux를 프로비저닝하는 데 동의했습니다. 배포판, LAMP / LEMP 등을 설치하십시오. 완료되면 시간을 절약 할 수 있었지만 설치 및 실행에 한 달이 걸렸습니다. 우리 중 아무도 마스터 배쉬 스크립터가 아니기 때문에 대안이 아닙니다.
다니엘

22

이렇게하면 Ansible에 몇 가지 고유 한 장점이 있더라도 친숙한 도구 (이 경우 셸 스크립팅)를 사용하면 얻을 수있는 이점이 더 중요합니다. 나는 그것에 대한 명확한 답이 있다고 생각하지 않습니다.

팀이 Ansible이 쉘로 제공하는 것을 달성 할 수있는 경우 :

  1. 선언적이고 dem 등적인 구성 관리
  2. 업계에서 널리 사용되는 서비스를 위해 재사용 가능한 스 니펫 (예 : 플레이 북)에 액세스합니다.
  3. 재시도, 롤링 로직 등을 통한 안정적인 원격 실행 관리

그들은 아마 그들이 알고있는 것을 고수 할 수있었습니다.

결국, BASH에서 "guards"를 구현할 수 있습니다. 다양한 서버 구성 작업을 해결하기 위해 기존의 많은 BASH 작업을 찾을 수 있습니다 (기본적으로 모든 Dockerfile에는 90 % bash 설치 코드가 있습니다). 기존의 전체 솔루션을 실제로 해당 도구에 이식하지 않고도 Ansible / Salt / Chef-Zero가 제공하는 것에 매우 근접 할 수 있습니다.

NIH (여기서는 발명되지 않은) 경향과 균형 잡힌 행동이며, 잘 확립 된 스크립트를 폐기하여보다 강력한 솔루션을 선호합니다.

염두에 두어야 할 마지막 고려 사항 : 더 많은 사람들을 팀에 채용하려고 할 때 기술 스택이 어떻게 측정되는지 Ansible 경험이있는 사람을 찾는 것이 특정 집에서 만든 스크립팅 CM 도구에 경험이있는 사람을 찾는 것보다 훨씬 쉽습니다. 이것은 엄밀히 기술적 인 고려 사항이 아니라 문화적 고려 사항입니다. 자체 Ansible을 발명하는 이상한 조직이되고 싶습니까, 아니면 직업에 적합한 도구를 찾는 합리적인 조직이 되시겠습니까? 이러한 결정은 재능을 끌어내는 능력에 영향을줍니다.


4
당신의 대답을 좋아했습니다. 또한 배쉬 팀이 dem 등성, 실행 관리 및 재사용을 위해 기본적으로 자체 구성 관리 프레임 워크를 작성하는 경우 비용이 수반되며 사내 프로젝트에 실제로 불쾌 할 수 있음을 알고 있습니다 .
ᴳᵁᴵᴰᴼ

또한 귀하의 답변, 특히 이용 가능한 경험을 저울에 넣은 귀하의 답변에 가입합니다. 두 가지 작은 비평가가 있습니다. 첫 번째는 dem 등성입니다. 이것은 물론 구성 시스템의 중요한 측면이지만, 가능한 플레이 북에서 가능한 모든 쉘 명령을 사용할 수 있기 때문에 시스템은 i 등식 을 사용하는 것이 가장 좋습니다 . (실제로 idempotency aba = ab 보다 강력한 기능을 원합니다 .) 둘째, 인스턴스 이미지를 사용하여 변경 불가능한 서버 패턴을 구현할 때와 같이 중요한 경우 원격 실행의 안정적인 관리는 전혀 관련이 없을 수 있습니다.
Michael Le Barbier Grünewald

13

위의 답변은 그 일부를 다루고 있지만 중요한 요소 중 하나 인 수렴형 디자인이 누락되었습니다. 나는 https://coderanger.net/thinking/ 에서 Chef의 맥락에서 이것에 대해 얼마 전에 약간의 단어를 썼다. 그러나 짧은 버전은 bash 스크립트는 일련의 지침이며 Ansible 플레이 북 (또는 Chef recipe, Salt) 상태 등)은 원하는 상태에 대한 설명입니다. 원하는 단계보다 원하는 상태를 문서화하면 훨씬 더 많은 시작 상태에 대처할 수 있습니다. 이것은 오래 전에 CFEngine에 요약 된 바와 같이 Promise Theory의 핵심이며, 우리 (구성 관리 도구)는 그 이후로 복사 한 디자인입니다.

tl; dr Ansible 코드는 당신이 원하는 것을 말하고, bash 코드는 일을하는 방법을 말합니다.


2
또한 책이나 기사와 같은 "약속 이론"과 누군가 배우고 자하는 다른 중요한 자료에 대한 언급을 추가 할 수 있습니까?
Evgeny

1
그것은 내가 당신이 dem 등성 bash 코드를 작성할 수 있다고 말했을 때 실제로 언급 한 것입니다 (즉, 어떤 시점에서 시작하고 여러 번 실행되며 원하는 상태로 수렴 할 수 있음). 그러나 당신의 대답은 훨씬 명확 해졌습니다.
Assaf Lavie

그렇습니다. Idempotence는 수렴 시스템의 중요한 속성이지만 둘은 항상 직접 연결되어 있지는 않습니다. 노트북.
coderanger


3

원격 호스트에서도 사용 가능한 플레이 북을 실행하는 데 문제가 적다는 점에 주목해야합니다. 그것이 ansible를 달리는 주된 이유이기 때문에. 쉘 스크립팅을 사용하는 경우에도 scp를 원격 호스트에 스크립팅하는 방법이 필요합니다.


이 의미에서 Ansible은 ssh를 감싸는 것입니까?
Evgeny

본질적으로 그렇습니다. 그것은 ssh를하고, 파이썬 스크립트를 원격으로 복사하고 실행합니다. 즉, btw, 사용 가능한 모듈이 일부 파이썬 라이브러리에 의존하는 경우이 라이브러리는 일부 상황에서 원격 시스템에 있어야합니다.
Assaf Lavie

1
그리고 ssh 설정을 망쳐 놓으면 일반적인 푸시 대 풀의 단점이 컴퓨터에서 잠겨 있습니다.
Tensibai

0

2019 년에 저는 며칠 동안 끔찍한 학습 곡선을 보냈으며 여기에 절대적인 진실이 있습니다. Ansible은 문제가되지 않습니다.

완료되지 않았으며 Windows에서 실행되지 않으며 YAML 구성과 오해의 소지가있는 오류 메시지의 조합으로 인해 눈이 번질 수 있습니다. 그것은 거의 고의적으로 끔찍한 것 같습니다. 그것은 분명히 redhat sysadmins가 개발자 측 프로젝트를 좌절 시켰습니다. 아마도 힙 스터 일 것입니다.

프로비저닝 이외의 기능이 필요하지 않으며 특정 OS에서만 프로비저닝하는 경우 동정을 위해 괜찮은 shell.script를 작성하십시오.

현재 전체 프로젝트는 초기 리눅스 포럼에서 멍청한 놈들이 RTFM에게 알려 주었고 누군가 그래픽 설정을 구성하기 위해 GUI를 작성할 수없는 이유에 대해 질문을 받았다. 당신은 그것을하지 않습니다? 당신은 창문에 집착해야 할 것입니다. 아마도 내가 짝짓기를 할 것입니다. 행복한 VI-ing.

Docker를 사용하십시오. 무엇보다 선호합니다. Docker는 엄청나게 간단하고 강력합니다.

그러나 기존 주석에 대해 반드시 프로비저닝해야하는 경우 실제 대안은 무엇입니까?

글쎄 ... 아직은 없습니다. 그러나 나는 당신에게 이것을 약속 할 것입니다. 팬보이가 아무리 열심히 밀어 붙여도 실패한다는 사실을 용서하기 때문에 노력하는 데는 10 점 만점에 5 점입니다.

SCP를 bash 스크립트로 만들고 문제를 해결하십시오.


먼저 Win_RM 또는 SSH를 통해 Windows에서 작동합니다. 두 번째로, yaml 구문은 매우 훌륭하고 프로그래밍 방식으로 생성 될 수 있으며 일부 오류는 예외 중에 Java 또는 Python과는 다른 방식으로 오해를 불러 일으킬 수 있습니다. 셋째, 서버에 스크립트를 SCP로 보내는 개념은 매우 역동적 인 클라우드 환경에는 적용 할 수 없습니다. 어느 서버? 서버는 매일 바뀔 수 있습니다. Ansible은 서버를 그룹화하고 변수를 할당하는 쉬운 방법으로 쉽게 구성 가능한 인벤토리 플러그인을 허용합니다. 나는 Ansible이 그만한 가치가 없다고 생각하지 않습니다. 나는 당신의 환경에 너무 과잉 생각합니다.
레위

@Levi 네. ansible이 Windows에서 실행되지 않고 스키마가없는 구성이 있으며 동일한 작업을 수행하는 모든 맞춤형 방법보다 학습 곡선이 길고 유지 관리 비용이 높은 것이 내 잘못입니다.
Richard

클라우드 환경의 경우 학습 곡선을 정당화 할 수있는 대규모 엔터프라이즈 유형에 대한 다른 접근 방식이 있습니다. 나는 무엇을 할 수 있는지 이해합니다. 나는 단지 틈새 시장을 보지 못합니다.
리처드

틈새 시장은 여러 기계에 사용하기 쉬운 자동화 프레임 워크입니다. 리눅스만큼이나 Windows에는 좋지 않습니다. msdos 및 네트웨어에도 적합하지 않습니다. 2019 년 Windows 서버는 요즘 작은 쓸모없는 틈새 시장입니다.
dyasny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.