RHEL 에 Ansible 플레이북 구현하기

AnsibleBeginner
지금 연습하기

소개

이 랩에서는 Red Hat Enterprise Linux (RHEL) 시스템에 Apache 웹 서버를 배포하는 완전한 Ansible 플레이북을 구현하는 방법을 배웁니다. 관리 노드를 정의하기 위한 정적 인벤토리 파일 생성과 ansible.cfg 파일을 사용하여 로컬 Ansible 환경을 구성하는 것을 포함하여 Ansible 프로젝트의 기본 구성 요소를 설정하는 것부터 시작합니다.

초기 설정 후, 핵심 배포 프로세스를 자동화하기 위한 다중 작업 플레이북을 작성합니다. 여기에는 Apache 서비스 설치 및 시작, 사용자 정의 웹 페이지 배포, HTTP 트래픽을 허용하도록 시스템 방화벽 구성이 포함됩니다. 랩을 완료하기 위해 플레이북에 두 번째 플레이를 추가하여 명령줄에서 웹 서버를 테스트하고 전체 배포가 성공했는지 확인합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 74%입니다.학습자들로부터 98%의 긍정적인 리뷰율을 받았습니다.

웹 서버를 위한 정적 인벤토리 파일 생성

이 단계에서는 Ansible 인벤토리의 기본 사항을 배웁니다. 인벤토리는 Ansible 이 관리할 서버 ("관리 대상 노드") 를 나열하는 텍스트 파일입니다. 웹 서버 그룹에 대한 간단한 정적 인벤토리 파일을 생성하고 해당 내용을 확인하는 방법을 배웁니다.

먼저 시스템에 Ansible 이 설치되어 있는지 확인해야 합니다. 기본적으로 설치되어 있지 않으므로 dnf 패키지 관리자를 사용하여 설치합니다.

  1. 터미널을 열고 기본 Ansible 명령줄 도구를 제공하는 ansible-core 패키지를 설치합니다.

    sudo dnf install -y ansible-core

    패키지가 설치 및 확인되고 있음을 나타내는 출력이 표시되어야 합니다.

    ...
    Installed:
      ansible-core-2.16.x-x.el9.x86_64
    ...
    Complete!
  2. 구성을 더 잘하기 위해 홈 디렉터리 내에 이 프로젝트를 위한 전용 디렉터리를 생성합니다. ansible-lab이라고 명명하겠습니다.

    mkdir -p ~/project/ansible-lab
  3. 새로 생성된 프로젝트 디렉터리로 이동합니다. 이 랩의 모든 후속 작업은 이 위치에서 수행됩니다.

    cd ~/project/ansible-lab
  4. 이제 첫 번째 인벤토리 파일을 생성합니다. 인벤토리 파일은 일반적으로 INI 와 유사한 형식으로 작성됩니다. nano 텍스트 편집기를 사용하여 inventory라는 파일을 생성합니다.

    nano inventory
  5. nano 편집기 내에서 다음 내용을 추가합니다. 이 구성은 [webservers]라는 그룹을 정의하고 로컬 머신인 localhost를 이 그룹에 추가합니다.

    • [webservers]는 그룹 이름입니다. 그룹은 단일 명령으로 여러 호스트를 대상으로 지정하는 데 사용됩니다.
    • localhost는 관리하려는 머신의 호스트 이름입니다. 이 경우 LabEx VM 자체입니다.
    • ansible_connection=local은 Ansible 이 SSH 를 통해 연결을 시도하는 대신 제어 노드 (VM) 에서 직접 명령을 실행하도록 지시하는 특수 변수입니다.
    [webservers]
    localhost ansible_connection=local

    nano에서 파일을 저장하려면 Ctrl+O를 누르고, 파일 이름을 확인하기 위해 Enter를 누른 다음, 편집기를 종료하기 위해 Ctrl+X를 누릅니다.

  6. 인벤토리 파일을 생성했으므로 ansible-inventory 명령을 사용하여 파일을 구문 분석하고 포함된 호스트 목록을 표시할 수 있습니다. -i 플래그는 인벤토리 파일의 경로를 지정합니다.

    ansible-inventory --list -i inventory

    이 명령은 인벤토리의 JSON 형식 표현을 출력하여 Ansible 이 파일을 올바르게 읽고 이해할 수 있음을 확인합니다.

    {
      "_meta": {
        "hostvars": {
          "localhost": {
            "ansible_connection": "local"
          }
        }
      },
      "all": {
        "children": ["ungrouped", "webservers"]
      },
      "webservers": {
        "hosts": ["localhost"]
      }
    }

