답변:
나는 Ansible을 사용한 적이 없지만 몇 주 동안 쉘 스크립과 비교할 때 Ansible이 좋은지 알아 내려고 노력합니다. 적어도 제 경우에는 그들이 운영하는 유령 광고 캠페인이 효과적이라는 것을 증명합니다! 가장 명백한 질문 중 하나에 대한 답변이 문서에 실패한 것으로 입증 된 많은 시도가 실패한 후, 나는 마침내 그것을 얻었다 고 생각합니다.
이제 소개 비디오를보고 Ansible ans에 대한 소개 자료를 통해 잠재적 인 새로운 사용자로 무작위로 이동합시다. 숙련 된 쉘 프로그래머가 즉시 선반에서 생산할 수있는 것과 비교해 봅시다.
필자의 결론은 쉘 스크립팅을 통해 본질적으로 1. 시스템이 원하는 상태와 일치하는지 확인할 가능성, 2. 모니터링 능력을 포함하는 유료 시스템 인 Ansible Tower와의 통합 기능을 제공한다는 것입니다. 변경 불가능한 서버 패턴을 구현할 때와 같이 일부 중요한 경우 포인트 1은 그다지 유용하지 않으므로 목록이 약간 얇습니다.
필자의 결론은 셸 스크립팅에 비해 Ansible이 제공하는 이점은 문서가 제시하는 것처럼 사용 가능한 모듈로 잘 다루어 져 있지만 일반적인 경우에는 작거나 가설 적 인 소수의 낙관적 인 경우에 합리적 일 수 있다는 것입니다. 숙련 된 셸 프로그래머에게는 아마도 이러한 이점이 다른 측면에 의해 균형을 이루게 될 가능성이 높습니다.
그러나 이것은 소개 자료가 얼마나 나쁜지를 증명할 수 있습니다!
이 빠른 시작 비디오 . 글쎄, 이것들은 실제로 주장이 아니며, 글 머리표 목록이며, 프리젠 테이션에서 비판적 판단을 중단하는 데 일반적으로 사용되는 인공물입니다 (논리가 표시되지 않기 때문에 비판 할 수 없습니다!)
1.1 사람이 읽을 수있는 자동화 – 사양은 기술 문서입니다.
name: upgrade all packages
yum:
name: '*'
state: latest
쉘 스크립트에서 찾은 해당 yum 호출 보다 읽기 쉽습니다 . 또한 AppleScript에 연락 한 사람은 "사람이 읽을 수있는 자동화"를 읽을 때 웃으면 서 죽습니다.
1.2 특별한 코딩 기술이 필요하지 않음 – 공식 사양을 작성하지 않으면 코딩이란 무엇입니까? 조건부, 변수가 있으므로 어떻게 코딩하지 않습니까? 그리고 왜 내가 프로그래밍 할 수없는 것을 필요로합니까? 성명은 행복하지 않습니다!
1.3 순서대로 실행 된 작업 – 아마도 일부 골프 골 애호가 들은 무질서한 작업을 수행하는 언어를 알고 있지만 작업을 순서대로 실행하는 것은 예외적으로 보이지 않습니다.
1.4 생산성 향상 – 숙련 된 셸 프로그래머는 현재 생산성이 높습니다. 이 반론은 초기 논증만큼이나 심각합니다.
인공물을 판매하는 인기있는 영업 사원의 트릭은 사람들이 이러한 인공물의 "힘"을 획득 할 것이라고 믿도록 속이는 것입니다. 자동차 또는 등장 성 음료 광고의 역사는 설득력있는 예제 목록을 제공해야합니다.
여기서 Ansible은 "앱 배포"를 수행 할 수 있지만 쉘 스크립트는 반드시 "구성 관리"를 수행하지만 이는 기능이 아니라 툴의 목적에 대한 단순한 설명 일 뿐이며 약간의 소박하지만 예가없는 "워크 플로 오케스트레이션"입니다. 것 이상의 GNU 평행 할 수 있습니다.
컬럼을 채우기 위해 이들은 모두 ssh 만 필요로하는 세 가지 다른 방식으로 작성했습니다 . 이는 누구나 알고있는 데몬 이며 세계 구성 관리에 널리 퍼져있는 에이전트 와는 아무런 관련이 없습니다 !
나머지 비디오에서는 서버와 같은 정적 리소스 목록 인 인벤토리를 소개하고 3 대의 서버에 Apache를 동시에 배포하는 방법을 보여줍니다. 리소스가 매우 동적이며 클라우드 공급자가 제공하는 명령 줄 도구로 열거하고 파이프 |
연산자를 사용하여 셸 함수에서 사용할 수있는 작업 방식과 실제로 일치하지 않습니다 . 또한 세 대의 서버에 Apache를 동시에 배포하지 않고 마스터 인스턴스 이미지를 빌드 한 다음 정확한 복제 본인 3 개의 인스턴스를 시작하는 데 사용합니다. 따라서 논증의“조정”부분은 그다지 적절하지 않은 것으로 보입니다.
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 구조의 초기화 값 열거입니다.
이 안내서 의 가장 큰 부분에는 실제로 흥미로운 기능이 표시되지 않습니다. 변수를 소개합니다 (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 변형에 비해 복잡성이 용납 될 수 있습니다. 언어의 평범하고 규칙적인 지루한 구성 만 사용합니다.
마지막으로, 실제로 Ansible 의 첫 번째 흥미로운 기능인 것으로 밝혀졌습니다 .“Ansible 리소스는 원하는 상태의 모델입니다. 따라서 서비스가 시작되었는지, 패키지가 설치되었는지 또는 기타 다른 것들을 테스트 할 필요는 없습니다. 이러한 것들이 선언적으로 사실인지 확인하는 시스템이 있습니다. 대신, 당신의 플레이 북에 이런 것들을 주장하십시오.”이제 조금 흥미로워지기 시작하지만,
사용 가능한 모듈로 쉽게 구현할 수있는 몇 가지 표준 상황 외에도 테스트를 직접 구현하는 비트를 공급해야합니다. 여기에는 아마도 일부 쉘 명령이 포함됩니다.
변경할 수없는 서버 패턴이 구현되는 상황에서 설치 적합성 검사는 그다지 중요하지 않을 수 있습니다. 실행중인 모든 시스템은 일반적으로 마스터 이미지 (예 : 인스턴스 이미지 또는 도커 이미지)에서 생성되고 업데이트되지 않습니다. 대신 새로운.
Ansible 의 소개 자료 는 유지 보수성 문제를 무시합니다. 본질적으로 유형 시스템이 없으므로 쉘 스크립팅은 JavaScript, Lisp 또는 Python의 유지 관리 용이성을 제공합니다. 광범위한 자동 리팩터링은 광범위한 자동화 된 테스트 슈트 또는 최소한의 대화식 테스트를 허용하는 디자인을 통해서만 성공적으로 달성 할 수 있습니다. 즉, 쉘 스크립팅은 시스템 구성 및 유지 관리 의 링구아 프랑카 이지만 거의 각 프로그래밍 언어에는 쉘에 대한 인터페이스가 있습니다. 따라서 다양한 언어의 쉘 구성 비트를 서로 연결하기 위해 고급 언어를 사용하여 고급 언어의 유지 관리 이점을 활용할 수 있습니다. OCaml을 위해 Rashell을 썼습니다 기본적으로 하위 프로세스에 공통적 인 상호 작용 패턴을 제공하므로 구성 스크립트를 OCaml로 변환하는 것이 간단합니다.
Ansible의 측면에서 볼 때, 매우 약한 플레이 북 구조와 메타 프로그래밍 기능의 존재는 Ansible에 대한 단위 테스트를 작성하는 방법이 명확하지 않다는 점을 제외하고는 쉘 스크립팅의 경우와 같이 상황을 본질적으로 나쁘게 만듭니다. 고급 언어를 임시로 도입한다는 주장은 모방 할 수 없습니다.
Ansible의 문서는 dem 등원 구성 단계를 작성해야 할 필요성에 주목합니다. 보다 정확하게는, 구성 단계는 단계 시퀀스 aba 가 ab 로 단순화 될 수 있도록 작성되어야한다 . 즉, 구성 단계를 반복 할 필요가 없다. 이것은 dem 등식보다 더 강한 조건입니다. Ansible은 플레이 북이 임의의 셸 명령을 사용할 수 있도록 허용하므로 Ansible 자체는이 강력한 조건을 준수한다고 보장 할 수 없습니다. 이것은 프로그래머의 훈련에만 의존합니다.
이렇게하면 Ansible에 몇 가지 고유 한 장점이 있더라도 친숙한 도구 (이 경우 셸 스크립팅)를 사용하면 얻을 수있는 이점이 더 중요합니다. 나는 그것에 대한 명확한 답이 있다고 생각하지 않습니다.
팀이 Ansible이 쉘로 제공하는 것을 달성 할 수있는 경우 :
그들은 아마 그들이 알고있는 것을 고수 할 수있었습니다.
결국, BASH에서 "guards"를 구현할 수 있습니다. 다양한 서버 구성 작업을 해결하기 위해 기존의 많은 BASH 작업을 찾을 수 있습니다 (기본적으로 모든 Dockerfile에는 90 % bash 설치 코드가 있습니다). 기존의 전체 솔루션을 실제로 해당 도구에 이식하지 않고도 Ansible / Salt / Chef-Zero가 제공하는 것에 매우 근접 할 수 있습니다.
NIH (여기서는 발명되지 않은) 경향과 균형 잡힌 행동이며, 잘 확립 된 스크립트를 폐기하여보다 강력한 솔루션을 선호합니다.
염두에 두어야 할 마지막 고려 사항 : 더 많은 사람들을 팀에 채용하려고 할 때 기술 스택이 어떻게 측정되는지 Ansible 경험이있는 사람을 찾는 것이 특정 집에서 만든 스크립팅 CM 도구에 경험이있는 사람을 찾는 것보다 훨씬 쉽습니다. 이것은 엄밀히 기술적 인 고려 사항이 아니라 문화적 고려 사항입니다. 자체 Ansible을 발명하는 이상한 조직이되고 싶습니까, 아니면 직업에 적합한 도구를 찾는 합리적인 조직이 되시겠습니까? 이러한 결정은 재능을 끌어내는 능력에 영향을줍니다.
위의 답변은 그 일부를 다루고 있지만 중요한 요소 중 하나 인 수렴형 디자인이 누락되었습니다. 나는 https://coderanger.net/thinking/ 에서 Chef의 맥락에서 이것에 대해 얼마 전에 약간의 단어를 썼다. 그러나 짧은 버전은 bash 스크립트는 일련의 지침이며 Ansible 플레이 북 (또는 Chef recipe, Salt) 상태 등)은 원하는 상태에 대한 설명입니다. 원하는 단계보다 원하는 상태를 문서화하면 훨씬 더 많은 시작 상태에 대처할 수 있습니다. 이것은 오래 전에 CFEngine에 요약 된 바와 같이 Promise Theory의 핵심이며, 우리 (구성 관리 도구)는 그 이후로 복사 한 디자인입니다.
tl; dr Ansible 코드는 당신이 원하는 것을 말하고, bash 코드는 일을하는 방법을 말합니다.
원격 호스트에서도 사용 가능한 플레이 북을 실행하는 데 문제가 적다는 점에 주목해야합니다. 그것이 ansible를 달리는 주된 이유이기 때문에. 쉘 스크립팅을 사용하는 경우에도 scp를 원격 호스트에 스크립팅하는 방법이 필요합니다.
2019 년에 저는 며칠 동안 끔찍한 학습 곡선을 보냈으며 여기에 절대적인 진실이 있습니다. Ansible은 문제가되지 않습니다.
완료되지 않았으며 Windows에서 실행되지 않으며 YAML 구성과 오해의 소지가있는 오류 메시지의 조합으로 인해 눈이 번질 수 있습니다. 그것은 거의 고의적으로 끔찍한 것 같습니다. 그것은 분명히 redhat sysadmins가 개발자 측 프로젝트를 좌절 시켰습니다. 아마도 힙 스터 일 것입니다.
프로비저닝 이외의 기능이 필요하지 않으며 특정 OS에서만 프로비저닝하는 경우 동정을 위해 괜찮은 shell.script를 작성하십시오.
현재 전체 프로젝트는 초기 리눅스 포럼에서 멍청한 놈들이 RTFM에게 알려 주었고 누군가 그래픽 설정을 구성하기 위해 GUI를 작성할 수없는 이유에 대해 질문을 받았다. 당신은 그것을하지 않습니다? 당신은 창문에 집착해야 할 것입니다. 아마도 내가 짝짓기를 할 것입니다. 행복한 VI-ing.
Docker를 사용하십시오. 무엇보다 선호합니다. Docker는 엄청나게 간단하고 강력합니다.
그러나 기존 주석에 대해 반드시 프로비저닝해야하는 경우 실제 대안은 무엇입니까?
글쎄 ... 아직은 없습니다. 그러나 나는 당신에게 이것을 약속 할 것입니다. 팬보이가 아무리 열심히 밀어 붙여도 실패한다는 사실을 용서하기 때문에 노력하는 데는 10 점 만점에 5 점입니다.
SCP를 bash 스크립트로 만들고 문제를 해결하십시오.