웹사이트 검색

Ansible 플레이북을 사용하여 여러 원격 서버에서 복잡한 작업을 자동화하는 방법 - 2부


Ansible 시리즈의 이전 기사에서 우리는 Ansible이 단일 시스템에서 여러 머신(노드라고도 함)을 빠르고 효율적으로 관리하고 해당 머신에 대한 배포를 수행할 수 있게 해주는 에이전트 없는 도구라고 설명했습니다.

컨트롤러 시스템에 소프트웨어를 설치하고 비밀번호 없는 로그인을 위한 키를 생성하여 노드에 복사한 후에는 Ansible을 사용하여 이러한 원격 시스템을 관리하는 프로세스를 최적화하는 방법을 배울 차례입니다.

이 기사와 다음 기사 전체에서 다음 테스트 환경을 사용합니다. 모든 호스트는 CentOS 7 상자입니다.


Controller machine (where Ansible is installed): 192.168.0.19
Node1: 192.168.0.29
Node2: 192.168.0.30

또한 로컬 /etc/ansible/hosts 파일의 webservers 섹션에 두 노드가 모두 추가되었습니다.

즉, 당면한 주제부터 시작하겠습니다.

Ansible 플레이북 소개

이전 가이드에서 설명한 대로 ansible 유틸리티를 사용하여 다음과 같이 원격 노드에서 명령을 실행할 수 있습니다.


ansible -a "/bin/hostnamectl --static" webservers

위의 예에서는 node1node2에서 hostnamectl --static을 실행했습니다. 원격 컴퓨터에서 작업을 실행하는 이 방법은 짧은 명령에는 잘 작동하지만 잘 구조화된 구성 매개변수나 다른 서비스와의 상호 작용이 필요한 더 복잡한 작업에는 금방 부담스럽거나 지저분해질 수 있다는 사실을 깨닫는 데는 오랜 시간이 걸리지 않습니다.

예를 들어 여러 호스트에서 WordPress를 설정하고 구성하는 경우에 대해서는 이 시리즈의 다음 기사에서 다루겠습니다. 플레이북이 등장하는 곳이 바로 여기입니다.

간단히 말해서 플레이북YAML 형식으로 작성된 일반 텍스트 파일이며 하나 이상의 키/값 쌍('hash ' 또는 '사전 ').

각 플레이북 내에는 원하는 작업을 수행할 하나 이상의 호스트 그룹(이 그룹 각각을 플레이라고도 함)이 있습니다.

공식 문서의 예는 다음을 설명하는 데 도움이 됩니다.

1. 호스트: 다음 작업이 수행될 머신 목록입니다(/etc/ansible/hosts 기준).

2. remote_user: 작업을 수행하는 데 사용될 원격 계정입니다.

3. vars: 원격 시스템의 동작을 수정하는 데 사용되는 변수입니다.

4. 작업은 호스트와 일치하는 모든 시스템에 대해 한 번에 하나씩 순서대로 실행됩니다. 연극 내에서 모든 호스트는 동일한 작업 지시문을 받게 됩니다.

특정 호스트에 대해 다양한 관련 작업 세트를 실행해야 하는 경우 현재 플레이북에서 다른 플레이를 만듭니다. 즉, 플레이의 목적은 특정 호스트 선택을 잘 매핑하는 것입니다. -정의된 작업).

이 경우 하단에 호스트 지시문을 추가하고 다시 시작하여 새 플레이를 시작하세요.


---
- hosts: webservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
  remote_user: root
  tasks:
  - name: description for task1
    task1: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  - name: description for task1
    task2: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  handlers:
    - name: description for handler 1
      service: name=name_of_service state=service_status
- hosts: dbservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
…

5. 핸들러는 각 플레이의 작업 섹션이 끝날 때 실행되는 작업으로, 주로 서비스를 다시 시작하거나 원격 시스템에서 재부팅을 실행하는 데 사용됩니다.


mkdir /etc/ansible/playbooks

그리고 그 안에 다음 내용이 포함된 apache.yml이라는 파일이 있습니다.


---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: replace default index.html file
    copy: src=/static_files/index.html dest=/var/www/html/ mode=0644
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

둘째, /static_files 디렉터리를 만듭니다.


mkdir /static_files

맞춤 index.html 파일을 저장할 위치는 다음과 같습니다.


<!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="utf-8"/>
 </script>
 </head>
 <body>
 <h1>Apache was started in this host via Ansible</h1><br>
<h2>Brought to you by linux-console.net</h2>
 </body>
 </html>

즉, 이제 이 플레이북을 사용하여 앞서 언급한 작업을 수행할 차례입니다. Ansible은 호스트별로 각 작업을 한 번에 하나씩 진행하고 해당 작업의 상태를 보고합니다.


ansible-playbook /etc/ansible/playbooks/apache.yml

이제 브라우저를 열고 192.168.0.29192.168.0.30을 가리킬 때 어떤 일이 발생하는지 살펴보겠습니다.

한 단계 더 나아가 node1node2에서 Apache를 수동으로 중지하고 비활성화해 보겠습니다.


systemctl stop httpd
systemctl disable httpd
systemctl is-active httpd
systemctl is-enabled httpd

그런 다음 다시 실행하고,


ansible-playbook /etc/ansible/playbooks/apache.yml

이번에는 작업에서 Apache 웹 서버가 시작되어 각 호스트에서 활성화되었음을 보고합니다.

위의 예를 통해 Ansible의 위력을 엿볼 수 있습니다. 소수의 서버에서 수행할 때는 상대적으로 쉬운 작업이지만 여러 대(아마도 수백 대)의 시스템에서 동일한 작업을 수행해야 하는 경우 매우 지루하고 시간이 많이 걸릴 수 있습니다.

요약

이 기사에서는 Ansible을 사용하여 여러 원격 호스트에서 동시에 명령을 실행하고 복잡한 작업을 실행하는 방법을 설명했습니다. 공식 문서와 GitHub 저장소는 Ansible을 사용하여 상상할 수 있는 거의 모든 작업을 수행하는 방법에 대한 많은 예제와 가이드를 제공합니다.

Ansible을 사용하여 원격 Linux 호스트에서 작업을 자동화하는 방법을 배우기 시작하면서 여러분의 생각을 듣고 싶습니다. 질문, 의견, 제안도 언제나 환영이므로 언제든지 아래 양식을 사용하여 문의해 주시기 바랍니다.