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:
HOT template sample:
1. Define the network ID parameters:
private_net:
type: string
default: "<default private network id>"
description: Id of the private network for the compute server
private_subnet:
type: string
default: "<default private subnet id>"
description: Id of the private sub network for the compute server
public_net:
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
external_access:
type: AWS::EC2::SecurityGroup
properties:
GroupDescription: Enable access to the application and SSH access
SecurityGroupIngress: [
{IpProtocol: tcp, FromPort: {get_param: port}, ToPort: {get_param: port},
CidrIp: "0.0.0.0/0"},
{IpProtocol: tcp, FromPort: "8080", ToPort: "8080",
CidrIp: "0.0.0.0/0"},
{IpProtocol: icmp, FromPort: "-1", ToPort: "-1",
CidrIp: "0.0.0.0/0"}]
public_port:
type: OS::Neutron::Port
properties:
network_id: { get_param: private_net }
fixed_ips:
- subnet_id: { get_param: private_subnet }
security_groups:
- {get_resource: external_access}
floating_ip:
type: OS::Neutron::FloatingIP
properties:
floating_network_id: { get_param: public_net }
port_id: { get_resource: public_port }
3. Associate the port to your VM instance:
windows_instance:
type: OS::Nova::Server
properties:
networks:
- 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" } ],
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
HOT template sample:
1. Define the network ID parameters:
private_net:
type: string
default: "<default private network id>"
description: Id of the private network for the compute server
private_subnet:
type: string
default: "<default private subnet id>"
description: Id of the private sub network for the compute server
public_net:
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
external_access:
type: AWS::EC2::SecurityGroup
properties:
GroupDescription: Enable access to the application and SSH access
SecurityGroupIngress: [
{IpProtocol: tcp, FromPort: {get_param: port}, ToPort: {get_param: port},
CidrIp: "0.0.0.0/0"},
{IpProtocol: tcp, FromPort: "8080", ToPort: "8080",
CidrIp: "0.0.0.0/0"},
{IpProtocol: icmp, FromPort: "-1", ToPort: "-1",
CidrIp: "0.0.0.0/0"}]
public_port:
type: OS::Neutron::Port
properties:
network_id: { get_param: private_net }
fixed_ips:
- subnet_id: { get_param: private_subnet }
security_groups:
- {get_resource: external_access}
floating_ip:
type: OS::Neutron::FloatingIP
properties:
floating_network_id: { get_param: public_net }
port_id: { get_resource: public_port }
3. Associate the port to your VM instance:
windows_instance:
type: OS::Nova::Server
properties:
networks:
- 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" } ],
Comments
Post a Comment