---
title: "Kolla Ansible을 통한 OpenStack 배포 자동화 가이드"
description: "Kolla Ansible을 이용해 OpenStack을 자동화 배포하는 방법을 단계별로 안내하며, 사전 준비(필수 패키지 설치, 가상환경 설정, 필수 파일 복사), 설정 파일(globals.yml, passwords.yml) 구성, 핵심 서비스 활성화 옵션 설명, 배포 명령어(bootstrap, prechecks, deploy, pull, reconfigure, post-deploy) 사용법과 흔히 발생하는 오류(uwsgi 미설치, RabbitMQ IP 확인 문제) 해결 방안을 제시한다."
date: "2025-07-17"
last_modified: "2026-08-06T00:36:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "docker"
  - "install"
categories:
  - "📗 Docs"
series:
  - "오픈스택 운영"
canonical_url: "https://blog.pieroot.xyz/kolla-openstack-guide"
markdown_url: "https://blog.pieroot.xyz/kolla-openstack-guide.md"
---

# Kolla Ansible을 통한 OpenStack 배포 자동화 가이드

Kolla Ansible을 이용해 OpenStack을 자동화 배포하는 방법을 단계별로 안내하며, 사전 준비(필수 패키지 설치, 가상환경 설정, 필수 파일 복사), 설정 파일(globals.yml, passwords.yml) 구성, 핵심 서비스 활성화 옵션 설명, 배포 명령어(bootstrap, prechecks, deploy, pull, reconfigure, post-deploy) 사용법과 흔히 발생하는 오류(uwsgi 미설치, RabbitMQ IP 확인 문제) 해결 방안을 제시한다.

연구실에서는 현재 OpenStack을 배포할 때 각 서버에 개별적으로 접속하여 수동으로 설치하는 번거로운 작업을 진행하고 있습니다.

초기에는 학습 목적으로 각 구성요소를 하나씩 구축하며 다양한 설정을 시도해볼 수 있어 유익했습니다. 그러나 노드 수가 증가하고 시스템 업그레이드가 필요해지면서 자동화의 필요성을 절실히 느끼게 되었습니다.

따라서 즉각적인 전환보다는 Kolla Ansible의 작동 방식을 먼저 파악하고, 마이그레이션이 가능하다고 판단되면 단계적으로 전환을 진행할 계획입니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=fae30ae2-25b3-471b-9c09-81e00884790b&kind=s3&pageId=233067c0-15d0-803c-a482-db4d802a5583&source=block&blockId=2e4067c0-15d0-80f3-8045-c0a150d6c9c3)

## 초기 설치(deployment) 

Kolla Ansible은 Python으로 Docker를 제어하여 자동으로 OpenStack을 배포해주는 서비스입니다.

따라서 설치 전 몇 가지 사전 프로그램이 필요합니다.

```shell
sudo apt update
sudo apt install git python3-dev libffi-dev gcc libssl-dev libdbus-glib-1-dev
```

pip 패키지를 설치해야 하는데, 이를 시스템에 직접 설치하거나 아래와 같이 가상환경을 만들어서 설치해도 됩니다.

```shell
sudo apt install python3-venv

# or 

curl -LsSf https://astral.sh/uv/install.sh | sh
```

가상환경을 생성한 후, 해당 환경 내에서 pip를 최신 버전으로 업데이트합니다.

```shell
python3 -m venv /path/to/venv
source 
```

Kolla Ansible을 pip로 설치합니다

```shell
pip install git+https://opendev.org/openstack/kolla-ansible@master
```

OpenStack Git 저장소에서 직접 패키지를 설치하면 최신 버전의 Kolla Ansible을 바로 사용할 수 있습니다.

Kolla Ansible의 기본 디렉토리인 `/etc/kolla`를 생성하고 현재 사용자에게 권한을 부여합니다

```shell
sudo mkdir -p /etc/kolla
sudo chown $USER:$USER /etc/kolla
```

가상환경에 설치하지 않았다면 `/usr/local/share/kolla-ansible`에 위치해 있습니다.

필수 구성 파일인 `globals.yml`과 `password.yml`을 `/etc/kolla` 경로에 복사해야 합니다.