기본 정적 인벤토리 파일을 성공적으로 생성했으며 Ansible 이 이를 올바르게 해석할 수 있음을 확인했습니다. 이 인벤토리 파일은 다음 단계에서 작성할 플레이북의 기반이 될 것입니다.

ansible.cfg 로 Ansible 환경 구성

이 단계에서는 Ansible 구성 파일인 ansible.cfg를 생성합니다. 이 파일을 사용하면 Ansible 의 기본 동작을 설정하여 일반적인 옵션을 명령줄에 반복해서 입력하는 수고를 덜 수 있습니다. 프로젝트 디렉터리에 ansible.cfg 파일을 배치하면 기본 인벤토리 파일 경로와 같은 설정을 정의할 수 있으며, Ansible 은 해당 디렉터리에서 실행될 때 이 설정을 자동으로 사용합니다.

이전 단계에서와 마찬가지로 여전히 ~/project/ansible-lab 디렉터리에 있어야 합니다.

  1. nano 텍스트 편집기를 사용하여 현재 디렉터리 (~/project/ansible-lab) 에 ansible.cfg라는 새 파일을 생성합니다.

    nano ansible.cfg
  2. nano 편집기 내에서 다음 내용을 추가합니다. 이 구성은 Ansible 에 기본 인벤토리 파일을 찾을 위치를 알려줍니다.

    • [defaults] 섹션은 대부분의 기본 설정을 정의하는 ansible.cfg 파일의 표준 부분입니다.
    • inventory = ./inventory 줄은 현재 디렉터리 (.) 에 있는 inventory 파일을 기본 인벤토리로 설정합니다.
    [defaults]
    inventory = ./inventory

    Ctrl+O를 누르고 Enter를 눌러 파일을 저장한 다음 Ctrl+X로 종료합니다.

  3. 이제 기본 인벤토리 경로를 구성했으므로 Ansible 명령에 -i 플래그를 더 이상 사용할 필요가 없습니다 (~/project/ansible-lab 디렉터리에 있는 동안).

    이를 테스트하기 위해 이전 단계와 동일한 ansible-inventory --list 명령을 다시 실행하지만, 이번에는 -i inventory 부분을 생략합니다.

    ansible-inventory --list

    이전 단계와 정확히 동일한 JSON 출력이 표시되어야 하며, 이는 새로운 ansible.cfg 구성 덕분에 Ansible 이 자동으로 inventory 파일을 찾아서 사용하고 있음을 확인합니다.

    {
      "_meta": {
        "hostvars": {
          "localhost": {
            "ansible_connection": "local"
          }
        }
      },
      "all": {
        "children": ["ungrouped", "webservers"]
      },
      "webservers": {
        "hosts": ["localhost"]
      }
    }

프로젝트별 ansible.cfg를 생성함으로써 워크플로우를 더욱 효율적으로 만들었습니다. 이는 Ansible 프로젝트에서 일관된 동작을 보장하고 명령줄 복잡성을 줄이기 위한 일반적인 관행입니다.

Apache 서비스 설치 및 시작 플레이북 작성

이 단계에서는 첫 번째 Ansible 플레이북을 작성합니다. 플레이북은 YAML 형식으로 작성된 파일로, 관리 대상 호스트에서 실행될 작업 집합을 설명합니다. 인벤토리에 정의된 localhost 머신에 Apache 웹 서버 (httpd) 를 설치하고 해당 서비스를 시작하는 플레이북을 생성합니다.

