유사한 쉘(Bash) 스크립트를 사용하여 원격 Debian 시스템에 몇 가지 추가 기능이 포함된 LAMP를 설정했습니다.
#/bin/bash
apt update -y
apt upgrade ufw sshguard unattended-upgrades wget curl git zip unzip tree -y
ufw --force enable
ufw allow 22,25,80,443
apt upgrade lamp-server^ ssmtp
apt upgrade python-certbot-apache
apt upgrade php-{cli,curl,mbstring,mcrypt,gd} phpmyadmin
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
cat <<-EOF > /etc/php*/conf.d/local.ini
upload_max_filesize = 2000M
post_max_size = 2000M
EOF
a2enmod http2 deflate expires
비슷한 스크립트를 본 일부 시스템 관리자는 "이 작업을 수행하려면 Ansible을 사용하는 것이 좋습니다. 그렇지 않으면 유지 관리가 악몽이 될 것입니다."라고 말했습니다.
글쎄, 나는 내가 작성한 다음 Ansible 플레이북을 사용하여 본질적으로 동일한 효과를 얻을 수 있습니다(현재 무료 머신이 없기 때문에 아직 테스트되지 않았지만 모든 머신에 배포하면 작동해야 함).
---
- hosts: all
become: yes
become_user: root
tasks:
- name: Update apt package-indexes cache
apt:
update_cache=yes
- name: Install external basics
apt: state=latest
with-items:
- ufw
- sshguard
- unattended-upgrades
- wget
- curl
- git
- zip
- unzip
- tree
- name: Setup firewall with ufw
ufw:
rule: allow
port: 22,25,80,443
- name: Establish a LAPMS server environment (Linux, Apache, PHP, MySQL, SSMTP)
apt: state=latest
with-items:
- apache2 # Web server
- python-certbot-apache
- php
- php-mysql # MySQL server
- php-cli
- php-curl
- php-mbstring
- php-mcrypt
- php-gd
- phpmyadmin
- ssmtp # Email server
- name: Manually install PHP Composer
get_url:
url: https://getcomposer.org/installer
dest: /tmp/composer-setup.php
command: php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
- name: Configure PHP variables
shell: |
cat <<-EOF > /etc/php*/conf.d/local.ini
upload_max_filesize = 2000M
post_max_size = 2000M
EOF
args:
executable: /bin/bash
- apache2_module:
state: present
name: http2
- apache2_module:
state: present
name: deflate
- apache2_module:
state: present
name: expires
내 생각
위의 작은 예에서는 순수 쉘 스크립팅에 비해 순수 Ansible을 사용하는 데 큰 이점이 없다고 생각합니다.Ansible은 우리가 지시한 대로만 수행하기 때문에release_upgrades(Apache 2.4에서 3.4로)를 수행하지 않으며 기본적으로 apt upgrade -y
예약과 동일한 자동화(예: cron
)를 제공하므로 이것이 어떻게 도우미가 될지는 알 수 없습니다(결과도 기본적으로 동일하지만 하나 이상의 Ansible 플레이북의 핵심을 포함하는 잘 구성된 프로그램인 Ansible-Galaxy 역할을 사용하지 않는 한 라인 수는 훨씬 더 높습니다(20/21 대신 72라인).
내 질문
위와 같은 사소한 작업에서 어떻게 Ansible 자체(Ansible-Galaxy 역할을 사용하지 않고)가 일반 셸 스크립트(특히 Bash)보다 더 효율적일 수 있습니까?
답변1
나는 한두 대의 머신을 위한 쉘 스크립트로서 20줄이 큰 문제라고 생각하지 않습니다. 이것은 좋은 일입니다.
즉, 스크립트는 멱등성이 없습니다. 예를 들어 를 사용하면 apt-get upgrade foo
이 시스템에서 스크립트가 이미 실행 중이더라도 변경을 수행할 수 있습니다. 사용할만한 가치가 없다고 생각합니다 apt-get upgrade foo
. 이 명령은 보안 또는 버그 수정 업데이트가 종속성에 적용된다는 것을 보장하지 않습니다.
잘 작성된 Ansible 플레이북은 미니 시스템 점검으로도 활용할 수 있습니다. 이는 플레이북이 멱등적(그리고 "변경된" 상태를 정확하게 보고함)에 달려 있습니다. 런타임은 ansible-playbook --check
시스템이 정의된 모든 작업을 계속 충족하는지 또는 변경 사항이 발생했는지 표시합니다. 이는 나중에 유용하거나 플레이북을 실행한 후 즉시 불일치를 찾는 데 유용할 수 있습니다.
여러 머신에서 동시에 실행할 수 있도록 Ansible을 설정할 수 있습니다.
Ansible과 같은 구성 도구는 대규모 애플리케이션에 매우 유용합니다. 그 이유 중 하나는 이러한 특성 때문입니다. 부분적으로는 이러한 제한 사항 때문에 이를 따르도록 권장합니다.
유지 관리 목적에도 유용한 멱등성 스크립트를 작성하는 것이 좋습니다. 기존 파일에 줄을 추가하는(또는 기존 줄에 :-( ) 마커를 추가하는 스크립트를 작성하려는 유혹을 고려해 보십시오. 멱등성을 보장하면 중복된 줄을 추가하지 않고 수정된 스크립트를 다시 실행할 수 있습니다.
또 다른 제한 사항은 설치된 시스템에서 무언가를 제거하려는 경우입니다. 대부분의 경우 이는 문제가 되지 않으며 나중에 제거 스크립트/플레이북을 작성할 수 있습니다. 하지만 이에 주의해야 하는 상황이 있습니다. 예를 들어, Ansible을 사용하여 lineinfile
개별 줄을 바꾸지 않고 대신 전체 파일을 자신의 버전으로 덮어쓰고 싶을 수 있습니다 . 이는 A행의 기본 설정을 더 이상 변경하고 싶지 않지만 B행은 계속 변경하려는 경우에 유용합니다.
제가 사용하기 위해서는 방화벽 관리 시 삭제 문제를 해결하고 싶습니다. 설치 스크립트에서 포트 허용을 중지하면 모든 곳에서 해당 포트를 명시적으로 차단하는 것을 잊어버릴 수 있습니다. Ansible ufw
모듈은 개별 규칙을 추가하거나 제거하는 것만 허용하므로 여기서는 도움이 되지 않습니다. 저는 현재 ufw
프로필 작업을 적절하게 지원하는 방화벽을 사용하는 것에 대한 대안을 고려 중입니다. (예를 들어 firewalld
,,, shorewall
... ferm
).
답변2
Bash와 Ansible의 차이점은 Ansible은 올바르게 작성되면 멱등원이라는 것입니다. 플레이북을 반복적으로 실행해도 아무 변화가 없습니다. 이와 관련하여 Bash 스크립트는 프로세스를 설명하는 반면 Ansible 플레이북은 시스템 상태를 설명합니다.
댓글 해결
"답을 이해할 만큼 멱등성을 잘 이해하고 있는지 잘 모르겠습니다."
멱등성플레이북은 "초기 적용 이후 결과를 변경하지 않고 여러 번 적용할 수 있다"는 의미입니다. 가장 좋은 방법은 플레이북을 두 번 실행하는 것입니다. 첫 번째 실행 중에 플레이북은 모든 변경 사항을 수행합니다. 두 번째 실행 중에는 변경 사항이 보고되지 않습니다.
답변3
Ansible의 주요 판매 포인트 중 하나는 YAML 구문을 사용하기 때문에 플레이북이 밀집된 BASH oneliner보다 읽기 쉬운 경향이 있다는 것입니다. 또한 BASH 스크립팅보다 더 풍부한 기능을 갖춘 방식으로 린터와 디버거를 사용할 수 있으며, 일부 IDE에는 스크립트 작성을 지원하는 내장 Ansible 텍스트 완성 모듈도 있습니다.