Skip to content

Commit

Permalink
examples: add OpenStack configuration with networking
Browse files Browse the repository at this point in the history
  • Loading branch information
berendt committed Aug 31, 2015
1 parent a1d0c61 commit f6d6916
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 0 deletions.
63 changes: 63 additions & 0 deletions examples/openstack-with-networking/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Basic OpenStack architecture with networking

This provides a template for running a simple architecture on an OpenStack
cloud.

To simplify the example, this intentionally ignores deploying and
getting your application onto the servers. However, you could do so either via
[provisioners](https://www.terraform.io/docs/provisioners/) and a configuration
management tool, or by pre-baking configured images with
[Packer](http://www.packer.io).

After you run `terraform apply` on this configuration, it will output the
floating IP address assigned to the instance. After your instance started,
this should respond with the default nginx web page.

First set the required environment variables for the OpenStack provider by
sourcing the [credentials file](http://docs.openstack.org/cli-reference/content/cli_openrc.html).

```
source openrc
```

Afterwards run with a command like this:

```
terraform apply \
-var 'external_gateway=c1901f39-f76e-498a-9547-c29ba45f64df' \
-var 'pool=public'
```

To get a list of usable floating IP pools run this command:

```
$ nova floating-ip-pool-list
+--------+
| name |
+--------+
| public |
+--------+
```

To get the UUID of the external gateway run this command:

```
$ neutron net-show FLOATING_IP_POOL
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | c1901f39-f76e-498a-9547-c29ba45f64df |
| mtu | 0 |
| name | public |
| port_security_enabled | True |
| provider:network_type | vxlan |
| provider:physical_network | |
| provider:segmentation_id | 1092 |
| router:external | True |
| shared | False |
| status | ACTIVE |
| subnets | 42b672ae-8d51-4a18-a028-ddae7859ec4c |
| tenant_id | 1bde0a49d2ff44ffb44e6339a8cefe3a |
+---------------------------+--------------------------------------+
```
79 changes: 79 additions & 0 deletions examples/openstack-with-networking/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
resource "openstack_compute_keypair_v2" "terraform" {
name = "terraform"
public_key = "${file("${var.ssh_key_file}.pub")}"
}

resource "openstack_networking_network_v2" "terraform" {
name = "terraform"
admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "terraform" {
name = "terraform"
network_id = "${openstack_networking_network_v2.terraform.id}"
cidr = "10.0.0.0/24"
ip_version = 4
dns_nameservers = ["8.8.8.8","8.8.4.4"]
}

resource "openstack_networking_router_v2" "terraform" {
name = "terraform"
admin_state_up = "true"
external_gateway = "${var.external_gateway}"
}

resource "openstack_networking_router_interface_v2" "terraform" {
router_id = "${openstack_networking_router_v2.terraform.id}"
subnet_id = "${openstack_networking_subnet_v2.terraform.id}"
}

resource "openstack_compute_secgroup_v2" "terraform" {
name = "terraform"
description = "Security group for the Terraform example instances"
rule {
from_port = 22
to_port = 22
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
rule {
from_port = 80
to_port = 80
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
rule {
from_port = -1
to_port = -1
ip_protocol = "icmp"
cidr = "0.0.0.0/0"
}
}

resource "openstack_compute_floatingip_v2" "terraform" {
pool = "${var.pool}"
depends_on = ["openstack_networking_router_interface_v2.terraform"]
}

resource "openstack_compute_instance_v2" "terraform" {
name = "terraform"
image_name = "${var.image}"
flavor_name = "${var.flavor}"
key_pair = "${openstack_compute_keypair_v2.terraform.name}"
security_groups = [ "${openstack_compute_secgroup_v2.terraform.name}" ]
floating_ip = "${openstack_compute_floatingip_v2.terraform.address}"
network {
uuid = "${openstack_networking_network_v2.terraform.id}"
}
provisioner "remote-exec" {
connection {
user = "${var.ssh_user_name}"
key_file = "${var.ssh_key_file}"
}
inline = [
"sudo apt-get -y update",
"sudo apt-get -y install nginx",
"sudo service nginx start"
]
}
}
7 changes: 7 additions & 0 deletions examples/openstack-with-networking/openrc.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash

export OS_AUTH_URL=http://KEYSTONE.ENDPOINT.URL:5000/v2.0
export OS_TENANT_NAME=YOUR_TENANT_NAME
export OS_USERNAME=YOUR_USERNAME
export OS_PASSWORD=YOUR_PASSWORD
export OS_REGION_NAME=YOUR_REGION_NAME
3 changes: 3 additions & 0 deletions examples/openstack-with-networking/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
output "address" {
value = "${openstack_compute_floatingip_v2.terraform.address}"
}
22 changes: 22 additions & 0 deletions examples/openstack-with-networking/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
variable "image" {
default = "Ubuntu 14.04"
}

variable "flavor" {
default = "m1.small"
}

variable "ssh_key_file" {
default = "~/.ssh/id_rsa.terraform"
}

variable "ssh_user_name" {
default = "ubuntu"
}

variable "external_gateway" {
}

variable "pool" {
default = "public"
}

0 comments on commit f6d6916

Please sign in to comment.