여전히 ~/project/ansible-lab 디렉터리에 있어야 합니다.

  1. 먼저 nano 텍스트 편집기를 사용하여 현재 디렉터리 (~/project/ansible-lab) 에 apache.yml이라는 새 파일을 생성합니다. 이 파일에 플레이북이 포함됩니다.

    nano apache.yml
  2. nano 편집기 내에서 "플레이 (play)"를 정의합니다. 플레이는 플레이북의 핵심 단위이며 호스트 그룹을 작업 집합에 매핑합니다. apache.yml에 다음 내용을 추가합니다.

    • ---: 문서 시작을 나타내는 표준 YAML 마커입니다.
    • - name: ...: 플레이의 시작입니다. 설명적인 이름을 지정하는 것이 좋은 방법입니다.
    • hosts: webservers: Ansible 에 인벤토리 파일의 webservers 그룹에 있는 모든 호스트에서 이 플레이를 실행하도록 지시합니다.
    • become: true: Ansible 에 작업 실행을 위해 권한 상승 (예: sudo) 을 사용하도록 지시합니다. 이는 소프트웨어 설치 또는 서비스 관리와 같은 작업에 필요합니다.
    • tasks:: 이 키워드는 수행할 작업 목록을 시작합니다.
    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
  3. 이제 플레이북에 작업을 추가합니다. 각 작업은 Ansible 모듈을 호출하는 단일 작업입니다. YAML 에서는 들여쓰기가 매우 중요하므로 작업이 tasks: 섹션 아래에 올바르게 들여쓰기되었는지 확인하십시오.

    • 작업 1: httpd 설치. 이 작업은 ansible.builtin.dnf 모듈을 사용하여 httpd 패키지가 설치되었는지 확인합니다. state: present 매개변수는 Ansible 이 패키지가 누락된 경우 설치하고 이미 설치된 경우 아무 작업도 수행하지 않음을 의미합니다.
    • 작업 2: httpd 서비스 시작. 이 작업은 ansible.builtin.service 모듈을 사용합니다. state: started는 서비스가 실행 중인지 확인하고, enabled: true는 시스템 부팅 시 자동으로 시작되도록 합니다.

    tasks: 줄 바로 아래에 다음 작업을 apache.yml 파일에 추가합니다.

    - name: Install httpd package
      ansible.builtin.dnf:
        name: httpd
        state: present
    
    - name: Start and enable httpd service
      ansible.builtin.service:
        name: httpd
        state: started
        enabled: true
  4. 완성된 apache.yml 플레이북은 이제 다음과 같이 보입니다. 들여쓰기를 주의 깊게 다시 확인하십시오.

    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
        - name: Install httpd package
          ansible.builtin.dnf:
            name: httpd
            state: present
    
        - name: Start and enable httpd service
          ansible.builtin.service:
            name: httpd
            state: started
            enabled: true

    파일을 저장하고 nano를 종료합니다 (Ctrl+O, Enter, Ctrl+X).

  5. 플레이북을 실행하기 전에 --syntax-check 플래그와 함께 ansible-playbook 명령을 사용하여 구문 오류를 확인하는 것이 좋습니다.

    ansible-playbook --syntax-check apache.yml

    구문이 올바르면 명령은 오류 없이 플레이북의 파일 이름을 출력합니다.

    playbook: apache.yml
  6. 이제 플레이북을 실행합니다.

    ansible-playbook apache.yml

    Ansible 이 작업을 실행합니다. 첫 실행이므로 두 작업 모두 changed 상태가 표시되며, 이는 시스템 상태가 수정되었음을 나타냅니다.

    PLAY [Install and start Apache web server] *************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Install httpd package] ***************************************************
    changed: [localhost]
    
    TASK [Start and enable httpd service] ******************************************
    changed: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  7. 마지막으로 curl을 사용하여 localhost에서 기본 웹 페이지를 요청하여 Apache 웹 서버가 실행 중인지 확인합니다.

    curl http://localhost

    기본 Apache 테스트 페이지가 표시되어야 하며, 이는 플레이북이 성공적으로 작동했음을 확인합니다.

    <html>
      <head>
        <title>Test Page</title>
      </head>
      <body>
        <h1>Test Page</h1>
        <p>This is the default test page for the Apache HTTP server.</p>
      </body>
    </html>

웹 페이지 배포를 위한 태스크 추가

이 단계에서는 플레이북을 확장하여 보다 현실적인 웹 서버 구성을 수행합니다. 사용자 지정 index.html 페이지를 배포하는 작업을 추가합니다. 이는 Ansible 의 파일 관리 모듈을 사용하여 파일을 관리하는 방법을 보여줍니다.

