Creating an instance with interfaces on different networks with Heat

This tutorial assumes the following:

  • You have created a basic network setup in the Catalyst Cloud.

  • You have installed the OpenStack command line tools and sourced an openrc file, as explained at Installation on Linux and Mac.

  • You have a basic understanding of Heat templates as shown at Command line methods.

Introduction

In this tutorial, you will find out how to create an additional network in a project that already has a private network, and then create a server that has interfaces on the existing private network and the newly created one.

You will need to delve into the mysteries of ‘cloud-init’ a little to achieve this. You’ll also learn how to perform another useful customisation - changing who the default user is for an instance.

Heat template

We need to create a network, and a subnet - and then boot an instance using these plus an already existing private network. Unfortunately, it is not sufficient simply to create networks and provide these to the instance at creation time - only the first network is properly configured if this approach is taken (this could be viewed as a bug). This can be worked around using the the user_data property along with cloud-init:

#
# Deploying a network and a compute instance using Heat
#
heat_template_version: 2013-05-23

description: >
  Deploying new network, subnet and a server using Heat.

parameters:
  key_name:
    type: string
    description: Name of an existing key pair to use for the server
    default: your-user-key
    constraints:
      - custom_constraint: nova.keypair
  flavor:
    type: string
    description: Flavor for the server to be created
    default: c1.c2r2
    constraints:
      - custom_constraint: nova.flavor
  image:
    type: string
    description: Image ID or image name to use for the server
    default: ubuntu-14.04-x86_64
    constraints:
      - custom_constraint: glance.image
  user:
    type: string
    description: Default user
    default: myuser
  net1:
    type: string
    description: (existing) network for the server to be created
    default: private-net1
    constraints:
      - custom_constraint: neutron.network
  net2:
    type: string
    description: (New) network for the server to be created
    default: private-net2
  subnetcidr:
    type: string
    description: Subnet cidr
    default: 10.0.99.0/24
  subnetstart:
    type: string
    description: Start of subnet address
    default: 10.0.99.10
  subnetend:
    type: string
    description: End of subnet address
    default: 10.0.99.100

resources:
  private_net:
    type: OS::Neutron::Net
    properties:
      name: { get_param: net2 }
  private_subnet:
    type: OS::Neutron::Subnet
    properties:
      name: { get_param: net2 }
      network_id: { get_resource: private_net }
      cidr: { get_param: subnetcidr }
      allocation_pools:
        - start: { get_param: subnetstart }
          end: { get_param:  subnetend }

  server:
    type: OS::Nova::Server
    properties:
      name: server1
      key_name: { get_param: key_name }
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - network: {get_param: net1}
        - network: {get_resource: private_net}
      user_data:
        str_replace:
          template: |
            #cloud-config
            bootcmd:
             - "ifdir='/etc/network/interfaces.d'; for iface in $(ip -o link | cut -d: -f2 | tr -d ' ' | grep ^eth); do if [ ! -e ${ifdir}'/'${iface}'.cfg' ]; then echo 'Creating iface file for '${iface}; echo 'auto '${iface}'\niface '${iface}' inet dhcp\n' > $ifdir'/'$iface'.cfg'; ifup ${iface}; fi; done"
            runcmd:
             - "echo 'Complete' > /var/log/cloud-init-complete.txt"
            system_info:
              default_user:
                name: $USER
                shell: /bin/bash
          params:
           $USER: {get_param: user}
      user_data_format: RAW

outputs:
  server_networks:
    description: The networks of the deployed server
    value: { get_attr: [server, networks] }