Ansible 을 사용하여 원격 호스트에서 쉘 명령어 실행 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 은 원격 시스템을 손쉽게 관리하고 구성할 수 있는 강력한 인프라 자동화 도구입니다. 이 튜토리얼에서는 Ansible 을 사용하여 원격 호스트에서 쉘 명령어를 실행하는 방법을 배우고, 원격 시스템 관리를 효율화하기 위한 실용적인 사용 사례와 최선의 방법을 살펴볼 것입니다.

Ansible 기본 이해

Ansible 이란 무엇인가?

Ansible 은 인프라를 코드로 관리할 수 있도록 지원하는 오픈소스 자동화 도구입니다. 간편하고 강력하며 에이전트리스 (agentless) 방식으로 SSH 를 통해 원격 시스템을 관리 및 구성하도록 설계되었습니다. Ansible 은 인프라의 원하는 상태를 선언형 언어로 기술하고, 그 상태를 달성하기 위한 필요한 단계를 처리합니다.

Ansible 의 주요 개념

  • 인벤토리 (Inventory): Ansible 은 관리하고자 하는 호스트 또는 호스트 그룹을 정의하기 위해 인벤토리 파일을 사용합니다.
  • 플레이북 (Playbook): Ansible 플레이북은 YAML 기반의 구성 파일로, 대상 호스트에서 실행될 작업 및 동작을 정의합니다.
  • 모듈 (Modules): Ansible 은 파일, 패키지, 서비스 등 다양한 작업을 수행할 수 있는 다수의 내장 모듈을 제공합니다.
  • 롤 (Roles): Ansible 롤은 플레이북 코드를 구성하고 재사용하는 데 도움을 주어 복잡한 구성을 관리하기 쉽게 합니다.

Ansible 설치 및 구성

Ansible 을 시작하려면 컨트롤 머신에 Ansible 을 설치해야 합니다. Ubuntu 22.04 에서 다음 명령어를 사용하여 Ansible 을 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install -y ansible

Ansible 설치 후 관리하고자 하는 호스트를 정의하기 위해 인벤토리 파일을 구성할 수 있습니다. 다음은 inventory.yml 파일의 예입니다.

all:
  hosts:
    webserver1.example.com:
      ansible_host: 192.168.1.100
    webserver2.example.com:
      ansible_host: 192.168.1.101
  children:
    webservers:
      hosts:
        webserver1.example.com:
        webserver2.example.com:

이 인벤토리 파일은 webserver1.example.comwebserver2.example.com 두 개의 웹 서버를 정의하고 webservers 그룹 아래에 그룹화합니다.

Ansible 플레이북 구조

Ansible 플레이북은 YAML 형식으로 작성되며 하나 이상의 "플레이 (play)"로 구성됩니다. 각 플레이는 대상 호스트에서 실행될 작업 집합을 정의합니다. 다음은 플레이북 구조의 예입니다.

- hosts: webservers
  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present
    - name: Start Apache service
      service:
        name: apache2
        state: started
        enabled: yes

이 플레이북은 Apache 웹 서버를 설치하고 webservers 그룹의 호스트에서 서비스가 실행되도록 합니다.

원격 쉘 명령어 실행

임시 명령어 실행

Ansible 은 플레이북을 생성하지 않고도 원격 호스트에서 임시 명령어를 실행할 수 있습니다. 이는 빠르고 단발적인 작업이나 테스트 목적으로 유용합니다. 임시 명령어를 실행하려면 다음 구문을 사용하는 ansible 명령줄 도구를 사용할 수 있습니다.

ansible <호스트 패턴> -m <모듈> -a "<모듈 인수>"

예를 들어, webservers 그룹의 모든 호스트에서 uptime 명령어를 실행하려면 다음 명령어를 사용할 수 있습니다.

ansible webservers -m command -a "uptime"

command 모듈 사용

command 모듈은 Ansible 에서 원격 쉘 명령어를 실행하는 데 가장 일반적으로 사용되는 모듈 중 하나입니다. 대상 호스트에서 임의의 명령어를 실행할 수 있습니다. 다음은 command 모듈을 사용하는 플레이북 예제입니다.

- hosts: webservers
  tasks:
    - name: 간단한 명령어 실행
      command: echo "Hello, LabEx!"
      register: command_output
    - name: 명령어 출력 표시
      debug:
        var: command_output.stdout

이 예제에서 command 모듈은 webservers 그룹에서 echo "Hello, LabEx!" 명령어를 실행하는 데 사용됩니다. 명령어의 출력은 command_output 변수에 저장되고, debug 모듈을 사용하여 출력됩니다.

