Ansible 설치 · 6 min read · Dec 19, 2025

우분투 20.04에 Ansible 설치 및 구성하는 방법

Ansible은 많은 서버를 제어하는 프로세스를 간소화하도록 설계된 매우 인기 있는 구성 관리 도구입니다. 단일 노드에서 여러 서버를 동시에 제어하고 프로세스를 실행할 수 있습니다.

Ansible은 서버 노드에 설치해야 하는 특별한 소프트웨어가 필요하지 않으며 SSH를 통해 제어할 수 있습니다.

이 가이드에서는 우분투 20.04 서버에 Ansible을 설치하고 구성하는 방법을 배웁니다.

전제 조건

  • OpenSSH 서버가 설치된 두 개 이상의 우분투 20.04 기반 서버 시스템.
  • 서버와 노드 모두 공용 IP 주소를 통해 접근 가능해야 합니다.
  • Ansible 서버에 sudo 권한이 있는 비루트 사용자와 Ansible 클라이언트에 설정된 비밀번호가 있는 루트 사용자.

Ansible 설치

Ansible의 공식 저장소는 이 튜토리얼을 작성할 당시 우분투의 파이썬 라이브러리의 버그로 인해 우분투 20.04를 지원하지 않습니다.

다행히도 우분투에는 우리가 설치할 Ansible 2.9가 포함되어 있습니다. Ansible을 설치하려면 다음 명령을 실행하십시오.

$ sudo apt install ansible -y

설치가 완료되었는지 확인하려면 다음 명령을 실행하십시오.

$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/username/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

인벤토리 파일 설정

여러 호스트에 연결하려면 노드의 세부 정보를 기록할 파일이 필요합니다. 이 파일을 인벤토리 파일이라고 합니다.

제어하려는 서버의 수에 따라 Ansible의 인벤토리 파일은 서버를 그룹 및 하위 그룹으로 정렬할 수 있습니다. 선택한 호스트 또는 그룹에 적용할 사용자 정의 변수를 설정할 수도 있으며, 이는 지침을 전달할 때 추가로 사용할 수 있습니다.

Ansible은 /etc/ansible/hosts에 기본 인벤토리 파일을 제공합니다. Nano 편집기로 열어보세요.

$ sudo nano /etc/ansible/hosts

파일의 맨 아래에 다음 코드를 붙여넣습니다.

