From 0bc21a928d17ff5ef5729390976384c95bffe7fd Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 13 Oct 2014 22:18:45 -0700 Subject: [PATCH] website: move all examples into the GitHub repo --- examples/aws-count/README.md | 10 +++ examples/aws-count/main.tf | 30 +++++++ examples/aws-count/outputs.tf | 3 + examples/aws-count/variables.tf | 14 ++++ examples/aws-two-tier/README.md | 18 +++++ examples/consul/README.md | 49 ++++++++++++ examples/consul/main.tf | 43 ++++++++++ examples/consul/variables.tf | 14 ++++ examples/cross-provider/README.md | 11 +++ examples/cross-provider/main.tf | 26 +++++++ examples/cross-provider/outputs.tf | 3 + examples/cross-provider/variables.tf | 3 + .../intro/examples/consul.html.markdown | 78 +------------------ website/source/intro/examples/count.markdown | 68 +--------------- .../intro/examples/cross-provider.markdown | 67 +--------------- 15 files changed, 234 insertions(+), 203 deletions(-) create mode 100644 examples/aws-count/README.md create mode 100644 examples/aws-count/main.tf create mode 100644 examples/aws-count/outputs.tf create mode 100644 examples/aws-count/variables.tf create mode 100644 examples/aws-two-tier/README.md create mode 100644 examples/consul/README.md create mode 100644 examples/consul/main.tf create mode 100644 examples/consul/variables.tf create mode 100644 examples/cross-provider/README.md create mode 100644 examples/cross-provider/main.tf create mode 100644 examples/cross-provider/outputs.tf create mode 100644 examples/cross-provider/variables.tf diff --git a/examples/aws-count/README.md b/examples/aws-count/README.md new file mode 100644 index 000000000..a2703f59d --- /dev/null +++ b/examples/aws-count/README.md @@ -0,0 +1,10 @@ +# Count Example + +The count parameter on resources can simplify configurations +and let you scale resources by simply incrementing a number. + +Additionally, variables can be used to expand a list of resources +for use elsewhere. + +As with all examples, just copy and paste the example and run +`terraform apply` to see it work. diff --git a/examples/aws-count/main.tf b/examples/aws-count/main.tf new file mode 100644 index 000000000..419c1d8cd --- /dev/null +++ b/examples/aws-count/main.tf @@ -0,0 +1,30 @@ +# Specify the provider and access details +provider "aws" { + region = "${var.aws_region}" +} + +resource "aws_elb" "web" { + name = "terraform-example-elb" + + # The same availability zone as our instances + availability_zones = ["${aws_instance.web.*.availability_zone}"] + + listener { + instance_port = 80 + instance_protocol = "http" + lb_port = 80 + lb_protocol = "http" + } + + # The instances are registered automatically + instances = ["${aws_instance.web.*.id}"] +} + + +resource "aws_instance" "web" { + instance_type = "m1.small" + ami = "${lookup(var.aws_amis, var.aws_region)}" + + # This will create 4 instances + count = 4 +} diff --git a/examples/aws-count/outputs.tf b/examples/aws-count/outputs.tf new file mode 100644 index 000000000..fd703a8e2 --- /dev/null +++ b/examples/aws-count/outputs.tf @@ -0,0 +1,3 @@ +output "address" { + value = "Instances: ${aws_instance.web.*.id}" +} diff --git a/examples/aws-count/variables.tf b/examples/aws-count/variables.tf new file mode 100644 index 000000000..28a11a5e4 --- /dev/null +++ b/examples/aws-count/variables.tf @@ -0,0 +1,14 @@ +variable "aws_region" { + description = "The AWS region to create things in." + default = "us-west-2" +} + +# Ubuntu Precise 12.04 LTS (x64) +variable "aws_amis" { + default = { + "eu-west-1": "ami-b1cf19c6", + "us-east-1": "ami-de7ab6b6", + "us-west-1": "ami-3f75767a", + "us-west-2": "ami-21f78e11" + } +} diff --git a/examples/aws-two-tier/README.md b/examples/aws-two-tier/README.md new file mode 100644 index 000000000..49330eb60 --- /dev/null +++ b/examples/aws-two-tier/README.md @@ -0,0 +1,18 @@ +# Basic Two-Tier AWS Architecture + +This provides a template for running a simple two-tier architecture on Amazon +Web services. The premise is that you have stateless app servers running behind +an ELB serving traffic. + +To simplify the example, this intentionally ignores deploying and +getting your application onto the servers. However, you could do so either via +[provisioners](/docs/provisioners/index.html) and a configuration +management tool, or by pre-baking configured AMIs with +[Packer](http://www.packer.io). + +After you run `terraform apply` on this configuration, it will +automatically output the DNS address of the ELB. After your instance +registers, this should respond with the default nginx web page. + +As with all examples, just copy and paste the example and run +`terraform apply` to see it work. diff --git a/examples/consul/README.md b/examples/consul/README.md new file mode 100644 index 000000000..1460d3531 --- /dev/null +++ b/examples/consul/README.md @@ -0,0 +1,49 @@ +# Consul Example + +[Consul](http://www.consul.io) is a tool for service discovery, configuration +and orchestration. The Key/Value store it provides is often used to store +application configuration and information about the infrastructure necessary +to process requests. + +Terraform provides a [Consul provider](/docs/providers/consul/index.html) which +can be used to interface with Consul from inside a Terraform configuration. + +For our example, we use the [Consul demo cluster](http://demo.consul.io) +to both read configuration and store information about a newly created EC2 instance. +The size of the EC2 instance will be determined by the "tf\_test/size" key in Consul, +and will default to "m1.small" if that key does not exist. Once the instance is created +the "tf\_test/id" and "tf\_test/public\_dns" keys will be set with the computed +values for the instance. + +Before we run the example, use the [Web UI](http://demo.consul.io/ui/#/nyc1/kv/) +to set the "tf\_test/size" key to "t1.micro". Once that is done, +copy the configuration into a configuration file ("consul.tf" works fine). +Either provide the AWS credentials as a default value in the configuration +or invoke `apply` with the appropriate variables set. + +Once the `apply` has completed, we can see the keys in Consul by +visiting the [Web UI](http://demo.consul.io/ui/#/nyc1/kv/). We can see +that the "tf\_test/id" and "tf\_test/public\_dns" values have been +set. + +We can now teardown the infrastructure following the +[instructions here](/intro/getting-started/destroy.html). Because +we set the 'delete' property of two of the Consul keys, Terraform +will cleanup those keys on destroy. We can verify this by using +the Web UI. + +The point of this example is to show that Consul can be used with +Terraform both to enable dynamic inputs, but to also store outputs. + +Inputs like AMI name, security groups, puppet roles, bootstrap scripts, +etc can all be loaded from Consul. This allows the specifics of an +infrastructure to be decoupled from its overall architecture. This enables +details to be changed without updating the Terraform configuration. + +Outputs from Terraform can also be easily stored in Consul. One powerful +features this enables is using Consul for inventory management. If an +application relies on ELB for routing, Terraform can update the application's +configuration directly by setting the ELB address into Consul. Any resource +attribute can be stored in Consul, allowing an operator to capture anything +useful. + diff --git a/examples/consul/main.tf b/examples/consul/main.tf new file mode 100644 index 000000000..782f101a6 --- /dev/null +++ b/examples/consul/main.tf @@ -0,0 +1,43 @@ +# Setup the Consul provisioner to use the demo cluster +provider "consul" { + address = "demo.consul.io:80" + datacenter = "nyc1" +} + +# Setup an AWS provider +provider "aws" { + region = "${var.aws_region}" +} + +# Setup a key in Consul to provide inputs +resource "consul_keys" "input" { + key { + name = "size" + path = "tf_test/size" + default = "m1.small" + } +} + +# Setup a new AWS instance using a dynamic ami and +# instance type +resource "aws_instance" "test" { + ami = "${lookup(var.aws_amis, var.aws_region)}" + instance_type = "${consul_keys.input.var.size}" +} + +# Setup a key in Consul to store the instance id and +# the DNS name of the instance +resource "consul_keys" "test" { + key { + name = "id" + path = "tf_test/id" + value = "${aws_instance.test.id}" + delete = true + } + key { + name = "address" + path = "tf_test/public_dns" + value = "${aws_instance.test.public_dns}" + delete = true + } +} diff --git a/examples/consul/variables.tf b/examples/consul/variables.tf new file mode 100644 index 000000000..6bd2b8b20 --- /dev/null +++ b/examples/consul/variables.tf @@ -0,0 +1,14 @@ +variable "aws_region" { + description = "The AWS region to create resources in." + default = "us-east-1" +} + +# AMI's from http://cloud-images.ubuntu.com/locator/ec2/ +variable "aws_amis" { + default = { + "eu-west-1": "ami-b1cf19c6", + "us-east-1": "ami-de7ab6b6", + "us-west-1": "ami-3f75767a", + "us-west-2": "ami-21f78e11", + } +} diff --git a/examples/cross-provider/README.md b/examples/cross-provider/README.md new file mode 100644 index 000000000..7b69faea8 --- /dev/null +++ b/examples/cross-provider/README.md @@ -0,0 +1,11 @@ +# Cross Provider Examples + +This is a simple example of the cross-provider capabilities of +Terraform. + +Very simply, this creates a Heroku application and points a DNS +CNAME record at the result via DNSimple. A `host` query to the outputted +hostname should reveal the correct DNS configuration. + +As with all examples, just copy and paste the example and run +`terraform apply` to see it work. diff --git a/examples/cross-provider/main.tf b/examples/cross-provider/main.tf new file mode 100644 index 000000000..b72e201b9 --- /dev/null +++ b/examples/cross-provider/main.tf @@ -0,0 +1,26 @@ +# Create our Heroku application. Heroku will +# automatically assign a name. +resource "heroku_app" "web" {} + +# Create our DNSimple record to point to the +# heroku application. +resource "dnsimple_record" "web" { + domain = "${var.dnsimple_domain}" + + name = "terraform" + + # heroku_hostname is a computed attribute on the heroku + # application we can use to determine the hostname + value = "${heroku_app.web.heroku_hostname}" + + type = "CNAME" + ttl = 3600 +} + +# The Heroku domain, which will be created and added +# to the heroku application after we have assigned the domain +# in DNSimple +resource "heroku_domain" "foobar" { + app = "${heroku_app.web.name}" + hostname = "${dnsimple_record.web.hostname}" +} diff --git a/examples/cross-provider/outputs.tf b/examples/cross-provider/outputs.tf new file mode 100644 index 000000000..9afbf5d61 --- /dev/null +++ b/examples/cross-provider/outputs.tf @@ -0,0 +1,3 @@ +output "address" { + value = "${dnsimple_record.web.hostname}" +} diff --git a/examples/cross-provider/variables.tf b/examples/cross-provider/variables.tf new file mode 100644 index 000000000..479a1f433 --- /dev/null +++ b/examples/cross-provider/variables.tf @@ -0,0 +1,3 @@ +variable "dnsimple_domain" { + description = "The domain we are creating a record for." +} diff --git a/website/source/intro/examples/consul.html.markdown b/website/source/intro/examples/consul.html.markdown index 33960ca9e..77066c73d 100644 --- a/website/source/intro/examples/consul.html.markdown +++ b/website/source/intro/examples/consul.html.markdown @@ -6,6 +6,8 @@ sidebar_current: "examples-consul" # Consul Example +[**Example Contents**](https://github.com/hashicorp/terraform/tree/master/examples/consul) + [Consul](http://www.consul.io) is a tool for service discovery, configuration and orchestration. The Key/Value store it provides is often used to store application configuration and information about the infrastructure necessary @@ -52,79 +54,3 @@ application relies on ELB for routing, Terraform can update the application's configuration directly by setting the ELB address into Consul. Any resource attribute can be stored in Consul, allowing an operator to capture anything useful. - - -## Command - -``` -terraform apply \ - -var 'aws_access_key=YOUR_KEY' \ - -var 'aws_secret_key=YOUR_KEY' -``` - -## Configuration - -``` -# Declare our variables, require access and secret keys -variable "aws_access_key" {} -variable "aws_secret_key" {} -variable "aws_region" { - default = "us-east-1" -} - -# AMI's from http://cloud-images.ubuntu.com/locator/ec2/ -variable "aws_amis" { - default = { - "eu-west-1": "ami-b1cf19c6", - "us-east-1": "ami-de7ab6b6", - "us-west-1": "ami-3f75767a", - "us-west-2": "ami-21f78e11", - } -} - -# Setup the Consul provisioner to use the demo cluster -provider "consul" { - address = "demo.consul.io:80" - datacenter = "nyc1" -} - -# Setup an AWS provider -provider "aws" { - access_key = "${var.aws_access_key}" - secret_key = "${var.aws_secret_key}" - region = "${var.aws_region}" -} - -# Setup a key in Consul to provide inputs -resource "consul_keys" "input" { - key { - name = "size" - path = "tf_test/size" - default = "m1.small" - } -} - -# Setup a new AWS instance using a dynamic ami and -# instance type -resource "aws_instance" "test" { - ami = "${lookup(var.aws_amis, var.aws_region)}" - instance_type = "${consul_keys.input.var.size}" -} - -# Setup a key in Consul to store the instance id and -# the DNS name of the instance -resource "consul_keys" "test" { - key { - name = "id" - path = "tf_test/id" - value = "${aws_instance.test.id}" - delete = true - } - key { - name = "address" - path = "tf_test/public_dns" - value = "${aws_instance.test.public_dns}" - delete = true - } -} -``` diff --git a/website/source/intro/examples/count.markdown b/website/source/intro/examples/count.markdown index f70dde558..29ec62fef 100644 --- a/website/source/intro/examples/count.markdown +++ b/website/source/intro/examples/count.markdown @@ -6,73 +6,13 @@ sidebar_current: "examples-count" # Count Example +[**Example Contents**](https://github.com/hashicorp/terraform/tree/master/examples/count) + The count parameter on resources can simplify configurations and let you scale resources by simply incrementing a number. Additionally, variables can be used to expand a list of resources for use elsewhere. -## Command - -``` - terraform apply \ - -var 'aws_access_key=YOUR_ACCESS_KEY' \ - -var 'aws_secret_key=YOUR_SECRET_KEY' -``` - -## Configuration - -``` -variable "aws_access_key" {} -variable "aws_secret_key" {} -variable "aws_region" { - default = "us-west-2" -} - -# Ubuntu Precise 12.04 LTS (x64) -variable "aws_amis" { - default = { - "eu-west-1": "ami-b1cf19c6", - "us-east-1": "ami-de7ab6b6", - "us-west-1": "ami-3f75767a", - "us-west-2": "ami-21f78e11" - } -} - -# Specify the provider and access details -provider "aws" { - access_key = "${var.aws_access_key}" - secret_key = "${var.aws_secret_key}" - region = "${var.aws_region}" -} - -resource "aws_elb" "web" { - name = "terraform-example-elb" - - # The same availability zone as our instances - availability_zones = ["${aws_instance.web.*.availability_zone}"] - - listener { - instance_port = 80 - instance_protocol = "http" - lb_port = 80 - lb_protocol = "http" - } - - # The instances are registered automatically - instances = ["${aws_instance.web.*.id}"] -} - - -resource "aws_instance" "web" { - instance_type = "m1.small" - ami = "${lookup(var.aws_amis, var.aws_region)}" - - # This will create 4 instances - count = 4 -} - -output "address" { - value = "Instances: ${aws_instance.web.*.id}" -} -``` +As with all examples, just copy and paste the example and run +`terraform apply` to see it work. diff --git a/website/source/intro/examples/cross-provider.markdown b/website/source/intro/examples/cross-provider.markdown index 5c496f3e9..ad7435693 100644 --- a/website/source/intro/examples/cross-provider.markdown +++ b/website/source/intro/examples/cross-provider.markdown @@ -6,6 +6,8 @@ sidebar_current: "examples-cross-provider" # Cross Provider Example +[**Example Contents**](https://github.com/hashicorp/terraform/tree/master/examples/cross-provider) + This is a simple example of the cross-provider capabilities of Terraform. @@ -13,66 +15,5 @@ Very simply, this creates a Heroku application and points a DNS CNAME record at the result via DNSimple. A `host` query to the outputted hostname should reveal the correct DNS configuration. -## Command - -``` -terraform apply \ - -var 'heroku_email=YOUR_EMAIL' \ - -var 'heroku_api_key=YOUR_KEY' \ - -var 'dnsimple_domain=example.com' \ - -var 'dnsimple_email=YOUR_EMAIL' \ - -var 'dnsimple_token=YOUR_TOKEN' -``` - -## Configuration - -``` -variable "heroku_email" {} -variable "heroku_api_key" {} - -# The domain we are creating a record for -variable "dnsimple_domain" {} - -variable "dnsimple_token" {} -variable "dnsimple_email" {} - - -# Specify the provider and access details -provider "heroku" { - email = "${var.heroku_email}" - api_key = "${var.heroku_api_key}" -} - -# Create our Heroku application. Heroku will -# automatically assign a name. -resource "heroku_app" "web" { -} - -# Create our DNSimple record to point to the -# heroku application. -resource "dnsimple_record" "web" { - domain = "${var.dnsimple_domain}" - - name = "terraform" - - # heroku_hostname is a computed attribute on the heroku - # application we can use to determine the hostname - value = "${heroku_app.web.heroku_hostname}" - - type = "CNAME" - ttl = 3600 -} - -# The Heroku domain, which will be created and added -# to the heroku application after we have assigned the domain -# in DNSimple -resource "heroku_domain" "foobar" { - app = "${heroku_app.web.name}" - hostname = "${dnsimple_record.web.hostname}" -} - -# Output the hostname of the newly created record -output "address" { - value = "${dnsimple_record.web.hostname}" -} -``` +As with all examples, just copy and paste the example and run +`terraform apply` to see it work.