여전히 ~/project/ansible-lab 디렉터리에 있어야 합니다.

  1. 먼저 플레이북이 배포할 간단한 HTML 파일을 생성합니다. nano를 사용하여 현재 디렉터리에 index.html이라는 파일을 생성합니다.

    nano index.html
  2. 파일에 다음 HTML 내용을 추가합니다. 이것이 사용자 지정 웹 페이지의 내용이 됩니다.

    <h1>Welcome to the Ansible-managed Web Server!</h1>
    <p>This page was deployed using an Ansible Playbook.</p>

    nano를 저장하고 종료합니다 (Ctrl+O, Enter, Ctrl+X).

  3. 이제 새 작업을 추가하기 위해 apache.yml 플레이북을 업데이트합니다. YAML 서식 오류를 방지하기 위해 전체 내용으로 파일을 다시 만드는 것이 좋습니다.

    중요: 올바른 YAML 서식을 보장하고 들여쓰기 오류를 방지하려면 기존 apache.yml 파일을 제거하고 아래에 표시된 전체 내용으로 새 파일을 만드십시오.

    rm apache.yml
    nano apache.yml
  4. 플레이북에 새 작업을 추가합니다. 이 작업은 index.html 파일을 웹 서버의 문서 루트 (/var/www/html/) 로 복사합니다.

    • 작업: index.html 배포. 이 작업은 ansible.builtin.copy 모듈을 사용합니다. src는 제어 노드에 있는 소스 파일 (index.html) 을 지정하고, dest는 관리 대상 호스트의 대상 경로를 지정합니다.
  5. 아래의 전체 apache.yml 플레이북 내용을 복사하여 붙여넣습니다. 이렇게 하면 올바른 YAML 서식과 들여쓰기가 보장됩니다.

    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
        - name: Install httpd package
          ansible.builtin.dnf:
            name: httpd
            state: present
    
        - name: Deploy custom index.html
          ansible.builtin.copy:
            src: index.html
            dest: /var/www/html/index.html
    
        - name: Start and enable httpd service
          ansible.builtin.service:
            name: httpd
            state: started
            enabled: true

    nano를 저장하고 종료합니다.

  6. 파일을 저장하고 nano를 종료한 다음 (Ctrl+O, Enter, Ctrl+X), 업데이트된 플레이북을 실행합니다.

    ansible-playbook apache.yml

    이번에는 새 작업이 실행되는 것을 볼 수 있습니다. "Install httpd" 및 "Start httpd" 작업은 원하는 상태가 이미 충족되었으므로 ok로 보고되어야 합니다. "Deploy custom index.html" 작업은 changed로 보고됩니다.

    PLAY [Install and start Apache web server] *************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Install httpd package] ***************************************************
    ok: [localhost]
    
    TASK [Deploy custom index.html] ************************************************
    changed: [localhost]
    
    TASK [Start and enable httpd service] ******************************************
    ok: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  7. 마지막으로 curl을 다시 사용하여 사용자 지정 웹 페이지가 이제 제공되고 있는지 확인합니다.

    curl http://localhost

    출력은 이제 index.html 파일의 내용이어야 합니다.

    <h1>Welcome to the Ansible-managed Web Server!</h1>
    <p>This page was deployed using an Ansible Playbook.</p>

웹 서버 배포 테스트를 위한 두 번째 플레이 구현

이 마지막 단계에서는 플레이북에 두 번째 플레이를 추가합니다. 단일 플레이북 파일은 여러 플레이를 포함할 수 있으며, 이 플레이들은 순차적으로 실행됩니다. 이는 다른 호스트를 대상으로 하거나 다른 목적을 가진 작업을 구성하는 데 유용합니다. 첫 번째 플레이에서 구성된 웹 서버를 테스트하기 위해 제어 노드 (localhost) 에서만 실행되는 새 플레이를 추가합니다.

