This is how to run a single-node OpenStack cluster using the RDO project’s packstack installation utility. I packed everything into a Vagrantfile so it can easily be redeployed. Huge credit goes to codingpackets.com for providing the answers.cfg and network requirements. I don’t honestly know yet why the network requirements are such; I just know this works.

In a new directory, create a Vagrantfile containing:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.define "rdo" do |node|
    node.vm.hostname = "rdo.localdomain"
    node.vm.box = "centos/7"
    node.vm.synced_folder ".", "/vagrant", disabled: true
    node.ssh.insert_key = false

    node.vm.provider :libvirt do |domain|
      domain.memory = 2048
      domain.cpus = 2
    end

    node.vm.network :private_network, :ip => "10.254.254.100",
      :libvirt__network_name => "os-data",
      :libvirt__forward_mode => "none",
      :libvirt__netmask => "255.255.255.0",
      :dhcp_enabled => false

    node.vm.network :private_network, :ip => "169.254.169.254",
      :libvirt__network_name => "os-mgmt",
      :libvirt__forward_mode => "none",
      :libvirt__netmask => "255.255.255.255",
      :dhcp_enabled => false

    node.vm.provision :file, source: "./answers.cfg", destination: "/home/vagrant/answers.cfg"

    node.vm.provision :shell, inline: <<-SHELL
      systemctl disable --now firewalld
      systemctl disable --now NetworkManager
      systemctl enable  --now network
      
      yum -y install centos-release-openstack-stein
      yum -y update
      yum -y install openstack-packstack

      packstack --answer-file=/home/vagrant/answers.cfg
    SHELL
  end
end

Next, create answers.cfg in the same directory as your Vagrantfile with contents:

# answers.cfg
[general]

# Generic config options
CONFIG_UNSUPPORTED=n
CONFIG_DEBUG_MODE=n
CONFIG_PROVISION_DEMO=n

# Default password to be used everywhere
CONFIG_DEFAULT_PASSWORD=openstack

#Install the following services
CONFIG_MARIADB_INSTALL=y
CONFIG_GLANCE_INSTALL=y
CONFIG_NOVA_INSTALL=y
CONFIG_NEUTRON_INSTALL=y
CONFIG_HORIZON_INSTALL=y
CONFIG_CLIENT_INSTALL=y

# Configure networking
EXCLUDE_SERVERS=
CONFIG_NTP_SERVERS=
CONFIG_CONTROLLER_HOST=10.254.254.100
CONFIG_COMPUTE_HOSTS=10.254.254.100
CONFIG_NETWORK_HOSTS=10.254.254.100
CONFIG_MARIADB_HOST=10.254.254.100
CONFIG_AMQP_HOST=10.254.254.100
CONFIG_STORAGE_HOST=10.254.254.100
CONFIG_SAHARA_HOST=10.254.254.100
CONFIG_KEYSTONE_LDAP_URL=ldap://10.254.254.100
CONFIG_MONGODB_HOST=10.254.254.100
CONFIG_REDIS_HOST=10.254.254.100

# Configure Neutron
CONFIG_NEUTRON_L3_EXT_BRIDGE=provider
CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch
CONFIG_NEUTRON_ML2_VLAN_RANGES=
CONFIG_NEUTRON_L2_AGENT=openvswitch
CONFIG_NEUTRON_ML2_TYPE_DRIVERS=local,flat
CONFIG_NEUTRON_ML2_FLAT_NETWORKS=*
CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES=local
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-ex
CONFIG_NEUTRON_OVS_BRIDGE_IFACES=br-ex:eth2

#Do not install the following services
CONFIG_CINDER_INSTALL=n
CONFIG_MANILA_INSTALL=n
CONFIG_SWIFT_INSTALL=n
CONFIG_CEILOMETER_INSTALL=n
CONFIG_HEAT_INSTALL=n
CONFIG_SAHARA_INSTALL=n
CONFIG_TROVE_INSTALL=n
CONFIG_IRONIC_INSTALL=n
CONFIG_NAGIOS_INSTALL=n
CONFIG_VMWARE_BACKEND=n

I found that the vagrant-libvirt provider that shipped with my distribution (Fedora) caused some problems with creating libvirt networks. The solution was to install the vagrant-libvirt plugin directly with vagrant:

$ vagrant plugin install vagrant-libvirt

Next, run vagrant up and wait!