Home OpenStack-Salt Development Documentation

OpenStack-Salt Heat deployment

All-in-one (AIO) deployments are a great way to setup an OpenStack-Salt cloud for:

  • a service development environment
  • an overview of how all of the OpenStack services and roles play together
  • a simple lab deployment for testing

It is possible to run full size proof-of-concept deployment on OpenStack with Heat template, the stack has following requirements for cluster deployment:

  • At least 200GB disk space
  • 70GB RAM

The single-node deployment has following requirements:

  • At least 80GB disk space
  • 16GB RAM

Available Heat templates

We have prepared two generic OpenStack Salt lab templates, OpenStack in single and OpenStack in cluster configuration. Both are deployed by custom parametrized bootstrap script, which sets up Salt master with OpenStack Salt formula ecosystem and example metadata.

Openstack-salt single setup

The openstack_single environment consists of three nodes.

FQDN Role IP
config.openstack.local Salt master node 10.10.10.200
control.openstack.local OpenStack control node 10.10.10.201
compute.openstack.local OpenStack compute node 10.10.10.202

Openstack-salt cluster setup

The openstack_cluster environment consists of six nodes.

FQDN Role IP
config.openstack.local Salt master node 10.10.10.200
control01.openstack.local OpenStack control node 10.10.10.201
control02.openstack.local OpenStack control node 10.10.10.202
control03.openstack.local OpenStack control node 10.10.10.203
compute01.openstack.local OpenStack compute node 10.10.10.211
compute02.openstack.local OpenStack compute node 10.10.10.212

Heat client setup

The preffered way of installing OpenStack clients is isolated Python environment. To creat Python environment and install compatible OpenStack clients, you need to install build tools first.

Ubuntu installation

Install required packages:

$ apt-get install python-dev python-pip python-virtualenv build-essential

Now create and activate virtualenv venv-heat so you can install specific versions of OpenStack clients.

$ virtualenv venv-heat
$ source ./venv-heat/bin/activate

Use requirements.txt from the `OpenStack-Salt heat templates repository`_ to install tested versions of clients into activated environment.

$ pip install -r requirements.txt

The summary of clients for OpenStack. Following clients were tested with Juno and Kilo Openstack versions.

If everything goes right, you should be able to use openstack clients, heat, nova, etc.

Connecting to OpenStack cloud

Setup OpenStack credentials so you can use openstack clients. You can download openrc file from Openstack dashboard and source it or execute following commands with filled credentials:

$ vim ~/openrc

export OS_AUTH_URL=https://<openstack_endpoint>:5000/v2.0
export OS_USERNAME=<username>
export OS_PASSWORD=<password>
export OS_TENANT_NAME=<tenant>

Now source the OpenStack credentials:

$ source openrc

To test your sourced variables:

$ env | grep OS

Some resources required for heat environment deployment.

Get network ID

The public network is needed for setting up both testing heat stacks. The network ID can be found in Openstack Dashboard or by running following command:

$ neutron net-list

Get image ID

Image ID is required to run OpenStack Salt lab templates, Ubuntu 14.04 LTS is required as config_image and image for one of the supported platforms is required as instance_image, used for OpenStack instances. To lookup for actual installed images run:

$ glance image-list

Launching the Heat stack

Download heat templates from this repository.

$ git clone git@github.com:openstack/openstack-salt.git
$ cd doc/source/_static/scripts/

Now you need to customize env files for stacks, see examples in envs directory doc/source/_static/scripts/envs and set required parameters.

Full examples of env files for the two respective stacks:

OpenStack templates generic parameters

public_net_id
name of external network
instance_image
image for OpenStack instances, must correspond with os_distribution
config_image
image for Salt master node, currently only Ubuntu 14.04 supported
key_value
paste your SSH key here
salt_source

salt-master installation source

options:
  • pkg
  • pip
default:
  • pkg
salt_version

salt-master version