`kolla-ansible/ansible/` 디렉토리에서는 `inventory` 디렉토리만 필요합니다. 이 디렉토리에는 ansible로 설치할 노드와 기본 환경 설정에 대한 정의가 포함되어 있습니다.

```shell
cp -r /path/to/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
cp -r /path/to/venv/share/kolla-ansible/ansible/ /etc/kolla/
```

Kolla를 사용하기 위한 기본 패키지를 설치합니다.

Ansible Galaxy 의존성을 설치합니다. Galaxy는 Docker Hub와 유사하게 다양한 Ansible role(스크립트 묶음)을 관리하고 사용할 수 있는 라이브러리입니다.

```shell
kolla-ansible install-deps
```

이 명령어가 필요한 이유는 기본적으로 ansible 패키지와 기타 필요한 명령어들이 아직 설치되지 않았기 때문입니다.

이 명령어는 필수 의존성을 한 번에 설치해주므로 반드시 실행한 후 다음 단계로 진행해야 합니다.

## 설정

### passwords.yml

kolla ansible에서 사용하는 패스워드는 `/etc/kolla/passwords.yml`에 저장됩니다. 아래 명령어는 이 파일의 모든 값에 대해 난수 패스워드를 생성하여 적용합니다.

```shell
kolla-genpwd
```

