Openstack-Ansible
안녕하세요. 이번에는 Openstack에서 Ansible의 장점을 취합하여 구성하는 Openstack-Ansible 에 대해서 알아보고 구성에서 중요한 openstack_user_config YAML 파일을 뜯어보고자 합니다.
1. Openstack

Openstack은 가상자원을 사용하는 IaaS 형태의 클라우드 컴퓨팅 오픈소스 플랫폼입니다.
특징으로 Private / Public 클라우드를 구축하고 관리하는데 용이하며 컴퓨팅, 네트워킹, 스토리지, 인증 등의 각종 서비스들이 모듈화되어 구성이 가능합니다.
가장 큰 장점으로 프라이빗 클라우드를 추가 비용없이 구축하는데 매우 용이한 점을 들 수있고, 모듈의 추가/삭제/변경을 지원하여 최적화하기 좋다는 점 또한 무시할 수 없습니다.
허나, 6개월의 짧은 수명 주기를 가지고 있는 점과 방대한 개별 벤더의 모듈을 적용하기까지 어려우며 노드별로 확장될 경우 상대적으로 안정성이 떨어진다는 단점을 가지고 있습니다.
2. Ansible
![]()
Ansible은 IaC 기반의 네트워크 장비를 포함한 인프라 관리 소프트웨어 도구로, 소프트웨어 프로비저닝, 자동화된 설정 관리, 애플리케이션 배포가 가능한 오픈소스 프로젝트입니다.
특징으로 멱등성, 지속적인 배포, 보안 및 신뢰성에 크게 중점을 두고 있고 사용자 친화적으로 분산 구조 설계가 가능합니다.
장점으로 역시 YAML 언어로 구성이 가능해 쉽고 단순한 구조로 접근성, 가독성이 높으며 변수 기능으로 재사용성을 크게 끌어올릴 수 있다는 점입니다.
그에 따른 단점은 다른 인프라 관리 도구에 비해 덜 강력하다는 점, DSL로 로직을 수행하기 때문에 수시로 문서 확인을 하며 점검해야하는 점, 변수를 사용하나 확인이 어려워 복잡성이 증가되는 점, 개별 파일마다 형식의 일관성이 없는 점, 위 문제들의 복합적인 문제로 성능 속도가 저하되는 점 등이 있습니다.
3. Openstack-Ansible
따라서 Openstack의 개별 노드마다 사용자가 직접 설정함으로 일관성을 해칠 가능성을 배제하며 구축의 난이도를 낮추기 위한 방안으로 Ansible와 결합된 Openstack-Ansible 프로젝트가 Openstack Mitaka (Ver. 13)부터 시작되었습니다.
장점으로는 인프라, 벤더 별로 나누어진 모듈들에 대한 일관성을 상대적으로 높일 수 있고 동일 구성 노드에 대한 추가, 삭제가 매우 용이하다는 점입니다. 또한, 상대적으로 강력한 Openstack으로 인해 Ansible의 단점인 약한 퍼포먼스가 보완됩니다. 빠른 검증을 위한 AIO(All-in One) 툴을 제공하는 것도 특징입니다.
역시 단점 또한 존재하는데, Openstack의 구축 난이도가 상당히 낮춰졌으나 YAML 파일 작성법 등 사용이 어느정도 숙지되어야 하는 점이 있으며, 전반적으로 구성을 사전에 계획적으로 진행해야 합니다. 그에 따라 사용중인 모듈에 대한 추가, 삭제에 어려움이 있을 수 있으며 구성 변경 시 고려해야 하는 사항이 기존에 비해 많습니다.
상기한 단점을 감안하더라도 Openstack-Ansible은 매력적인 도구로 생각되며, 다양한 활용 방안을 생각해 볼 수 있을 것 같습니다.
4. 구성 요소
Openstack-Ansible의 구성 요소는 다음과 같습니다.
필수
– Deployment Host
– Infrastructure Control Plane Host
선택
– Log Server
– Compute Host
– NAS

권장 구성은 위의 그림과 같으며 상황에 맞추어 변동이 있을 수 있습니다.
이 중 가장 기반이 되는 Deployment Host 는 최소 사양이 다음과 같습니다.
HW 요구 사항
– 8 CPU
– 16 GB Memory
– 80GB 이상의 디스크 용량
SW 요구 사항 (Openstack Bobcat / 2023.05 Release 기준)
– SSH
– Python 3.8.x / Python 3.10.x
– locale en.US_UTF8
테스트는 상기 요구 사항을 준수하여 진행되었으나 이번 게시글에서는 별도의 구축 테스트는 설명하지 않으니 참고 부탁드리겠습니다.
동일한 내용은 https://docs.openstack.org/openstack/openstack-ansible 에서 확인 가능합니다.
AIO 설치과정

