diff --git a/website/docs/configuration/index.html.md b/website/docs/configuration/index.html.md index 2b3e7f396d..72074e16fb 100644 --- a/website/docs/configuration/index.html.md +++ b/website/docs/configuration/index.html.md @@ -3,23 +3,131 @@ layout: "docs" page_title: "Configuration" sidebar_current: "docs-config" description: |- - Terraform uses text files to describe infrastructure and to set variables. These text files are called Terraform _configurations_ and end in `.tf`. This section talks about the format of these files as well as how they're loaded. + Terraform uses text files to describe infrastructure and to set variables. + These text files are called Terraform _configurations_ and are + written in the Terraform language. --- # Configuration -Terraform uses text files to describe infrastructure and to set variables. -These text files are called Terraform _configurations_ and end in -`.tf`. This section talks about the format of these files as well as -how they're loaded. - -The format of the configuration files are able to be in two formats: -Terraform format and JSON. The Terraform format is more human-readable, -supports comments, and is the generally recommended format for most -Terraform files. The JSON format is meant for machines to create, -modify, and update, but can also be done by Terraform operators if -you prefer. Terraform format ends in `.tf` and JSON format ends in -`.tf.json`. - -Click a sub-section in the navigation to the left to learn more about -Terraform configuration. +Terraform uses its own configuration language, designed to allow concise +descriptions of infrastructure. The Terraform language is declarative, +describing an intended goal rather than the steps to reach that goal. + +## Resources and Modules + +The main purpose of the Terraform language is declaring [resources](/docs/configuration/resources.html). +All other language features exist only to make the definition of resources +more flexible and convenient. + +A group of resources can be gathered into a [module](/docs/configuration/modules.html), +which creates a larger unit of configuration. A resource describes a single +infrastructure object, while a module might describe a set of objects and the +necessary relationships between them in order to create a higher-level system. + +A _Terraform configuration_ consists of a _root module_, where evaluation +begins, along with a tree of child modules created when one module references +another. + +## Code Organization + +The Terraform language uses configuration files that are named with the `.tf` +file extension. There is also [a JSON-based variant of the language](/docs/configuration/json-syntax.html) +that is named with the `.tf.json` file extension. + +Configuration files must always use UTF-8 encoding, and by convention are +usually maintained with Unix-style line endings (LF) rather than Windows-style +line endings (CRLF), though both are accepted. + +A _module_ is a collection of `.tf` or `.tf.json` files kept together in a +directory. The root module is built from the configuration files in the +current working directory when Terraform is run, and this module may reference +child modules in other directories, which can in turn reference other modules, +etc. + +The simplest Terraform configuration is a single root module containing only +a single `.tf` file. A configuration can grow gradually as more resources +are added, either by creating new configuration files within the root module +or by organizing sets of resources into child modules. + +## Configuration Ordering + +Because Terraform's configuration language is declarative, the ordering of +blocks is generally not significant, except in some specific situations which +are described explicitly elsewhere. + +Terraform automatically processes resources in the correct order based on +relationships defined between them in configuration, and so you can organize +resources into source files in whatever way makes sense for your infrastructure. + +## Terraform Core vs. Providers + +Terraform Core is a general engine for evaluating and applying Terraform +configuations. It defines the Terraform language syntax and overall structure, +and coordinates sequences of changes that must be made to make remote +infrastructure match the given configuration. + +Terraform Core has no knowledge of specific infrastructure object types, though. +Instead, Terraform uses plugins called [providers](/docs/configuration/providers.html) +that each define and know how to manage a set of resource types. Most providers +are associated with a particular cloud or on-premises infrastructure service, +allowing Terraform to manage infrastructure objects within that service. + +Since each provider has its own resource types with different features, the +exact details of resources can vary between services, but Terraform Core +ensures that the same language constructs and syntax are available across +all services and allows resource types from different services to be combined +as needed. + +## Example + +The following simple example describes a simple network topology for Amazon Web +Services, just to give a sense of the overall structure and syntax of the +Terraform language. Similar configurations can be created for other virtual +network services, using resource types defined by other providers, and a +practical network configuration will often contain additional elements not +shown here. + +```hcl +variable "aws_region" {} + +variable "base_cidr_block" { + description = "A /16 CIDR range definition, such as 10.1.0.0/16, that the VPC will use" + default = "10.1.0.0/16" +} + +variable "availability_zones" { + description = "A list of availability zones in which to create subnets" +} + +provider "aws" { + region = var.aws_region +} + +resource "aws_vpc" "main" { + # Referencing the base_cidr_block variable allows the network address + # to be changed without modifying the configuration. + cidr_block = var.base_cidr_block +} + +resource "aws_subnet" "az" { + # Create one subnet for each given availability zone. + count = length(var.availability_zones) + + # For each subnet, use one of the specified availability zones. + availability_zone = var.availability_zones[count.index] + + # By referencing the aws_vpc.main object, Terraform knows that the subnet + # must be created only after the VPC is created. + vpc_id = aws_vpc.main.id + + # Built-in functions and operators can be used for simple transformations of + # values, such as computing a subnet address. Here we create a /20 prefix for + # each subnet, using consecutive addresses for each availability zone, + # such as 10.1.16.0/20 . + cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 4, count.index+1) +} +``` + +For more information on the configuration elements shown here, use the +site navigation to explore the Terraform language documentation sub-sections.