Ansible 설치 · 9 min read · Dec 20, 2025
우분투 22.04에 Ansible 설치 및 구성하는 방법

Ansible은 많은 서버를 제어하는 과정을 간소화하기 위해 설계된 매우 인기 있는 구성 관리 도구입니다. 단일 명령이나 파일로 새로운 서버를 설정하고 애플리케이션을 설치하는 과정을 자동화할 수 있습니다. 단일 노드에서 여러 서버를 동시에 제어하고 프로세스를 실행할 수 있습니다. Ansible은 서버 노드에 설치해야 하는 특별한 소프트웨어가 필요하지 않으며 SSH를 통해 제어할 수 있습니다.
이 가이드에서는 우분투 22.04 서버에 Ansible을 설치하고 구성하는 방법을 배웁니다.
전제 조건
- OpenSSH 서버가 설치된 우분투 22.04를 실행하는 두 개 이상의 서버 시스템.
- 서버와 노드 모두 공용 IP 주소를 통해 접근 가능해야 합니다.
- Ansible 서버에 sudo 권한이 있는 비루트 사용자와 Ansible 클라이언트에 비밀번호가 설정된 루트 사용자가 있어야 합니다.
1단계 - Ansible 설치
Ansible의 공식 저장소를 사용하여 최신 버전을 설치합니다. 서버에 Ansible의 공식 저장소를 추가합니다.
$ sudo add-apt-repository ppa:ansible/ansible
다행히도 우분투에는 우리가 설치할 Ansible 2.9가 포함되어 있습니다. 다음 명령을 실행하여 Ansible을 설치합니다.
$ sudo apt install ansible -y
다음 명령을 실행하여 설치를 테스트합니다.
$ ansible --version
ansible [core 2.13.3rc1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/navjot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/navjot/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
jinja version = 3.0.3
libyaml = True
Ansible bash 완성 지원을 설정하기 위해 python3-argcomplete 패키지를 설치하고 활성화합니다.
$ sudo apt install python3-argcomplete
$ sudo activate-global-python-argcomplete3
이제 Tab 키를 눌러 bash 셸의 옵션 목록을 가져올 수 있습니다.
2단계 - 인벤토리 파일 설정
여러 호스트에 연결할 수 있으려면 노드의 세부 정보를 기록할 파일이 필요합니다. 이 파일을 인벤토리 파일이라고 합니다.
제어하려는 서버 수에 따라 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를 눌러 파일을 저장하고 변경 사항을 확인하라는 메시지가 표시되면 Y를 입력합니다.
참고: 원하는 위치에 인벤토리 파일을 생성할 수도 있으며, 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
3단계 - 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 사용자로 교체해야 합니다.
4단계 - 연결 테스트
인벤토리 파일과 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를 눌러 확인합니다.
5단계 - 기본 명령 실행
Ansible을 사용하여 서버에서 몇 가지 기본 명령을 실행해 보겠습니다. 서버에서 명령을 실행하려면 다음 형식을 사용합니다.
$ ansible all -a "command" -u
디스크 사용량 확인
먼저 모든 서버에서 디스크 사용량을 확인해 보겠습니다.
$ ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
tmpfs 198M 972K 197M 1% /run
/dev/sda2 50G 3.9G 44G 9% /
tmpfs 989M 0 989M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 198M 4.0K 198M 1% /run/user/1000
server2 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
tmpfs 198M 922K 197M 1% /run
/dev/sda2 50G 4.9G 43G 10% /
tmpfs 989M 0 989M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 198M 4.0K 198M 1% /run/user/1000
개별 호스트 및 그룹 타겟팅
지금까지 모든 원격 서버에서 명령을 실행하고 있었습니다. 그러나 항상 그런 것은 아닙니다. 단일 서버에서 명령을 실행하려면 다음 형식을 사용해야 합니다.
$ 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 명령을 실행하도록 지시합니다.
위에서 문서화한 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을 사용하여 실행할 수 있는 기본 명령 중 일부에 불과합니다.
6단계 - 플레이북 소개
위의 명령은 일회성 작업을 실행할 수 있지만 여러 서버를 설정하거나 여러 서버에서 동일한 명령 시퀀스를 실행하려면 플레이북을 설정해야 합니다. 플레이북은 YAML로 작성된 파일로, 애플리케이션 및 서비스를 설정하기 위한 작업 시퀀스를 자동화하는 지침을 포함합니다.
이제 Nginx를 설치하고 Ansible 노드에 HTML 페이지를 설정하는 플레이북을 생성하겠습니다. 홈 디렉토리에 Ansible용 디렉토리를 만듭니다.
$ mkdir ~/ansible
플레이북 파일을 생성하고 편집을 위해 엽니다.
$ cd ~/ansible
$ nano testplaybook.yml
플레이북은 YAML 형식을 사용하여 하나 이상의 플레이를 정의합니다. 플레이는 프로세스를 자동화하기 위해 정렬된 작업 집합입니다. 플레이는 YAML 목록으로 정의됩니다.
플레이를 정의하는 첫 번째 단계는 hosts: all 지시문을 사용하여 대상 호스트를 결정하는 것입니다. become 지시문은 다음 작업이 슈퍼 사용자에 의해 실행되어야 함을 나타냅니다.
세 가지 작업을 정의할 것입니다: 하나는 사용자를 추가하고, 하나는 모든 패키지를 업그레이드하며, 마지막 하나는 Nginx 서버를 설치합니다. 플레이북의 vars 섹션은 사용자 정의 변수를 정의하는 데 사용됩니다. 추가할 사용자에 대한 변수와 설치해야 할 패키지의 상태를 정의하는 두 번째 변수를 정의합니다. 변수를 사용하려면 변수 이름을 두 개의 중괄호로 묶어야 합니다.
ansible.builtin.user 모듈은 sudo 권한이 있는 새 사용자를 추가하는 데 사용됩니다. 사용자를 추가하기 위해 name, password 및 group 변수를 사용합니다. group 변수는 사용자에게 슈퍼 사용자 권한을 부여하기 위해 sudo로 설정됩니다. 플레이북 파일에 평문 비밀번호를 넣을 수 없으므로 SHA 해시된 비밀을 추가할 것입니다. 이를 위해 whois 패키지를 설치하기 위해 다음 명령을 실행합니다.
$ sudo apt install whois
해시된 비밀번호를 생성합니다. 일반적인 비밀번호를 입력하라는 메시지가 표시되며, 이에 대한 해시 문자열이 제공됩니다. 플레이북 파일에서 사용할 해시 키를 기록해 두십시오.
$ mkpasswd --method=sha-512
Password:
$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1
update_cache 지시문은 시스템의 저장소 목록을 업데이트하는 데 사용되며, 이는 apt update 명령과 유사합니다. upgrade: dist 지시문은 Ansible에게 시스템 업그레이드를 수행하도록 지시합니다. 세 번째 작업은 최신 버전의 Nginx 서버를 설치하는 것입니다.
우리가 논의한 정보를 바탕으로 다음 코드를 파일에 붙여넣습니다. password 변수의 값으로 얻은 해시 키를 붙여넣습니다.
---
- name: Test playbook
hosts: all
become: true
vars:
state: latest
user: navjot
tasks:
- name: Add the user {{ user }}
ansible.builtin.user:
name: "{{ user }}"
password: '$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1'
group: sudo
- name: Upgrade all apt packages
apt:
update_cache: yes
upgrade: dist
- name: Install the {{ state }} of package "nginx"
apt:
name: "nginx"
state: "{{ state }}"
Ctrl + X를 눌러 파일을 저장하고 변경 사항을 확인하라는 메시지가 표시되면 Y를 입력합니다.
플레이북을 실행하려면 다음 명령을 실행합니다. --ask-become-pass 플래그는 권한 상승 작업을 수행하기 위해 루트 비밀번호를 요청합니다.
$ ansible-playbook testplaybook.yml --ask-become-pass
다음과 같은 출력을 받게 됩니다.
BECOME password:
PLAY [Test playbook] *************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [server1]
ok: [server2]
ok: [server3]
TASK [Add the user casablanca] *************************************************************************************
changed: [server3]
changed: [server2]
changed: [server1]
TASK [Upgrade all apt packages] ************************************************************************************
changed: [server1]
changed: [server2]
changed: [server3]
TASK [Install the latest of package "nginx"] ***********************************************************************
changed: [server3]
changed: [server2]
changed: [server1]
PLAY RECAP ***********************************************************************************************************
server1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server3 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
이것은 플레이북이 성공적으로 실행되었음을 확인합니다.
사용자 정의 인벤토리 파일을 사용하는 경우 명령에 파일의 위치를 포함해야 합니다.
$ ansible-playbook -i /etc/ansible/custominventory testplaybook.yml --ask-become-pass
결론
이로써 우분투 22.04 서버에 Ansible을 설치하고 구성하는 튜토리얼이 마무리되었습니다. 질문이 있으시면 아래 댓글에 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.