options:
  • latest
  • 2015.8.11
  • 2015.8.10
  • 2015.8.9
  • ...
default:
  • latest
formula_source

salt formulas source

options:
  • git
  • pkg
default:
  • git
formula_path

path to formulas

default:
  • /usr/share/salt-formulas
formula_branch

formulas git branch

default:
  • master
reclass_address

reclass git repository

default:
reclass_branch

reclass git branch

default:
  • master
os_version

OpenStack release version

options:
  • kilo
default:
  • kilo
os_distribution

OpenStack nodes distribution

options:
  • ubuntu
  • redhat
default:
  • ubuntu
os_networking

OpenStack networking engine

options:
  • opencontrail
  • neutron
default:
  • opencontrail
os_deployment

OpenStack architecture

options:
  • single
  • cluster
default:
  • single
config_hostname

salt-master hostname

default:
  • config
config_address

salt-master internal IP address

default:
  • 10.10.10.200

OpenStack single specific parameters

config_domain

salt-master domain

default:
  • openstack.local
ctl01_name

OS controller hostname

default:
  • control
cmp01_name

OS compute hostname

default:
  • compute
prx01_name

OS proxy hostname

default:
  • proxy

OpenStack cluster specific parameters

config_domain

salt-master domain

default:
  • openstack-ha.local
ctl01_name

OS controller 1 hostname

default:
  • control01
ctl02_name

OS controller 2 hostname

default:
  • control02
ctl03_name

OS controller 3 hostname

default:
  • control03
cmp01_name

OS compute 1 hostname

default:
  • compute01
cmp02_name

OS compute 2 hostname

default:
  • compute02
prx01_name

OS proxy hostname

default:
  • proxy

openstack_single.hot environment examples

OpenStack Kilo on Ubuntu with OpenContrail networking

/_static/scripts/envs/openstack_single_kilo_ubuntu_opencontrail.env.example

parameters:
  public_net_id: ext-net
  instance_image: trusty-server-cloudimg-amd64
  config_image: trusty-server-cloudimg-amd64
  key_value: public part of your SSH key

OpenStack Kilo on Ubuntu with Neutron DVR networking

/_static/scripts/envs/openstack_single_kilo_ubuntu_neutron.env.example

parameters:
  public_net_id: ext-net
  instance_image: trusty-server-cloudimg-amd64
  config_image: trusty-server-cloudimg-amd64
  key_value: public part of your SSH key
  os_networking: neutron

OpenStack Kilo on CentOS/RHEL with OpenContrail networking

/_static/scripts/envs/openstack_single_kilo_redhat_opencontrail.env.example

parameters:
  public_net_id: ext-net
  instance_image: CentOS-7-x86_64-GenericCloud
  config_image: trusty-server-cloudimg-amd64
  key_value: public part of your SSH key
  os_distribution: redhat

openstack_cluster.hot environment examples

OpenStack Kilo on Ubuntu with OpenContrail networking

/_static/scripts/envs/openstack_cluster_kilo_ubuntu_opencontrail.env.example

parameters:
  public_net_id: ext-net
  instance_image: trusty-server-cloudimg-amd64
  config_image: trusty-server-cloudimg-amd64
  key_value: public part of your SSH key

OpenStack Kilo on CentOS/RHEL with OpenContrail networking

/_static/scripts/envs/openstack_cluster_kilo_ubuntu_opencontrail.env.example

parameters:
  public_net_id: ext-net
  instance_image: trusty-server-cloudimg-amd64
  config_image: trusty-server-cloudimg-amd64
  key_value: public part of your SSH key
$ heat stack-create -e envs/ENV_FILE -f openstack_single.hot
$ heat stack-create -e envs/ENV_FILE -f openstack_cluster.hot

If everything goes right, stack should be ready in a few minutes. You can verify by running following commands:

$ heat stack-list
$ nova list

You should be also able to log in as root to public IP provided by nova list command. When this cluster is deployed, you canlog in to the instances through the Salt master node.

