github.com/jmbataller/terraform@v0.6.8-0.20151125192640-b7a12e3a580c/website/source/docs/configuration/syntax.html.md (about)

     1  ---
     2  layout: "docs"
     3  page_title: "Configuration Syntax"
     4  sidebar_current: "docs-config-syntax"
     5  description: |-
     6    The syntax of Terraform configurations is custom. It is meant to strike a balance between human readable and editable as well as being machine-friendly. For machine-friendliness, Terraform can also read JSON configurations. For general Terraform configurations, however, we recommend using the Terraform syntax.
     7  ---
     8  
     9  # Configuration Syntax
    10  
    11  The syntax of Terraform configurations is custom. It is meant to
    12  strike a balance between human readable and editable as well as being
    13  machine-friendly. For machine-friendliness, Terraform can also
    14  read JSON configurations. For general Terraform configurations,
    15  however, we recommend using the Terraform syntax.
    16  
    17  ## Terraform Syntax
    18  
    19  Here is an example of Terraform syntax:
    20  
    21  ```
    22  # An AMI
    23  variable "ami" {
    24  	description = "the AMI to use"
    25  }
    26  
    27  /* A multi
    28     line comment. */
    29  resource "aws_instance" "web" {
    30  	ami = "${var.ami}"
    31  	count = 2
    32  	source_dest_check = false
    33  
    34  	connection {
    35  		user = "root"
    36  	}
    37  }
    38  ```
    39  
    40  Basic bullet point reference:
    41  
    42    * Single line comments start with `#`
    43  
    44    * Multi-line comments are wrapped with `/*` and `*/`
    45  
    46    * Values are assigned with the syntax of `key = value` (whitespace
    47      doesn't matter). The value can be any primitive: a string,
    48      number, or boolean.
    49  
    50    * Strings are in double-quotes.
    51  
    52    * Strings can interpolate other values using syntax wrapped
    53      in `${}`, such as `${var.foo}`. The full syntax for interpolation
    54      is
    55      [documented here](/docs/configuration/interpolation.html).
    56  
    57    * Multiline strings can use shell-style "here doc" syntax, with
    58      the string starting with a marker like `<<EOT` and then the
    59      string ending with `EOT` on a line of its own. The lines of
    60      the string and the end marker must *not* be indented.
    61  
    62    * Numbers are assumed to be base 10. If you prefix a number with
    63      `0x`, it is treated as a hexadecimal number.
    64  
    65    * Numbers can be suffixed with `kKmMgG` for some multiple of 10.
    66      For example: `1k` is equal to `1000`.
    67  
    68    * Numbers can be suffixed with `[kKmMgG]b` for power of 2 multiples,
    69      example: `1kb` is equal to `1024`.
    70  
    71    * Boolean values: `true`, `false`.
    72  
    73    * Lists of primitive types can be made by wrapping it in `[]`.
    74      Example: `["foo", "bar", 42]`.
    75  
    76    * Maps can be made with the `{}` syntax:
    77  	`{ "foo": "bar", "bar": "baz" }`.
    78  
    79  In addition to the basics, the syntax supports hierarchies of sections,
    80  such as the "resource" and "variable" in the example above. These
    81  sections are similar to maps, but visually look better. For example,
    82  these are nearly equivalent:
    83  
    84  ```
    85  variable "ami" {
    86  	description = "the AMI to use"
    87  }
    88  
    89  # is equal to:
    90  
    91  variable = [{
    92  	"ami": {
    93  		"description": "the AMI to use",
    94  	}
    95  }]
    96  ```
    97  
    98  Notice how the top stanza visually looks a lot better? By repeating
    99  multiple `variable` sections, it builds up the `variable` list. When
   100  possible, use sections since they're visually clearer and more readable.
   101  
   102  ## JSON Syntax
   103  
   104  Terraform also supports reading JSON formatted configuration files.
   105  The above example converted to JSON:
   106  
   107  ```json
   108  {
   109  	"variable": {
   110  		"ami": {
   111  			"description": "the AMI to use"
   112  		}
   113  	},
   114  
   115  	"resource": {
   116  		"aws_instance": {
   117  			"web": {
   118  				"ami": "${var.ami}",
   119  				"count": 2,
   120  				"source_dest_check": false,
   121  
   122  				"connection": {
   123  					"user": "root"
   124  				}
   125  			}
   126  		}
   127  	}
   128  }
   129  ```
   130  
   131  The conversion should be pretty straightforward and self-documented.
   132  
   133  The downsides of JSON are less human readability and the lack of
   134  comments. Otherwise, the two are completely interoperable.