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는 권한 상승 비밀번호를 요청합니다. -bbecome으로 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, passwordgroup 변수를 사용합니다. 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을 설치하고 구성하는 튜토리얼이 마무리되었습니다. 질문이 있으시면 아래 댓글에 남겨주세요.

Share: X/Twitter LinkedIn

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

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