명령어 오류 처리

기본적으로 Ansible 은 원격 명령어가 0 이 아닌 종료 코드를 반환하면 작업을 실패시킵니다. ignore_errors 옵션을 사용하거나 플레이북에서 rc (반환 코드) 변수를 확인하여 명령어 오류를 처리할 수 있습니다. 다음은 예제입니다.

- hosts: webservers
  tasks:
    - name: 실패할 수 있는 명령어 실행
      command: /path/to/command_that_might_fail
      register: command_result
      ignore_errors: yes
    - name: 명령어 결과 확인
      debug:
        msg: "명령어가 {{ command_result.rc }} 반환 코드로 실패했습니다."
      when: command_result.rc != 0

이 예제에서는 ignore_errors 옵션을 사용하여 원격 명령어가 0 이 아닌 종료 코드를 반환하더라도 작업이 실패하지 않도록 합니다. rc 변수를 확인하여 명령어의 반환 코드를 결정하고, 명령어가 실패한 경우 디버그 메시지를 표시합니다.

실제 사용 사례 및 권장 사항

실제 사용 사례

Ansible 을 사용하여 원격 쉘 명령어를 실행하는 것은 다양한 시나리오에서 유용할 수 있습니다. 예를 들어:

  1. 시스템 관리: 패키지 업데이트, 서비스 재시작 또는 시스템 상태 확인과 같은 정기적인 유지 관리 작업 수행.
  2. 애플리케이션 배포: 원격 서버에서 배포 스크립트 또는 명령어를 실행하여 애플리케이션의 새 버전을 배포.
  3. 구성 관리: 구성 파일 조정, 시스템 설정 변경 또는 원격 호스트에서 기능 활성화/비활성화.
  4. 문제 해결: 진단 정보 수집, 시스템 확인 또는 원격 호스트에서 문제 해결 명령어 실행.

권장 사항

이데 mpotent 명령어 사용

원격 쉘 명령어를 실행할 때 명령어가 idempotent 해야 합니다. 즉, 명령어를 여러 번 실행해도 한 번 실행한 것과 동일한 효과를 가져야 합니다. 이는 원격 호스트에서 예기치 않은 변경 사항이나 부작용을 방지하는 데 도움이 됩니다.

원시 명령어 대신 모듈 활용

가능한 경우 원시 쉘 명령어를 실행하는 대신 Ansible 모듈을 사용하십시오. 모듈은 원격 시스템과 상호 작용하는 더 일관되고 안정적인 방법을 제공하며, 종종 오류 처리 및 기타 예외적인 상황을 더 원활하게 처리합니다.

명령어 출력 검증

원격 명령어 실행 후 출력을 검증하여 명령어가 성공적으로 실행되었는지 확인하는 것이 좋습니다. register 키워드를 사용하여 명령어 출력을 캡처한 다음 debug 모듈을 사용하여 검사할 수 있습니다.

조건부 실행 사용

when 절과 같은 Ansible 의 조건부 실행 기능을 활용하여 특정 조건에 따라 명령어를 선택적으로 실행하십시오. 이를 통해 불필요한 명령어 실행을 방지하거나 특정 시나리오를 더 효과적으로 처리하는 데 도움이 됩니다.

Ansible 환경 보안

Ansible 컨트롤 머신과 대상 호스트가 제대로 보안되어 있는지 확인하십시오. 여기에는 SSH 키 관리, 안전한 통신 채널 사용 및 사용자 및 액세스 관리에 대한 권장 사항 준수가 포함됩니다.

플레이북 문서화 및 유지 관리

Ansible 플레이북을 명확하게 문서화하십시오. 이는 주석, 설명 및 사용된 작업 및 명령어에 대한 설명을 포함해야 합니다. 이렇게 하면 시간이 지남에 따라 플레이북을 이해하고 유지 관리하는 데 도움이 됩니다.

요약

Ansible 은 원격 호스트에서 쉘 명령어를 실행하는 프로세스를 단순화하는 다재다능한 도구입니다. Ansible 의 기능을 활용하여 반복적인 작업을 자동화하고, 원격 시스템을 효율적으로 관리하며, 인프라 전반에 걸쳐 일관성을 보장할 수 있습니다. 이 자습서에서는 원격 쉘 명령어 실행을 위해 Ansible 을 효과적으로 사용하는 데 필요한 지식과 기술을 제공하여 DevOps 워크플로우를 향상시키고 원격 시스템의 전반적인 관리를 개선하는 데 도움을 드립니다.