![before](https://blog.pieroot.xyz/api/image-proxy?id=a911aee3-e9e1-445c-933a-9c586b9a2c8a&kind=s3&pageId=233067c0-15d0-803c-a482-db4d802a5583&source=block&blockId=010054f7-138d-4a03-acaf-cf226cd3dfd2)

![after](https://blog.pieroot.xyz/api/image-proxy?id=0c3d5d0b-0d71-4999-826e-1607dcb24ec5&kind=s3&pageId=233067c0-15d0-803c-a482-db4d802a5583&source=block&blockId=c1411536-7ea9-4e43-a157-29263d389ade)

이 명령어를 실행할 때 해당 위치에 파일이 없으면 <u>실패</u>하므로 반드시 파일과 내용을 먼저 추가한 후 실행해야 합니다.

### globals.yml

이제 배포할 기본 설정을 globals.yml 파일에서 수정해야 합니다.

- globals.yml

우리 환경에서 사용할 globals.yml 파일입니다.

여기서 필요한 필수 설정들만 간단히 설명하겠습니다.

#### kolla options

```yaml
kolla_base_distro: "ubuntu"
openstack_release: "2025.1"

kolla_internal_vip_address: "172.30.199.154"
kolla_internal_fqdn: "{{ kolla_internal_vip_address }}"

kolla_external_vip_address: "172.30.199.154"
kolla_external_fqdn: "{{ kolla_external_vip_address }}"
```

kolla 배포 시 `base_distro` 설정은 사용할 이미지의 OS를 선택합니다. OpenStack은 OS별로 설정이 다르기 때문에 선택이 필요합니다. 우리는 기존에 Ubuntu 기반으로 설치했기에 이 옵션을 선택했습니다. **- 참고로 Ubuntu는 24.04가 기본**입니다.

`openstack_release`는 OpenStack 버전을 선택하는 설정입니다. 기존에는 `yoga`, `zed`와 같은 이름을 사용했으나, 최근에는 `2024.1`, `2024.2`와 같은 형식으로 명칭이 변경되었습니다.

[OpenStack Releases: OpenStack Releases](https://releases.openstack.org/)

![image](https://blog.pieroot.xyz/api/image-proxy?id=797381be-345c-4682-9438-be80fcab7aa7&kind=s3&pageId=233067c0-15d0-803c-a482-db4d802a5583&source=block&blockId=233067c0-15d0-8095-99ce-dca424825bf7)

현재 `2024.1`과 `2024.2`의 `placement`, `nova`, `nova_ssh`, `nova_compute` 컨테이너에 빌드 오류가 있어 정상 동작하지 않습니다. 따라서 2025.1 이상 또는 이전 버전인 `yoga`, `zed` 버전을 사용하시길 권장합니다. ~~- 알고싶지 않았다.~~

`kolla_internal_vip_address`는 내부 통신용 가상 IP로, OpenStack의 internal endpoint 주소입니다. 반면 `kolla_external_vip_address`는 외부 통신을 위한 public endpoint 주소입니다.

#### neutron options

```yaml
network_interface: "mybr0"
kolla_external_vip_interface: "mybr0"
api_interface: "{{ network_interface }}"

tunnel_interface: "ens4"

network_address_family: "ipv4"

neutron_external_interface: "veth1"

neutron_plugin_agent: "openvswitch"
```

`network_interface`는 내부 API 통신용 인터페이스로, management interface입니다.

이 management 인터페이스에는 반드시 IP가 할당되어 있어야 합니다.

`kolla_external_vip_interface`는 위([kolla options](https://blog.pieroot.xyz/22c2a86843de80499946c978e857263f))에서 설정한 external\_vip가 연결될 인터페이스입니다.

`api_interface`는 `network_interface`와 동일하게 설정할 수도 있고, 다르게 설정할 수도 있습니다. 실제 API 통신에 사용되는 인터페이스를 지정합니다.

`tunnel_interface`는 VXLAN/tunnel용 인터페이스입니다. 별도의 인터페이스를 사용하기 위해 다른 NIC로 설정했습니다. VXLAN 사용 시 이 NIC에 IP가 할당되어 있어야 합니다.

#### nova options

```bash
nova_compute_virt_type: "kvm"

nova_console: "novnc"
```

`nova_compute_virt_type`은 가상머신 에뮬레이터 유형을 지정합니다. OpenStack 내에서 kolla ansible을 배포하는 이중 가상화 환경에서는 `qemu`로 지정하는 것이 좋습니다.

서버가 이중 가상화를 지원하지 않는 경우 `kvm` 설정 시 문제가 발생할 수 있습니다.

`nova_console`은 Horizon 또는 외부 웹에서 접속할 때 사용할 콘솔 중계 도구를 선택합니다.

OpenStack의 기본값인 `novnc`로 설정했습니다.

#### openstack options

```bash
#openstack_logging_debug: "False"

# Enable core OpenStack services. This includes:
# glance, keystone, neutron, nova, heat, and horizon.
enable_openstack_core: "yes"

enable_glance: "{{ enable_openstack_core | bool }}"
enable_haproxy: "yes"
enable_keepalived: "{{ enable_haproxy | bool }}"
enable_keystone: "{{ enable_openstack_core | bool }}"
enable_mariadb: "yes"
enable_memcached: "yes"
enable_neutron: "{{ enable_openstack_core | bool }}"
enable_nova: "{{ enable_openstack_core | bool }}"
enable_rabbitmq: "{{ 'yes' if om_rpc_transport == 'rabbit' or om_notify_transport == 'rabbit' else 'no' }}"


enable_cinder_backup: "no"

enable_fluentd: "yes"
enable_fluentd_systemd: "{{ (enable_fluentd | bool) and (enable_central_logging | bool) }}"

enable_grafana: "yes"

enable_heat: "{{ enable_openstack_core | bool }}"
enable_horizon: "{{ enable_openstack_core | bool }}"

#enable_mariabackup: "no"
enable_neutron_dvr: "yes"
enable_neutron_provider_networks: "yes"

enable_nova_ssh: "yes"
enable_openvswitch: "{{ enable_neutron | bool and neutron_plugin_agent != 'linuxbridge' }}"
enable_placement: "{{ enable_nova | bool or enable_zun | bool }}"
enable_prometheus: "yes"
enable_proxysql: "no"
```

`enable_openstack_core`는 OpenStack의 핵심 서비스들을 일괄적으로 활성화하는 옵션입니다.

기본적으로 `glance`, `keystone`, `neutron`, `nova`, `heat`, `horizon` 서비스들이 활성화됩니다.

단일 노드 배포나 초기 배포 시에는 `proxysql`을 `no`로 설정하고 진행하는 것이 좋습니다.

이는 `mariadb`를 <u>중계해주기 위한 서비스</u>이지만, 포트 충돌 문제가 발생할 수 있기 때문입니다.

## 배포

다음은 각 노드에 기본 필수 파일들을 배포하는 명령어입니다:

```shell
kolla-ansible bootstrap-servers -i ./ansible/inventory/multinode
```

이 명령어는 새로운 노드 추가나 **초기 세팅**에 사용됩니다. 이 초기 세팅에는 Docker 설치가 포함됩니다.

Ansible은 SSH를 통해 각 노드에 접속하여 스크립트를 실행합니다. Kolla는 컨테이너로 동작하기 때문에 이를 위해 각 노드에 Docker나 Podman 같은 컨테이너 엔진이 필요합니다. 모든 노드에 이러한 라이브러리를 미리 설치하는 것은 번거롭기 때문에, 해당 명령어가 필요한 컨테이너 엔진을 자동으로 설치해 줍니다.

- image.png

다음 명령어는 배포할 노드들이 **준비가 되었는지 확인**합니다:

```shell
kolla-ansible prechecks -i ./ansible/inventory/multinode
```

이미 배포했거나 설정했던 노드들은 이 단계를 <u>스킵</u>해도 정상적으로 배포가 가능합니다.

아래 명령어를 통해 OpenStack을 **배포**할 수 있습니다:

```shell
kolla-ansible deploy -i ./ansible/inventory/multinode
```

다음은 Kolla에서 사용할 **이미지를 미리 다운로드**하는 명령어입니다:

```shell
kolla-ansible pull -i ./ansible/inventory/multinode
```

인터넷 속도나 디스크 속도 문제로 타임아웃이 발생할 수 있습니다. Kolla가 사용하는 Docker 이미지를 다운로드하는 데 시간이 오래 걸릴 수 있으므로, 이 명령어로 미리 이미지를 다운로드해 두는 것이 좋습니다.

설정값 변경 후 **다시 배포**할 때는 다음 명령어를 사용합니다:

```shell
kolla-ansible reconfigure -i ./ansible/inventory/multinode
```

설치 중 문제가 발생하거나 정상적으로 완료되지 않았을 경우 이 명령어로 설정을 다시 반영할 수 있습니다.

이 명령어는 deploy의 대체재로도 사용 가능합니다. 문제가 생긴 부분만 수정하는 것이 아니라 그 이후 배포까지 이어서 진행하므로, 한 번 배포 후 이 명령어를 사용해도 좋습니다.

모든 배포가 완료된 후에는 admin 계정 정보와 접속 방법을 확인하기 위해 아래 명령어를 실행합니다:

```shell
kolla-ansible post-deploy -i ./ansible/inventory/multinode
```

## 트러블 슈팅

### exited 127 - 명령어가 존재하지 않음

위 과정 중에 한번 발생했는데, Nova를 배포한 후 초기 연결을 확인하는 작업이 있습니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=30856e8e-9e64-4720-81a3-0722d5b578cb&kind=s3&pageId=233067c0-15d0-803c-a482-db4d802a5583&source=block&blockId=233067c0-15d0-8095-98dc-dd26e88835e0)

![image](https://blog.pieroot.xyz/api/image-proxy?id=4e59263b-a9b7-4cb5-8624-76cda6100dad&kind=s3&pageId=233067c0-15d0-803c-a482-db4d802a5583&source=block&blockId=233067c0-15d0-809a-9800-d9508a03dcb1)

이 과정에서 위 그림과 같이 서로 요청을 보내고 수신하는 과정이 정상적으로 동작하지 않습니다.

```yaml
+ sudo -E kolla_set_configs
INFO:__main__:Loading config file at /var/lib/kolla/config_files/config.json
INFO:__main__:Validating config file
INFO:__main__:Kolla config strategy set to: COPY_ALWAYS
INFO:__main__:Copying service configuration files
INFO:__main__:Copying /var/lib/kolla/config_files/nova.conf to /etc/nova/nova.conf
INFO:__main__:Setting permission for /etc/nova/nova.conf
INFO:__main__:Copying /var/lib/kolla/config_files/nova-api-uwsgi.ini to /etc/nova/nova-api-uwsgi.ini
INFO:__main__:Setting permission for /etc/nova/nova-api-uwsgi.ini
INFO:__main__:Writing out command to execute
INFO:__main__:Setting permission for /var/log/kolla/nova
INFO:__main__:Setting permission for /var/log/kolla/nova/nova-novncproxy.log
INFO:__main__:Setting permission for /var/log/kolla/nova/nova-manage.log
INFO:__main__:Setting permission for /var/log/kolla/nova/nova-scheduler.log
INFO:__main__:Setting permission for /var/log/kolla/nova/nova-conductor.log
++ cat /run_command
+ CMD='uwsgi /etc/nova/nova-api-uwsgi.ini'
+ ARGS=
+ sudo kolla_copy_cacerts
+ [[ ! -n '' ]]
+ . kolla_extend_start
++ [[ ! -d /var/log/kolla/nova ]]
+++ stat -c %a /var/log/kolla/nova
++ [[ 2755 != \7\5\5 ]]
++ chmod 755 /var/log/kolla/nova
++ . /usr/local/bin/kolla_nova_extend_start
+++ [[ -n '' ]]
+++ [[ -n '' ]]
+++ [[ -n '' ]]
+++ [[ -n '' ]]
+++ . /usr/local/bin/kolla_httpd_setup
+++++ whoami
++++ [[ root == \r\o\o\t ]]
++++ [[ ubuntu =~ debian|ubuntu ]]
++++ APACHE_CONFDIR=
++++ . /etc/apache2/envvars
+++++ unset HOME
+++++ '[' '' '!=' '' ']'
+++++ SUFFIX=
+++++ export APACHE_RUN_USER=www-data
+++++ APACHE_RUN_USER=www-data
+++++ export APACHE_RUN_GROUP=www-data
+++++ APACHE_RUN_GROUP=www-data
+++++ export APACHE_PID_FILE=/var/run/apache2/apache2.pid
+++++ APACHE_PID_FILE=/var/run/apache2/apache2.pid
+++++ export APACHE_RUN_DIR=/var/run/apache2
+++++ APACHE_RUN_DIR=/var/run/apache2
+++++ export APACHE_LOCK_DIR=/var/lock/apache2
+++++ APACHE_LOCK_DIR=/var/lock/apache2
+++++ export APACHE_LOG_DIR=/var/log/apache2
+++++ APACHE_LOG_DIR=/var/log/apache2
+++++ export LANG=C
+++++ LANG=C
+++++ export LANG
++++ install -d /var/run/apache2/
++++ rm -rf '/var/run/apache2/*'
++++ [[ ubuntu =~ centos|rocky ]]
++++ LANG=C.UTF-8
++++ [[ ubuntu =~ debian|ubuntu ]]
++++ '[' -f /etc/default/locale ']'
++++ . /etc/default/locale
+++++ LANG=C.UTF-8
+ echo 'Running command: '\''uwsgi /etc/nova/nova-api-uwsgi.ini'\'''
+ exec uwsgi /etc/nova/nova-api-uwsgi.ini
Running command: 'uwsgi /etc/nova/nova-api-uwsgi.ini'
/usr/local/bin/kolla_start: line 24: exec: uwsgi: not found
```

```yaml
+ sudo -E kolla_set_configs
INFO:__main__:Loading config file at /var/lib/kolla/config_files/config.json
INFO:__main__:Validating config file
INFO:__main__:Kolla config strategy set to: COPY_ALWAYS
INFO:__main__:Copying service configuration files
INFO:__main__:Copying /var/lib/kolla/config_files/placement.conf to /etc/placement/placement.conf
INFO:__main__:Setting permission for /etc/placement/placement.conf
INFO:__main__:Copying /var/lib/kolla/config_files/placement-api-uwsgi.ini to /etc/placement/placement-api-uwsgi.ini
INFO:__main__:Setting permission for /etc/placement/placement-api-uwsgi.ini
INFO:__main__:Copying /var/lib/kolla/config_files/migrate-db.rc to /etc/placement/migrate-db.rc
INFO:__main__:Setting permission for /etc/placement/migrate-db.rc
INFO:__main__:Writing out command to execute
INFO:__main__:Setting permission for /var/log/kolla/placement
INFO:__main__:Setting permission for /var/log/kolla/placement/placement-api.log
INFO:__main__:Setting permission for /var/log/kolla/placement/placement-api.log
++ cat /run_command
+ CMD='uwsgi /etc/placement/placement-api-uwsgi.ini'
+ ARGS=
+ sudo kolla_copy_cacerts
+ [[ ! -n '' ]]
+ . kolla_extend_start
++ [[ ! -d /var/log/kolla/placement ]]
+++ stat -c %U:%G /var/log/kolla/placement
++ [[ placement:kolla != \p\l\a\c\e\m\e\n\t\:\k\o\l\l\a ]]
+++ stat -c %a /var/log/kolla/placement
++ [[ 2755 != \7\5\5 ]]
++ chmod 755 /var/log/kolla/placement
++ chmod 644 /var/log/kolla/placement/placement-api.log
++ . /usr/local/bin/kolla_placement_extend_start
+++ [[ -n '' ]]
+++ [[ -n '' ]]
+++ [[ -n '' ]]
+++ . /usr/local/bin/kolla_httpd_setup
+++++ whoami
++++ [[ root == \r\o\o\t ]]
++++ [[ ubuntu =~ debian|ubuntu ]]
++++ APACHE_CONFDIR=
++++ . /etc/apache2/envvars
+++++ unset HOME
+++++ '[' '' '!=' '' ']'
+++++ SUFFIX=
+++++ export APACHE_RUN_USER=www-data
+++++ APACHE_RUN_USER=www-data
+++++ export APACHE_RUN_GROUP=www-data
+++++ APACHE_RUN_GROUP=www-data
+++++ export APACHE_PID_FILE=/var/run/apache2/apache2.pid
+++++ APACHE_PID_FILE=/var/run/apache2/apache2.pid
+++++ export APACHE_RUN_DIR=/var/run/apache2
+++++ APACHE_RUN_DIR=/var/run/apache2
+++++ export APACHE_LOCK_DIR=/var/lock/apache2
+++++ APACHE_LOCK_DIR=/var/lock/apache2
+++++ export APACHE_LOG_DIR=/var/log/apache2
+++++ APACHE_LOG_DIR=/var/log/apache2
+++++ export LANG=C
+++++ LANG=C
+++++ export LANG
++++ install -d /var/run/apache2/
++++ rm -rf '/var/run/apache2/*'
++++ [[ ubuntu =~ centos|rocky ]]
++++ LANG=C.UTF-8
++++ [[ ubuntu =~ debian|ubuntu ]]
++++ '[' -f /etc/default/locale ']'
++++ . /etc/default/locale
+++++ LANG=C.UTF-8
+ echo 'Running command: '\''uwsgi /etc/placement/placement-api-uwsgi.ini'\'''
+ exec uwsgi /etc/placement/placement-api-uwsgi.ini
/usr/local/bin/kolla_start: line 24: exec: uwsgi: not found
Running command: 'uwsgi /etc/placement/placement-api-uwsgi.ini'
```
*nova-api*

위 두 블록은 각각 nova-api와 placement의 로그인데, 둘 다 'uwsgi' 명령어가 없다는 오류가 발생합니다.

이 문제는 2024.1과 2024.2 버전에서 Ubuntu로 Kolla Ansible을 배포할 때 발생하는 고질적인 문제입니다. 2025.1 이상 버전으로 배포하거나 다른 OS를 사용해 보는 것이 좋습니다.

### resolve uniquely to the ip address

- image.png

- image.png

위 그림처럼 에러가 발생하며 실패하는 증상은 RabbitMQ 생성 시 api\_interface에 지정된 IP가 정상적으로 동작하는지 체크하는 부분에서 발생합니다.

각 서버에서 hosts 파일에 명시된 대로 서로 통신 요청을 보낼 때 서버의 hostname으로 요청을 보내면, 두 개 이상의 NIC가 반응하여 문제가 생깁니다.

시스템의 hostname으로 통신해도 좋지만, 이런 경우에는 hostname과 다른 내부 통신용 hostname을 지정하는 것이 좋습니다.

`test-controller-24-04` 대신 `ansible-controller1`과 같은 이름으로 수정하고 모든 노드에 반영해주면 됩니다.

### 결론

위 과정들을 따라하면 어렵지 않게 Kolla Ansible을 통해 OpenStack을 간단하게 배포할 수 있습니다.

다음 포스트에서는 이전에 사용하던 OpenStack 클러스터의 내용물을 백업하고 이전하는 과정을 포스팅하겠습니다.