여전히 ~/project/ansible-lab 디렉터리에 있어야 합니다.

  1. 이제 플레이북에 두 번째 플레이를 추가합니다. 두 번째 플레이를 추가할 때 올바른 YAML 서식을 보장하기 위해 전체 내용으로 파일을 다시 만드는 것이 좋습니다.

    중요: 두 번째 플레이를 추가할 때 YAML 들여쓰기 오류를 방지하려면 기존 apache.yml 파일을 제거하고 아래에 표시된 두 개의 플레이 전체 내용으로 새 파일을 만드십시오.

    rm apache.yml
    nano apache.yml
  2. 플레이북에 두 번째 플레이를 추가합니다. 두 번째 플레이를 사용하면 다른 호스트를 대상으로 하거나 다른 목적을 가진 작업을 구성할 수 있습니다.

    • name: Test web server: 새 플레이에 대한 설명적인 이름입니다.
    • hosts: localhost: 이 플레이는 제어 노드 자체인 localhost에서 실행됩니다.
    • become: false: 이 테스트는 루트 권한이 필요하지 않으므로 권한 상승을 명시적으로 비활성화합니다.
    • 작업: 웹 콘텐츠 확인. 이 작업은 ansible.builtin.uri 모듈을 사용하여 웹 서버에 HTTP 요청을 합니다. 서버가 상태 코드 200(OK) 을 반환하고 반환된 콘텐츠에 "Ansible-managed" 문자열이 포함되어 있는지 확인합니다. 이는 수동으로 수행하던 curlgrep 검사를 자동화합니다.
  3. 이제 두 플레이를 모두 포함하는 아래의 전체 apache.yml 플레이북 내용을 복사하여 붙여넣습니다.

    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
        - name: Install httpd package
          ansible.builtin.dnf:
            name: httpd
            state: present
    
        - name: Deploy custom index.html
          ansible.builtin.copy:
            src: index.html
            dest: /var/www/html/index.html
    
        - name: Start and enable httpd service
          ansible.builtin.service:
            name: httpd
            state: started
            enabled: true
    
    - name: Test web server from localhost
      hosts: localhost
      become: false
      tasks:
        - name: Verify web server is serving correct content
          ansible.builtin.uri:
            url: http://localhost
            return_content: yes
            status_code: 200
          register: result
          failed_when: "'Ansible-managed' not in result.content"

    nano를 저장하고 종료합니다 (Ctrl+O, Enter, Ctrl+X).

  4. 전체 플레이북을 실행합니다. Ansible 은 첫 번째 플레이를 실행하고 모든 작업이 이미 원하는 상태 (ok) 임을 확인한 다음 두 번째 플레이로 진행하여 테스트를 실행합니다.

    ansible-playbook apache.yml

    출력에는 두 플레이가 모두 실행되는 것이 표시됩니다. 모든 작업은 ok 상태로 성공적으로 완료되어야 합니다.

    PLAY [Install and start Apache web server] *************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Install httpd package] ***************************************************
    ok: [localhost]
    
    TASK [Deploy custom index.html] ************************************************
    ok: [localhost]
    
    TASK [Start and enable httpd service] ******************************************
    ok: [localhost]
    
    PLAY [Test web server from localhost] ******************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Verify web server is serving correct content] ****************************
    ok: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

두 번째 플레이를 추가함으로써 서비스 구성뿐만 아니라 배포가 성공했는지 확인하는 내장 테스트를 포함하는 보다 강력한 자동화 워크플로를 만들었습니다.

요약

이 실습에서는 ansible-core 패키지를 설치하고 프로젝트 디렉터리를 구성하여 Ansible 자동화를 위한 RHEL 환경을 준비하는 방법을 배웠습니다. 관리 대상 노드 그룹을 정의하기 위해 기본 정적 인벤토리 파일을 생성했으며, 로컬 연결을 사용하여 localhost를 지정했습니다. 또한 사용자 지정 인벤토리를 가리키도록 ansible.cfg 파일을 사용하여 Ansible 환경을 구성하여 플레이북 실행을 위한 깔끔하고 체계적인 작업 공간을 구축했습니다.

그런 다음 Apache 웹 서버 배포를 자동화하기 위한 포괄적인 Ansible 플레이북을 작성했습니다. 여기에는 ansible.builtin.dnf 모듈을 사용하여 httpd 패키지를 설치하고 ansible.builtin.service 모듈을 사용하여 서비스가 시작되고 활성화되었는지 확인하는 작업 작성이 포함되었습니다. 플레이북은 ansible.builtin.copy 모듈을 사용하여 사용자 지정 index.html 웹 페이지를 배포하도록 향상되었습니다. 마지막으로 동일한 플레이북 내에 두 번째 플레이를 구현하여 배포를 검증했으며, ansible.builtin.uri 모듈을 사용하여 새로 배포된 웹 서버에 대한 연결을 테스트하여 완전한 설정 및 검증 워크플로를 시연했습니다.