웹사이트 검색

Ubuntu에서 시스템 구성을 자동화하기 위해 Ansible 플레이북을 만드는 방법


상태: 더 이상 사용되지 않음

이 문서에서는 더 이상 지원되지 않는 Ubuntu 버전에 대해 설명합니다. 현재 Ubuntu 12.04를 실행하는 서버를 운영 중인 경우 지원되는 Ubuntu 버전으로 업그레이드하거나 마이그레이션하는 것이 좋습니다.

  • Ubuntu 14.04로 업그레이드합니다.
  • Ubuntu 14.04에서 Ubuntu 16.04로 업그레이드
  • 서버 데이터를 지원되는 버전으로 마이그레이션

이유:

대신 참조:

소개

Ansible은 대규모 컴퓨터 네트워크에 대한 시스템 구성 작업을 자동화하고 구성하는 데 사용할 수 있는 간편한 구성 관리 시스템입니다. 일부 다른 구성 관리 시스템에서는 서버 및 클라이언트 시스템에 다양한 패키지를 설치해야 하지만 Ansible을 사용하면 서버 구성 요소를 설치하고 클라이언트 시스템에 대한 SSH 액세스 권한만 있으면 됩니다.

이전 가이드에서 Ansible 소프트웨어를 설치하고 기본 명령을 배우는 방법에 대해 설명했습니다. 이 가이드에서는 클라이언트 컴퓨터를 구성하기 위해 자동화된 스크립트를 생성하는 Ansible의 방법인 Ansible 플레이북에 대해 설명합니다.

지난 자습서에서 중단한 것처럼 구성된 Ansible 서버와 몇 개의 클라이언트가 있다고 가정합니다. 가이드에서 서버는 Ubuntu 12.04 머신이고 구성할 클라이언트도 설명을 쉽게 하기 위해 Ubuntu 12.04 머신입니다.

Ansible 플레이북이란 무엇입니까?

Ansible 플레이북은 스크립트 방식으로 원격 컴퓨터에 명령을 보내는 방법입니다. Ansible 명령을 개별적으로 사용하여 명령줄에서 원격으로 컴퓨터를 구성하는 대신 하나 이상의 시스템에 스크립트를 전달하여 복잡한 전체 환경을 구성할 수 있습니다.

Ansible 플레이북은 YAML 데이터 직렬화 형식으로 작성됩니다. 데이터 직렬화 형식이 무엇인지 모르는 경우 프로그램 데이터 구조(목록, 배열, 사전 등)를 디스크에 쉽게 저장할 수 있는 형식으로 변환하는 방법으로 생각하십시오. 그런 다음 이 파일을 사용하여 나중에 구조를 다시 만들 수 있습니다. JSON은 널리 사용되는 또 다른 데이터 직렬화 형식이지만 YAML은 읽기가 훨씬 쉽습니다.

각 플레이북에는 호스트를 특정 기능에 매핑하는 하나 이상의 플레이가 포함되어 있습니다. Ansible은 기본적으로 모듈 호출인 작업이라는 것을 통해 이를 수행합니다.

기본 플레이북 탐색

기본 플레이북을 살펴보겠습니다.

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

이러한 파일이 어떻게 빌드되고 각 부분이 무엇을 의미하는지 이해할 수 있도록 섹션별로 나누어 보겠습니다.

파일은 다음으로 시작합니다.

---

이는 YAML이 파일을 적절한 문서로 해석하기 위한 요구 사항입니다. YAML은 각각 ---로 구분된 하나의 파일에 여러 "문서\가 존재할 수 있도록 허용하지만 Ansible은 파일당 하나만 원하므로 파일의 맨 위에만 있어야 합니다.

YAML은 공백에 매우 민감하며 이를 사용하여 서로 다른 정보를 그룹화합니다. 탭이 아닌 공백만 사용해야 하며 파일을 올바르게 읽으려면 일관된 공백을 사용해야 합니다. 들여쓰기 수준이 같은 항목은 형제 요소로 간주됩니다.

