Monday, September 1, 2014

OpenStack : Assign floating IP using heat template

Creating Yaml templates that assign floating IPs to your instances being spawned can be a bit tricky.Let us look at a scenario where we need to spin up a VM, assign a floating IP from a pool and make reference to this floating IP in your userdata as well. We will make use of the network ID of the internal and external network, as well as the Subnet ID of the internal network

The logical workflow is as follows:

  •  Create a port resource using internal network and internal subnet IDs
  • Create a floating IP resource , referring to the external network ID
  •  Associate the floating IP to the port
  •   In the server resource being created, associate the port resource
  Now we will see how this can be implemented using both HOT and AWS template formats

HOT template  sample:

1. Define the network ID parameters:

    type: string
    default: "<default private network id>"
    description: Id of the private network for the compute server
    type: string
    default: "<default private subnet id>"
    description: Id of the private sub network for the compute server
    type: string
    default: "<default external network id>"
    description: Id of the public network for the compute server

You can get the ID of the networks and subnet from the Openstack UI or using command line

2. Create the resources:

Define a security group,Neutron port, floating IP and associate the floating IP

    type: AWS::EC2::SecurityGroup
      GroupDescription: Enable access to the application and SSH access
      SecurityGroupIngress: [
        {IpProtocol: tcp, FromPort: {get_param: port}, ToPort: {get_param: port},
         CidrIp: ""},
        {IpProtocol: tcp, FromPort: "8080", ToPort: "8080",
         CidrIp: ""},
        {IpProtocol: icmp, FromPort: "-1", ToPort: "-1",
         CidrIp: ""}]

    type: OS::Neutron::Port
      network_id: { get_param: private_net }
      - subnet_id: { get_param: private_subnet }
      - {get_resource: external_access}

    type: OS::Neutron::FloatingIP
      floating_network_id: { get_param: public_net }
      port_id: { get_resource: public_port }

3. Associate the port to your VM instance:

    type: OS::Nova::Server
        - port: { get_resource: public_port }

AWS template  sample:

Almost same as hot template logic, just that we are not defining the security groups here

1. Define the network ID parameters:

    "external_network" : {
      "Default": "<default external network id>",
      "Description" : "UUID of an existing external network",
      "Type" : "String"
    "internal_network" : {
      "Default": "<default private network id>"",
      "Description" : "UUID of an existing internal network",
      "Type" : "String"
    "internal_subnet" : {
      "Default": "<default private subnet id>",
      "Description" : "UUID of an existing internal subnet",
      "Type" : "String"

2. Create the resources:

    "port_floating": {
      "Type": "OS::Neutron::Port",
      "Properties": {
        "network_id": { "Ref" : "internal_network" },
        "fixed_ips": [
          {"subnet_id": { "Ref" : "internal_subnet" }

    "floating_ip": {
      "Type": "OS::Neutron::FloatingIP",
      "Properties": {
        "floating_network_id": { "Ref" : "external_network" }
    "floating_ip_assoc": {
      "Type": "OS::Neutron::FloatingIPAssociation",
      "Properties": {
        "floatingip_id": { "Ref" : "floating_ip" },
        "port_id": { "Ref" : "port_floating" }

3. Associate the port to your VM instance:

    "WebServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "NetworkInterfaces" : [ { "Ref" : "port_floating" } ],

No comments:

Post a Comment