소개
Ansible 은 원격 시스템을 손쉽게 관리하고 구성할 수 있는 강력한 인프라 자동화 도구입니다. 이 튜토리얼에서는 Ansible 을 사용하여 원격 호스트에서 쉘 명령어를 실행하는 방법을 배우고, 원격 시스템 관리를 효율화하기 위한 실용적인 사용 사례와 최선의 방법을 살펴볼 것입니다.
Ansible 은 원격 시스템을 손쉽게 관리하고 구성할 수 있는 강력한 인프라 자동화 도구입니다. 이 튜토리얼에서는 Ansible 을 사용하여 원격 호스트에서 쉘 명령어를 실행하는 방법을 배우고, 원격 시스템 관리를 효율화하기 위한 실용적인 사용 사례와 최선의 방법을 살펴볼 것입니다.
Ansible 은 인프라를 코드로 관리할 수 있도록 지원하는 오픈소스 자동화 도구입니다. 간편하고 강력하며 에이전트리스 (agentless) 방식으로 SSH 를 통해 원격 시스템을 관리 및 구성하도록 설계되었습니다. 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.com과 webserver2.example.com 두 개의 웹 서버를 정의하고 webservers 그룹 아래에 그룹화합니다.
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 을 사용하여 원격 쉘 명령어를 실행하는 것은 다양한 시나리오에서 유용할 수 있습니다. 예를 들어:
원격 쉘 명령어를 실행할 때 명령어가 idempotent 해야 합니다. 즉, 명령어를 여러 번 실행해도 한 번 실행한 것과 동일한 효과를 가져야 합니다. 이는 원격 호스트에서 예기치 않은 변경 사항이나 부작용을 방지하는 데 도움이 됩니다.
가능한 경우 원시 쉘 명령어를 실행하는 대신 Ansible 모듈을 사용하십시오. 모듈은 원격 시스템과 상호 작용하는 더 일관되고 안정적인 방법을 제공하며, 종종 오류 처리 및 기타 예외적인 상황을 더 원활하게 처리합니다.
원격 명령어 실행 후 출력을 검증하여 명령어가 성공적으로 실행되었는지 확인하는 것이 좋습니다. register 키워드를 사용하여 명령어 출력을 캡처한 다음 debug 모듈을 사용하여 검사할 수 있습니다.
when 절과 같은 Ansible 의 조건부 실행 기능을 활용하여 특정 조건에 따라 명령어를 선택적으로 실행하십시오. 이를 통해 불필요한 명령어 실행을 방지하거나 특정 시나리오를 더 효과적으로 처리하는 데 도움이 됩니다.
Ansible 컨트롤 머신과 대상 호스트가 제대로 보안되어 있는지 확인하십시오. 여기에는 SSH 키 관리, 안전한 통신 채널 사용 및 사용자 및 액세스 관리에 대한 권장 사항 준수가 포함됩니다.
Ansible 플레이북을 명확하게 문서화하십시오. 이는 주석, 설명 및 사용된 작업 및 명령어에 대한 설명을 포함해야 합니다. 이렇게 하면 시간이 지남에 따라 플레이북을 이해하고 유지 관리하는 데 도움이 됩니다.
Ansible 은 원격 호스트에서 쉘 명령어를 실행하는 프로세스를 단순화하는 다재다능한 도구입니다. Ansible 의 기능을 활용하여 반복적인 작업을 자동화하고, 원격 시스템을 효율적으로 관리하며, 인프라 전반에 걸쳐 일관성을 보장할 수 있습니다. 이 자습서에서는 원격 쉘 명령어 실행을 위해 Ansible 을 효과적으로 사용하는 데 필요한 지식과 기술을 제공하여 DevOps 워크플로우를 향상시키고 원격 시스템의 전반적인 관리를 개선하는 데 도움을 드립니다.