-로 시작하는 항목은 목록 항목으로 간주됩니다. key: value 형식의 항목은 해시 또는 사전으로 작동합니다. 이것이 기본 YAML의 전부입니다.

YAML 문서는 기본적으로 포함하는 요소가 더 왼쪽에 있는 계층적 트리 구조를 정의합니다.

두 번째 줄에는 다음이 있습니다.

---
- hosts: droplets

위에서 배운 것처럼 이것은 YAML의 목록 항목이지만 가장 왼쪽 수준에 있기 때문에 Ansible "재생\이기도 합니다. 재생은 기본적으로 특정 호스트 세트에서 수행되는 작업 그룹입니다. 할당하려는 기능을 수행하기 위해 여기에서 하는 것처럼 각 플레이는 호스트 또는 호스트 그룹을 지정해야 합니다.

다음으로 일련의 작업이 있습니다.

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

최상위 레벨에는 "hosts:\와 동일한 레벨에 "tasks:\가 있습니다. 여기에는 키-값 쌍을 포함하는 목록이 포함됩니다("-”로 시작하기 때문).

첫 번째 "이름\은 이름이라기보다 설명에 가깝습니다. 원하는 대로 부를 수 있습니다.

다음 키는 "apt\입니다. 이것은 ansible 명령을 사용하고 다음과 같이 입력할 때와 마찬가지로 Ansible 모듈에 대한 참조입니다.

ansible -m apt -a 'whatever' all

이 모듈을 사용하면 패키지와 그것이 있어야 할 상태를 지정할 수 있습니다. 우리의 경우 "설치됨\입니다. update-cache=true 부분은 원격 시스템에 패키지 캐시를 업데이트하도록 지시합니다. (apt-get 업데이트) 소프트웨어를 설치하기 전에.

"notify\ 항목에는 "start nginx\라는 하나의 항목이 있는 목록이 포함되어 있습니다. 이것은 내부 Ansible 명령이 아니라 작업 내에서 호출될 때 특정 기능을 수행할 수 있는 핸들러에 대한 참조입니다. 아래에서 "start nginx\ 핸들러를 정의합니다.

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

"handlers\ 섹션은 "hosts\ 및 "tasks\와 동일한 수준에 있습니다. 핸들러는 작업과 비슷하지만 작업에서 클라이언트 시스템에 변경 사항이 발생했음을 알릴 때만 실행됩니다.

예를 들어 패키지가 설치된 후 Nginx 서비스를 시작하는 핸들러가 있습니다. 핸들러는 "nginx 웹 서버 설치\ 작업으로 인해 시스템이 변경되지 않는 한 호출되지 않습니다. 즉, 패키지를 설치해야 했지만 아직 존재하지 않았습니다.

이 플레이북을 "nginx.yml\과 같은 파일에 저장할 수 있습니다.

어떤 맥락에서 이 동일한 파일을 JSON으로 작성한다면 다음과 같이 보일 수 있습니다.

[
    {
        "hosts": "droplets",
        "tasks": [
            {
                "name": "Installs nginx web server",
                "apt": "pkg=nginx state=installed update_cache=true",
                "notify": [
                    "start nginx"
                ]
            }
        ],
        "handlers": [
            {
                "name": "start nginx",
                "service": "name=nginx state=started"
            }
        ]
    }
]

보시다시피 YAML은 훨씬 더 간결하며 대부분의 사람들은 더 읽기 쉽다고 말할 것입니다.

Ansible 플레이북 실행

플레이북이 빌드되면 다음 형식을 사용하여 쉽게 호출할 수 있습니다.

<예비>

예를 들어 모든 드롭릿에 Nginx를 설치하고 시작하려면 다음 명령을 실행할 수 있습니다.

ansible-playbook nginx.yml

플레이북 자체가 실행 대상 호스트(즉, 지난 튜토리얼에서 생성한 "droplets\ 그룹)를 지정하므로 실행 대상 호스트를 지정할 필요가 없습니다.

그러나 해당 호스트 중 하나에만 적용되도록 호스트 목록을 필터링하려는 경우 파일에서 호스트의 하위 집합을 지정하는 플래그를 추가할 수 있습니다.

<예비>

따라서 "host3\에만 Nginx를 설치하고 실행하려는 경우 다음과 같이 입력할 수 있습니다.

ansible-playbook -l host3 nginx.yml

플레이북에 기능 추가

현재 플레이북은 다음과 같습니다.

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

간단하고 작동하지만 소프트웨어를 설치하고 시작하는 것이 전부입니다. 그 자체로는 그다지 유익하지 않습니다.

플레이북에 작업을 추가하여 기능 확장을 시작할 수 있습니다.

기본 색인 파일 추가

다음과 같은 몇 줄을 추가하여 Ansible 서버에서 호스트로 파일을 전송하도록 지시할 수 있습니다.

<예비>

  • 호스트: 물방울\n작업:
    • 이름: nginx 웹 서버 설치 적절한: pkg=nginx 상태=설치됨 update_cache=true\n알림:
      • nginx 시작

      각 작업에 대해 선택적으로 나중에 확인할 수 있는 변수에 결과(실패 또는 성공)를 등록할 수 있습니다.

      이 기능을 사용할 때 문제가 발생하면 일반적으로 해당 호스트에 대한 플레이북 실행을 중단하기 때문에 해당 작업에 대한 오류를 무시하도록 Ansible에 지시해야 합니다.

      따라서 작업이 실패했는지 여부를 확인하여 후속 단계를 결정하려는 경우 등록 기능을 사용할 수 있습니다.

      예를 들어 index.php 파일이 있는 경우 이를 업로드하도록 플레이북에 지시할 수 있습니다. 작업이 실패하면 대신 index.html 파일을 업로드할 수 있습니다. PHP 파일이 실패할 경우에만 HTML 파일을 업로드하기를 원하기 때문에 다른 작업에서 실패 조건을 확인합니다.

      <예비>

      • 호스트: 물방울\n작업:
        • 이름: nginx 웹 서버 설치 적절한: pkg=nginx 상태=설치됨 update_cache=true\n알림:
          • nginx 시작

          - 이름: 호스트용 index.html 제거

          • 이름: 호스트용 기본 index.html 업로드\n복사: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644 when: php|failed

          핸들러:

          • 이름: nginx 시작 서비스: 이름=nginx 상태=시작됨

          참고: 현재 PHP 파일을 처리하도록 호스트를 구성하지 않았으므로 PHP 파일을 업로드하더라도 올바르게 처리되지 않습니다.

          이 새 버전은 PHP 색인 파일을 호스트에 업로드하려고 시도합니다. 작업의 성공 여부를 \php\라는 변수에 등록합니다.

          이 작업이 성공하면 다음으로 index.html 파일을 제거하는 작업이 실행됩니다.

          작업이 실패하면 대신 index.html 파일이 업로드됩니다.

          결론

          이제 Ansible을 사용하여 복잡한 작업을 자동화하는 방법을 잘 알고 있어야 합니다. 이것은 구성 라이브러리 구축을 시작할 수 있는 방법에 대한 기본적인 예입니다.

          첫 번째 자습서에서 배운 호스트 및 그룹 정의를 결합하고 사용 가능한 변수를 사용하여 정보를 채우면 서로 상호 작용하는 복잡한 컴퓨터 시스템을 구성할 수 있습니다. 향후 기사에서는 플레이북에 변수를 구현하고 복잡한 작업을 관리하는 데 도움이 되는 역할을 생성하는 방법에 대해 논의할 것입니다.

          저스틴 엘링우드