그림과 같이 Deployment host와 Target hosts를 먼저 준비하고 deployment 설정을 진행한 후
Ansible playbook을 실행하여 Openstack operation 검증하는 과정을 거쳐 Openstack을 사용할 수 있게 합니다.
지원하는 OS는 SUSE, Rocky 8/9(구 CentOS), Ubuntu 20/22.04 를 각각 지원합니다.
개인적으로 테스트를 진행은 Rocky 9을 Deployment Host의 OS로 사용하였으나, 하단에 기술될 YAML 파일에서는 어느 OS를 사용하여도 무방합니다.
5. openstack_user_config
구축 과정 중 필수로 준비되어야 하는 openstack_user_config.yml YAML 파일에 대해 알아보겠습니다.
이 파일에서는 Openstack를 구성하는 모듈에 대해서 구술된 YAML 파일로 최초 Openstack-ansible 설치 시 example 파일로 확인할 수 있습니다.
설명은 구간별로 진행됩니다.
(1) Networks
cidr_networks:
container: 172.29.236.0/22
tunnel: 172.29.240.0/22
used_ips: 172.29.244.0/22
snet: 172.29.248.0/22
used_ips:
- 172.29.236.1
- "172.29.236.100,172.29.236.200"
- "172.29.240.100,172.29.240.200"
- "172.29.244.100,172.29.244.200"
provider_networks:
- network:
group_binds:
- all_containers
- hosts
type: "raw"
container_bridge: "br-mgmt"
container_interface: "eth1"
container_type: "veth"
ip_from_q: "management"
is_management_address: true
- network:
group_binds:
- glance_api
- cinder_api
- cinder_volume
- nova_compute
type: "raw"
container_bridge: "br-storage"
container_type: "veth"
container_interface: "eth2"
container_mtu: "9000"
ip_from_q: "storage"
- network:
group_binds:
- neutron_linuxbridge_agent
container_bridge: "br-vxlan"
container_type: "veth"
container_interface: "eth10"
container_mtu: "9000"
ip_from_q: "tunnel"
type: "vxlan"
range: "1:1000"
net_name: "vxlan"
- network:
group_binds:
- neutron_linuxbridge_agent
container_bridge: "br-vlan"
container_type: "veth"
container_interface: "eth11"
type: "vlan"
range: "101:200,301:400"
net_name: "vlan"
- network:
group_binds:
- neutron_linuxbridge_agent
container_bridge: "br-vlan"
cont ainer_type: "veth"
container_interface: "eth12"
host_bind_override: "eth12"
type: "flat"
net_name: "flat"
nova, neutron의 네트워크 관련 설정으로
각각 사용 용도에 맞추어 Deployment용 네트워크, Storage용 네트워크, 클라우드용 네트워크로 구분되었습니다.
group_bind 항목으로 모듈에 대한 관리가 이루어짐을 확인할 수 있습니다.
(2) Infrastructure
shared-infra_hosts:4
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
repo-infra_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
coordination_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
os-infra_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
identity_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
network_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
network-infra_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
network-agent_hosts:
net1:
ip: 172.29.236.201
net2:
ip: 172.29.236.202
net3:
ip: 172.29.236.203
compute_hosts:
compute1:
ip: 172.29.236.121
storage-infra_hosts:
infra1:
ip: 172.29.236.101
infra2:
ip: 172.29.236.102
infra3:
ip: 172.29.236.103
storage_hosts:
lvm-storage1:
ip: 172.29.236.131
host의 IP 설정 구간입니다. 각각 101~103까지 Infra host에 할당하고 모듈마다 묶어주었습니다.
Deployment host는 별도로 분리하여 작성된 점 확인할 수 있습니다.
(3) Storage
container_vars:
cinder_storage_availability_zone: cinderAZ_1
cinder_default_availability_zone: cinderAZ_1
cinder_backends:
lvm:
volume_backend_name: LVM_iSCSI
volume_driver: cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group: cinder-volumes
iscsi_ip_address: "{{ cinder_storage_address }}"
limit_container_types: cinder_volume
container_vars:
cinder_storage_availability_zone: cinderAZ_2
cinder_default_availability_zone: cinderAZ_1
cinder_backends:
netapp:
volume_backend_name: NETAPP_iSCSI
volume_driver: cinder.volume.drivers.netapp.common.NetAppDriver
netapp_storage_family: ontap_7mode
netapp_storage_protocol: iscsi
netapp_server_hostname: hostname
netapp_server_port: 443
netapp_login: username
netapp_password: password
container_vars:
cinder_storage_availability_zone: cinderAZ_2
cinder_default_availability_zone: cinderAZ_1
cinder_backends:
limit_container_types: cinder_volume
qnap:
volume_backend_name: "QNAP 1 VOLUME"
volume_driver: cinder.volume.drivers.qnap.QnapISCSIDriver
qnap_management_url : http://10.10.10.5:8080
qnap_poolname: "Storage Pool 1"
qnap_storage_protocol: iscsi
qnap_server_port: 8080
iscsi_ip_address: 172.29.244.5
san_login: username
san_password: password
san_thin_provision: True
container_vars:
cinder_storage_availability_zone: cinderAZ_3
cinder_default_availability_zone: cinderAZ_1
cinder_backends:
limit_container_types: cinder_volume
volumes_hdd:
volume_driver: cinder.volume.drivers.rbd.RBDDriver
rbd_pool: volumes_hdd
rbd_ceph_conf: /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot: 'false'
rbd_max_clone_depth: 5
rbd_store_chunk_size: 4
rados_connect_timeout: -1
volume_backend_name: volumes_hdd
rbd_user: "{{ cinder_ceph_client }}"
rbd_secret_uuid: "{{ cinder_ceph_client_uuid }}"
container_vars:
manila_default_share_type: cephfs1
manila_backends:
cephfs1:
driver_handles_share_servers: False
share_backend_name: CEPHFS1
share_driver: manila.share.drivers.cephfs.driver.CephFSDriver
cephfs_conf_path: /etc/ceph/ceph.conf
cephfs_auth_id: manila
cephfs_cluster_name: ceph
cephfs_enable_snapshots: False
filter_function: "share.size >= 0"
goodness_function: "share.size >= 0"
container_vars:
manila_default_share_type: cephfsnfs1
manila_backends:
cephfsnfs1:
driver_handles_share_servers: False
share_backend_name: CEPHFSNFS1
share_driver: manila.share.drivers.cephfs.driver.CephFSDriver
cephfs_ganesha_server_ip: 172.16.24.200
cephfs_protocol_helper_type: NFS
cephfs_conf_path: /etc/ceph/ceph.conf
cephfs_auth_id: manila
filter_function: "share.size >= 0"
goodness_function: "share.size >= 0"
container_vars:
manila_default_share_type: nfs-share1
manila_backends:
nfs-share1:
share_backend_name: NFS_SHARE1
share_driver: manila.share.drivers.lvm.LVMShareDriver
driver_handles_share_servers: False
lvm_share_volume_group: manila-shares
lvm_share_export_ips: 10.1.1.1
filter_function: "share.size >= 0"
goodness_function: "share.size >= 0"
container_vars:
manila_default_share_type: generic
manila_backends:
generic:
share_backend_name: GENERIC
share_driver: manila.share.drivers.generic.GenericShareDriver
driver_handles_share_servers: True
service_instance_flavor_id: 100
service_image_name: manila-service-image
service_instance_user: manila
service_instance_password: manila
interface_driver: manila.network.linux.interface.BridgeInterfaceDriver
filter_function: "share.size >= 0"
goodness_function: "share.size >= 0"
Storage는 가용 가능한 모듈들이 전부 작성되어 있으며, 크게 iscsi , ceph, manila로 구성 가능한 점 확인할 수 있습니다.
이런 스토리지 플랫폼을 cinder와 연동하여 구성하도록 작성되어 있으며, 별도의 가용영역을 구별하여 동시에 선택할 수 있는 점이 눈에 띕니다.
(4) HA Proxy
haproxy_hosts:
lb1:
ip: 172.29.236.100
lb2:
ip: 172.29.236.101
in ``user_variables.yml``:
haproxy_keepalived_external_vip_cidr: 192.168.0.4/25
haproxy_keepalived_internal_vip_cidr: 172.29.236.54/16
haproxy_keepalived_external_interface: br-flat
haproxy_keepalived_internal_interface: br-mgmt
추가로 이중화 구성을 위해 HA Proxy, Keepalived가 기본 구성으로 포함되어 있습니다.
nat 구성에 따라 별도의 interface를 할당 또한 지원합니다.
6. 정리
Ansible의 장점인 다양한 Inventory로 인한 모듈 제공 및 사용성 , Openstack의 높은 호환성과 구현력이 합쳐져 시너지를 낼 수 있게 도와주는 어플리케이션이라고 보여집니다.
물론 Puppet, Chef 등의 다른 관리 시스템 사용, 혹은 100%의 Application Container로 Openstack을 배포하고자 하는 경우, deb나 rpm으로 서비스 배포를 시도하는 경우에는 적합하지 않을 수 있다고 Openstack-Ansible 가이드 문서에서도 명시가 되어 있는 사항임으로 반드시 선택 전 고려를 해야합니다.
허나 LXC Container를 이용하여 상대적으로 적은 코드로 Openstack의 배포를 하고자 하는 경우 Openstack-Ansible은 좋은 선택이 될 수 있을듯 합니다.
다음 글에서는 상기 작성된 YAML 파일을 포함하여 구축 방법에 대해 상세히 알아보고 운영 방법, 활용법에 대해 알아보겠습니다.
감사합니다.