[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113

[all:vars]
ansible_python_interpreter=/usr/bin/python3

servers 섹션은 연결하려는 노드 목록을 정의합니다. 여러 그룹으로 서버를 정렬하기 위해 원하는 만큼 그룹을 만들 수 있습니다.

all:vars 그룹은 인벤토리에 있는 모든 호스트에서 ansible_python_interpreter 매개변수를 설정합니다. 이는 Ansible이 최근 우분투 버전에서 제거된 Python 2 대신 Python 3 실행 파일을 사용하도록 보장합니다.

작업이 완료되면 CTRL+X를 눌러 파일을 저장하고 닫은 다음 YENTER를 눌러 변경 사항을 확인합니다.

참고: 원하는 위치에 자신의 인벤토리 파일을 생성할 수도 있으며, Ansible 명령을 실행할 때 -i 매개변수를 사용하여 전달할 수 있습니다.

다음 명령으로 인벤토리 목록을 확인할 수 있습니다.

$ ansible-inventory --list -y
all:
  children:
    servers:
      hosts:
        server1:
          ansible_host: 203.0.113.111
          ansible_python_interpreter: /usr/bin/python3
        server2:
          ansible_host: 203.0.113.112
          ansible_python_interpreter: /usr/bin/python3
        server3:
          ansible_host: 203.0.113.113
          ansible_python_interpreter: /usr/bin/python3
    ungrouped: {}

서버를 그룹 및 하위 그룹으로 조직하기

많은 서버가 있고 일부 서버가 특정 기능을 수행하는 경우 유용한 팁입니다. 예를 들어, 이 방법을 사용하여 웹 서버와 데이터베이스 서버를 별도로 그룹화할 수 있습니다. 호스트를 여러 그룹의 일부로 만들 수도 있습니다. 이를 달성하려면 인벤토리 파일이 다음과 유사해야 합니다.

[webservers]
203.0.113.111
203.0.113.112

[dbservers]
203.0.113.113
server_hostname

[development]
203.0.113.111
203.0.113.113

[production]
203.0.113.112
server_hostname

SSH 키 설정

Ansible이 서버에 연결할 수 있도록 하려면 Ansible 서버와 인벤토리 파일에 지정된 호스트 간에 SSH 키를 구성해야 합니다. 이는 Ansible 클라이언트에 공용 키가 활성화되어 있지 않고 루트 계정이 비밀번호로 활성화되어 있는 경우에만 작동합니다.

Ansible 및 해당 노드에 대한 SSH 키를 생성하고 설정하려면 다음 단계를 따르십시오.

Ansible에 대한 키를 생성합니다.

$ ssh-keygen -t rsa -b 4096 -C "Ansible key"

원격 서버의 계정에 공용 키를 복사합니다. 이를 위해 ssh-copy-id 명령을 사용합니다.

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

그게 전부입니다. 이제 Ansible이 서버와 통신할 수 있어야 합니다.

기존 공용 키가 있는 노드에서 SSH 키 설정

클라이언트에 이미 공용 키가 활성화되어 있는 경우에는 몇 가지 추가 단계를 따라야 합니다. 이를 위해 각 노드 서버에서 Ansible만 접근할 수 있는 새 사용자 계정을 생성해야 합니다. 해당 사용자는 비밀번호 없이 접근할 수 있는 sudo 권한을 가지며, Ansible 서버에서만 접근할 수 있습니다.

ansible 사용자를 생성하려면 다음 명령을 실행하십시오.

$ sudo adduser ansible

강력한 비밀번호를 선택하고 다른 모든 필드는 비워 둡니다.

이제 다음 명령을 통해 이 사용자에 대한 비밀번호 없는 sudo 접근을 구성합니다.

$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible

이제 새 사용자가 추가되고 구성되었으므로 다음 명령을 사용하여 Ansible 서버에서 노드 서버로 SSH 키를 복사할 수 있습니다.

$ ssh-copy-id [email protected]

ansible 사용자에 대한 비밀번호를 입력하라는 메시지가 표시됩니다. 입력하면 SSH 키가 복사됩니다.

다음으로, 노드 서버에서 ansible 사용자에 대한 비밀번호 기반 로그인을 비활성화합니다.

$ sudo usermod -L ansible

이제 노드 서버는 Ansible 서버에서만 접근할 수 있으며, 해당 서버만 공용 키를 가지고 있으므로 노드 서버에서 sudo 권한으로 직접 사용할 수 없습니다. 이러한 단계를 각 노드 서버에 대해 반복해야 합니다. 또한 이 튜토리얼에서는 root 사용자를 ansible 사용자로 교체하십시오.

연결 테스트

인벤토리 파일과 SSH 키를 설정한 후, Ansible이 서버에 연결할 수 있는지 확인해야 합니다.

다음 명령을 입력하여 연결을 확인하십시오. 이 명령은 인벤토리 파일의 모든 서버에 대한 연결을 테스트합니다.

$ ansible all -m ping -u root

이 명령은 Ansible의 ping 모듈을 사용하여 모든 서버에서 연결 테스트를 실행합니다. 다음과 같은 출력이 표시되어야 합니다.

server1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Ansible을 처음 사용하는 경우 모든 서버의 신뢰성을 확인하라는 메시지가 표시됩니다. 프롬프트가 표시되면 yes를 입력하고 ENTER를 눌러 확인합니다.

기본 명령 실행

Ansible을 사용하여 서버에서 몇 가지 기본 명령을 실행해 보겠습니다. 서버에서 명령을 실행하려면 다음 형식을 사용합니다.

$ ansible all -a "command" -u 

디스크 사용량 확인

먼저 모든 서버에서 디스크 사용량을 확인해 보겠습니다.

$ ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0

server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

개별 호스트 및 그룹 타겟팅

지금까지 모든 원격 서버에서 명령을 동시에 실행하고 있었습니다. 하지만 항상 그런 것은 아닙니다. 단일 서버에서 명령을 실행하려면 다음 형식을 사용해야 합니다.

$ ansible server1 -a "uptime" -u root
server1 | CHANGED | rc=0 >>
 21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19

위 명령은 인벤토리 그룹에서 server1의 가동 시간을 확인합니다.

여러 서버를 타겟팅하려면 다음 형식을 사용할 수 있습니다.

$ ansible server1:server2 -m ping -u root

인벤토리 파일에서 그룹 또는 하위 그룹을 직접 타겟팅할 수도 있습니다.

$ ansible groupname -m ping -u 

모든 서버 업데이트

이 튜토리얼에서는 모든 원격 서버가 Debian 또는 Ubuntu OS를 실행하고 있다고 가정합니다.

모든 서버의 소프트웨어를 업데이트하려면 다음 명령을 실행하십시오.

$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root

-m 매개변수는 Ansible이 실행할 모듈을 정의합니다. -a는 관련 모듈에 대한 인수 또는 명령을 나타냅니다. 여기서는 ping 모듈을 사용한 것처럼 Ansible의 apt 모듈을 사용하여 서버를 업데이트합니다. update_cache는 서버에서 APT 캐시를 업데이트하고 upgrade=yes는 Ansible에게 apt upgrade 명령을 실행하도록 지시합니다.

CentOS 서버를 업데이트하려면 aptyum으로 바꾸고 Fedora 서버의 경우 aptdnf로 바꾸면 됩니다.

위에서 문서화된 ansible 사용자를 사용하는 경우, sudo 권한으로 실행하기 위해 ansible 명령을 수정해야 합니다.

$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible

여기서 -K는 권한 상승 비밀번호를 요청합니다. -b는 다른 사용자로 작업을 수행할 수 있도록 하는 become으로 ansible 작업을 실행합니다. 두 변수를 결합하면 ansible이 상승된 sudo 권한으로 실행할 수 있습니다. sudo 권한이 필요한 모든 명령에 대해 이 작업을 수행해야 합니다.

때때로 이러한 업데이트 명령 중 일부는 재부팅이 필요할 수 있으므로 모든 서버를 재부팅하려면 다음 명령을 실행하십시오.

$ ansible all -a "reboot" -u root

이것들은 Ansible을 사용하여 실행할 수 있는 몇 가지 기본 명령에 불과합니다.

결론

우분투 20.04 기반 서버에 Ansible을 설치하고 구성하는 방법에 대한 튜토리얼이 마무리되었습니다. 질문이 있으시면 아래 댓글로 남겨주세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.