Current state of supported env configurations

ENV configuration Single Status Cluster Status
OS Kilo Ubuntu with OpenContrail Stable Stable
OS Kilo RedHat single with OpenContrail Experimental Experimental
OS Kilo Ubuntu single with Neutron DVR Experimental NONE

OpenStack Heat templates

OpenStack single Heat template

/_static/scripts/openstack_single.hot

heat_template_version: 2013-05-23
description: Base Heat stack with simple OS setup
parameters:
  key_name:
    type: string
    default: openstack_salt_key
  key_value:
    type: string
  salt_source:
    type: string
    default: pkg
  salt_version:
    type: string
    default: latest
  formula_source:
    type: string
    default: git
  formula_path:
    type: string
    default: /usr/share/salt-formulas
  formula_branch:
    type: string
    default: master
  reclass_address:
    type: string
    default: https://github.com/tcpcloud/openstack-salt-model.git
  reclass_branch:
    type: string
    default: master
  os_version:
    type: string
    default: kilo
  os_distribution:
    type: string
    default: ubuntu
  os_networking:
    type: string
    default: opencontrail
  os_deployment:
    type: string
    default: single
  config_hostname:
    type: string
    default: config
  config_domain:
    type: string
    default: openstack.local
  config_address:
    type: string
    default: 10.10.10.200
  ctl01_name:
    type: string
    default: control
  cmp01_name:
    type: string
    default: compute
  prx01_name:
    type: string
    default: proxy
  instance_flavor:
    type: string
    description: Instance type for servers
    default: m1.small
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
  config_image:
    type: string
    description: Image name to use for Salt master.
    default: ubuntu-14-04-x64-1452267252
  instance_image:
    type: string
    description: Image name to use for the servers.
    default: ubuntu-14-04-x64-1452267252
  public_net_id:
    type: string
    description: ID or name of public network for which floating IP addresses will be allocated
  router_name:
    type: string
    description: Name of router to be created
    default: openstack-salt-router
  private_net_name:
    type: string
    description: Name of private network to be created
    default: openstack-salt-net
  private_net_cidr:
    type: string
    description: Private network address (CIDR notation)
    default: 10.10.10.0/24
  instance_flavor_controller:
    type: string
    description: Instance type for controllers
    default: m1.large
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
  instance_flavor_compute:
    type: string
    description: Instance type for compute nodes
    default: m1.medium
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
  instance_flavor_support:
    type: string
    description: Instance type for support nodes (web, monitoring, etc.)
    default: m1.small
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
resources:
  keypair:
    type: OS::Nova::KeyPair
    properties:
      name: { get_param: key_name }
      public_key: { get_param: key_value }
      save_private_key: false
  private_net:
    type: OS::Neutron::Net
    properties:
      name: { get_param: private_net_name }
  private_subnet:
    type: OS::Neutron::Subnet
    properties:
      name: { get_param: private_net_name }
      network_id: { get_resource: private_net }
      cidr: { get_param: private_net_cidr }
  router:
    type: OS::Neutron::Router
    properties:
      name: { get_param: router_name }
      external_gateway_info:
        network: { get_param: public_net_id }
  router_interface:
    type: OS::Neutron::RouterInterface
    properties:
      router_id: { get_resource: router }
      subnet_id: { get_resource: private_subnet }
  security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      name: { get_param: router_name }
      rules:
        - protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
        - protocol: icmp
          remote_ip_prefix: 0.0.0.0/0
  cfg01_floating_ip:
    type: OS::Nova::FloatingIP
    properties:
      pool: { get_param: public_net_id }
  cfg01_floating_ip_association:
    type: OS::Nova::FloatingIPAssociation
    properties:
      floating_ip: { get_resource: cfg01_floating_ip }
      server_id: { get_resource: cfg01_instance }
  cfg01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.200
      security_groups:
        - default
        - { get_resource: security_group }
  cfg01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: config_image }
      flavor: { get_param: instance_flavor }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: config_hostname }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: cfg01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash

            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export FORMULA_SOURCE=$FORMULA_SOURCE
            export FORMULA_PATH=$FORMULA_PATH
            export FORMULA_BRANCH=$FORMULA_BRANCH
            export RECLASS_ADDRESS=$RECLASS_ADDRESS
            export RECLASS_BRANCH=$RECLASS_BRANCH
            export RECLASS_SYSTEM=$RECLASS_SYSTEM
            export CONFIG_HOSTNAME=$CONFIG_HOSTNAME
            export CONFIG_DOMAIN=$CONFIG_DOMAIN
            export CONFIG_HOST=$CONFIG_HOST
            export CONFIG_ADDRESS=$CONFIG_ADDRESS

            BOOTSTRAP
          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $FORMULA_SOURCE: { get_param: formula_source }
            $FORMULA_PATH: { get_param: formula_path }
            $FORMULA_BRANCH: { get_param: formula_branch }
            $RECLASS_ADDRESS: { get_param: reclass_address }
            $RECLASS_BRANCH: { get_param: reclass_branch }
            $RECLASS_SYSTEM: { list_join: [ '_', [ { get_param: os_version }, { get_param: os_distribution }, { get_param: os_networking }, { get_param: os_deployment } ]] }
            $CONFIG_HOSTNAME: { get_param: config_hostname }
            $CONFIG_DOMAIN: { get_param: config_domain }
            $CONFIG_HOST: { list_join: [ '.', [ { get_param: config_hostname }, { get_param: config_domain } ]] }
            $CONFIG_ADDRESS: { get_param: config_address }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-master.sh }
  ctl01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.201
      security_groups:
        - default
        - { get_resource: security_group }
  ctl01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_controller }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: ctl01_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: ctl01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: ctl01_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: ctl01_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }       
  cmp01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.202
      security_groups:
        - default
        - { get_resource: security_group }
  cmp01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_compute }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: cmp01_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: cmp01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: cmp01_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: cmp01_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }
  prx01_floating_ip:
    type: OS::Nova::FloatingIP
    properties:
      pool: { get_param: public_net_id }
  prx01_floating_ip_association:
    type: OS::Nova::FloatingIPAssociation
    properties:
      floating_ip: { get_resource: prx01_floating_ip }
      server_id: { get_resource: prx01_instance }
  prx01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.203
      security_groups:
        - default
        - { get_resource: security_group }
  prx01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_support }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: prx01_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: prx01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: prx01_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: prx01_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }

OpenStack cluster Heat template

/_static/scripts/openstack_cluster.hot

heat_template_version: 2013-05-23
description: Base Heat stack with simple OS setup
parameters:
  key_name:
    type: string
    default: openstack_salt_key
  key_value:
    type: string
  salt_source:
    type: string
    default: pkg
  salt_version:
    type: string
    default: latest
  formula_source:
    type: string
    default: git
  formula_path:
    type: string
    default: /usr/share/salt-formulas
  formula_branch:
    type: string
    default: master
  reclass_address:
    type: string
    default: https://github.com/tcpcloud/openstack-salt-model.git
  reclass_branch:
    type: string
    default: master
  os_version:
    type: string
    default: kilo
  os_distribution:
    type: string
    default: ubuntu
  os_networking:
    type: string
    default: opencontrail
  os_deployment:
    type: string
    default: single
  config_hostname:
    type: string
    default: config
  config_domain:
    type: string
    default: openstack-ha.local
  config_address:
    type: string
    default: 10.10.10.200
  ctl01_name:
    type: string
    default: control01
  ctl02_name:
    type: string
    default: control02
  ctl03_name:
    type: string
    default: control03
  cmp01_name:
    type: string
    default: compute01
  cmp02_name:
    type: string
    default: compute02
  prx01_name:
    type: string
    default: proxy
  cluster_vip_address:
    type: string
    default: 10.10.10.254
  instance_flavor:
    type: string
    description: Instance type for servers
    default: m1.small
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
  config_image:
    type: string
    description: Image name to use for Salt master.
    default: ubuntu-14-04-x64-1452267252
  instance_image:
    type: string
    description: Image name to use for the servers.
    default: ubuntu-14-04-x64-1452267252
  public_net_id:
    type: string
    description: ID or name of public network for which floating IP addresses will be allocated
  router_name:
    type: string
    description: Name of router to be created
    default: openstack-salt-router
  private_net_name:
    type: string
    description: Name of private network to be created
    default: openstack-salt-net
  private_net_cidr:
    type: string
    description: Private network address (CIDR notation)
    default: 10.10.10.0/24
  instance_flavor_controller:
    type: string
    description: Instance type for controllers
    default: m1.large
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
  instance_flavor_compute:
    type: string
    description: Instance type for compute nodes
    default: m1.medium
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
  instance_flavor_support:
    type: string
    description: Instance type for support nodes (web, monitoring, etc.)
    default: m1.small
    constraints:
      - allowed_values: [m1.tiny, m1.small, m1.medium, m1.large]
        description: instance_type must be a valid instance type
resources:
  keypair:
    type: OS::Nova::KeyPair
    properties:
      name: { get_param: key_name }
      public_key: { get_param: key_value }
      save_private_key: false
  private_net:
    type: OS::Neutron::Net
    properties:
      name: { get_param: private_net_name }
  private_subnet:
    type: OS::Neutron::Subnet
    properties:
      name: { get_param: private_net_name }
      network_id: { get_resource: private_net }
      cidr: { get_param: private_net_cidr }
  router:
    type: OS::Neutron::Router
    properties:
      name: { get_param: router_name }
      external_gateway_info:
        network: { get_param: public_net_id }
  router_interface:
    type: OS::Neutron::RouterInterface
    properties:
      router_id: { get_resource: router }
      subnet_id: { get_resource: private_subnet }
  security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      name: { get_param: router_name }
      rules:
        - protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
        - protocol: icmp
          remote_ip_prefix: 0.0.0.0/0
  cfg01_floating_ip:
    type: OS::Nova::FloatingIP
    properties:
      pool: { get_param: public_net_id }
  cfg01_floating_ip_association:
    type: OS::Nova::FloatingIPAssociation
    properties:
      floating_ip: { get_resource: cfg01_floating_ip }
      server_id: { get_resource: cfg01_instance }
  cfg01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.200
      security_groups:
        - default
        - { get_resource: security_group }
  cfg01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: config_image }
      flavor: { get_param: instance_flavor }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: config_hostname }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: cfg01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash

            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export FORMULA_SOURCE=$FORMULA_SOURCE
            export FORMULA_PATH=$FORMULA_PATH
            export FORMULA_BRANCH=$FORMULA_BRANCH
            export RECLASS_ADDRESS=$RECLASS_ADDRESS
            export RECLASS_BRANCH=$RECLASS_BRANCH
            export RECLASS_SYSTEM=$RECLASS_SYSTEM
            export CONFIG_HOSTNAME=$CONFIG_HOSTNAME
            export CONFIG_DOMAIN=$CONFIG_DOMAIN
            export CONFIG_HOST=$CONFIG_HOST
            export CONFIG_ADDRESS=$CONFIG_ADDRESS

            BOOTSTRAP
          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $FORMULA_SOURCE: { get_param: formula_source }
            $FORMULA_PATH: { get_param: formula_path }
            $FORMULA_BRANCH: { get_param: formula_branch }
            $RECLASS_ADDRESS: { get_param: reclass_address }
            $RECLASS_BRANCH: { get_param: reclass_branch }
            $RECLASS_SYSTEM: { list_join: [ '_', [ { get_param: os_version }, { get_param: os_distribution }, { get_param: os_networking }, { get_param: os_deployment } ]] }
            $CONFIG_HOSTNAME: { get_param: config_hostname }
            $CONFIG_DOMAIN: { get_param: config_domain }
            $CONFIG_HOST: { list_join: [ '.', [ { get_param: config_hostname }, { get_param: config_domain } ]] }
            $CONFIG_ADDRESS: { get_param: config_address }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-master.sh }
  ctl01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.201
      allowed_address_pairs:
        - ip_address: { get_param: cluster_vip_address }
      security_groups:
        - default
        - { get_resource: security_group }
  ctl01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_controller }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: ctl01_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: ctl01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: ctl01_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: ctl01_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }       
  ctl02_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.202
      allowed_address_pairs:
        - ip_address: { get_param: cluster_vip_address }
      security_groups:
        - default
        - { get_resource: security_group }
  ctl02_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_controller }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: ctl02_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: ctl02_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: ctl02_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: ctl02_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }
  ctl03_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.203
      allowed_address_pairs:
        - ip_address: { get_param: cluster_vip_address }
      security_groups:
        - default
        - { get_resource: security_group }
  ctl03_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_controller }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: ctl03_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: ctl03_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: ctl03_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: ctl03_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }
  cmp01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.211
      security_groups:
        - default
        - { get_resource: security_group }
  cmp01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_compute }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: cmp01_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: cmp01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: cmp01_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: cmp01_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }
  cmp02_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.212
      security_groups:
        - default
        - { get_resource: security_group }
  cmp02_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_compute }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: cmp02_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: cmp02_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: cmp02_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: cmp02_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }
  prx01_floating_ip:
    type: OS::Nova::FloatingIP
    properties:
      pool: { get_param: public_net_id }
  prx01_floating_ip_association:
    type: OS::Nova::FloatingIPAssociation
    properties:
      floating_ip: { get_resource: prx01_floating_ip }
      server_id: { get_resource: prx01_instance }
  prx01_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - ip_address: 10.10.10.204
      security_groups:
        - default
        - { get_resource: security_group }
  prx01_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: instance_image }
      flavor: { get_param: instance_flavor_support }
      key_name: { get_resource: keypair }
      name: { list_join: [ '.', [ { get_param: prx01_name }, { get_param: config_domain } ]] }
      networks:
      - port: { get_resource: prx01_port }
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #!/bin/bash
            export SALT_SOURCE=$SALT_SOURCE
            export SALT_VERSION=$SALT_VERSION
            export MINION_MASTER=$MINION_MASTER
            export MINION_HOSTNAME=$MINION_HOSTNAME
            export MINION_ID=$MINION_ID

            BOOTSTRAP

          params:
            $SALT_SOURCE: { get_param: salt_source }
            $SALT_VERSION: { get_param: salt_version }
            $MINION_MASTER: { get_param: config_address }
            $MINION_HOSTNAME: { get_param: prx01_name }
            $MINION_ID: { list_join: [ '.', [ { get_param: prx01_name }, { get_param: config_domain } ]] }
            BOOTSTRAP: { get_file: bootstrap/bootstrap-salt-minion.sh }

Openstack-salt testing labs

You can use publicly available labs offered by technology partners.

Testing lab at tcp cloud

Company tcp cloud has provided 100 cores and 400 GB of RAM divided in 5 separate projects, each with quotas set to 20 cores and 80 GB of RAM. Each project is capable of running both single and cluster deployments.

Endpoint URL:
https://cloudempire-api.tcpcloud.eu:35357/v2.0
User Project Domain
openstack_salt_user01 openstack_salt_lab01 default
openstack_salt_user02 openstack_salt_lab02 default
openstack_salt_user03 openstack_salt_lab03 default
openstack_salt_user04 openstack_salt_lab04 default
openstack_salt_user05 openstack_salt_lab05 default

To get the access credentials and full support, visit #openstack-salt IRC channel.