github.com/jmbataller/terraform@v0.6.8-0.20151125192640-b7a12e3a580c/website/source/docs/modules/sources.html.markdown (about)

     1  ---
     2  layout: "docs"
     3  page_title: "Module Sources"
     4  sidebar_current: "docs-modules-sources"
     5  description: |-
     6    As documented in usage, the only required parameter when using a module is the `source` parameter which tells Terraform where the module can be found and what constraints to put on the module if any (such as branches for Git, versions, etc.).
     7  ---
     8  
     9  # Module Sources
    10  
    11  As documented in [usage](/docs/modules/usage.html), the only required
    12  parameter when using a module is the `source` parameter which tells Terraform
    13  where the module can be found and what constraints to put on the module
    14  if any (such as branches for Git, versions, etc.).
    15  
    16  Terraform manages modules for you: it downloads them, organizes them
    17  on disk, checks for updates, etc. Terraform uses this source parameter for
    18  the download/update of modules.
    19  
    20  Terraform supports the following sources:
    21  
    22    * Local file paths
    23  
    24    * GitHub
    25  
    26    * BitBucket
    27  
    28    * Generic Git, Mercurial repositories
    29  
    30    * HTTP URLs
    31  
    32  Each is documented further below.
    33  
    34  ## Local File Paths
    35  
    36  The easiest source is the local file path. For maximum portability, this
    37  should be a relative file path into a subdirectory. This allows you to
    38  organize your Terraform configuration into modules within one repository,
    39  for example.
    40  
    41  An example is shown below:
    42  
    43  ```
    44  module "consul" {
    45  	source = "./consul"
    46  }
    47  ```
    48  
    49  Updates for file paths are automatic: when "downloading" the module
    50  using the [get command](/docs/commands/get.html), Terraform will create
    51  a symbolic link to the original directory. Therefore, any changes are
    52  automatically instantly available.
    53  
    54  ## GitHub
    55  
    56  Terraform will automatically recognize GitHub URLs and turn them into
    57  the proper Git repository. The syntax is simple:
    58  
    59  ```
    60  module "consul" {
    61  	source = "github.com/hashicorp/example"
    62  }
    63  ```
    64  
    65  Subdirectories within the repository can also be referenced:
    66  
    67  ```
    68  module "consul" {
    69  	source = "github.com/hashicorp/example//subdir"
    70  }
    71  ```
    72  
    73  **Note:** The double-slash is important. It is what tells Terraform that
    74  that is the separator for a subdirectory, and not part of the repository
    75  itself.
    76  
    77  GitHub source URLs will require that Git is installed on your system
    78  and that you have the proper access to the repository.
    79  
    80  You can use the same parameters to GitHub repositories as you can generic
    81  Git repositories (such as tags or branches). See the documentation for generic
    82  Git repositories for more information.
    83  
    84  #### Private GitHub Repos<a id="private-github-repos"></a>
    85  
    86  If you need Terraform to be able to fetch modules from private GitHub repos on
    87  a remote machine (like a Atlas or a CI server), you'll need to provide
    88  Terraform with credentials that can be used to authenticate as a user with read
    89  access to the private repo.
    90  
    91  First, create a [machine
    92  user](https://developer.github.com/guides/managing-deploy-keys/#machine-users)
    93  with access to read from the private repo in question, then embed this user's
    94  credentials into the source field:
    95  
    96  ```
    97  module "private-infra" {
    98    source = "git::https://MACHINE-USER:MACHINE-PASS@github.com/org/privatemodules//modules/foo"
    99  }
   100  ```
   101  
   102  Note that Terraform does not yet support interpolations in the `source` field,
   103  so the machine username and password will have to be embedded directly into the
   104  source string. You can track
   105  [GH-1439](https://github.com/hashicorp/terraform/issues/1439) to learn when this
   106  limitation is lifted.
   107  
   108  ## BitBucket
   109  
   110  Terraform will automatically recognize BitBucket URLs and turn them into
   111  the proper Git or Mercurial repository. An example:
   112  
   113  ```
   114  module "consul" {
   115  	source = "bitbucket.org/hashicorp/example"
   116  }
   117  ```
   118  
   119  Subdirectories within the repository can also be referenced:
   120  
   121  ```
   122  module "consul" {
   123  	source = "bitbucket.org/hashicorp/example//subdir"
   124  }
   125  ```
   126  
   127  **Note:** The double-slash is important. It is what tells Terraform that
   128  that is the separator for a subdirectory, and not part of the repository
   129  itself.
   130  
   131  BitBucket URLs will require that Git or Mercurial is installed on your
   132  system, depending on the source URL.
   133  
   134  ## Generic Git Repository
   135  
   136  Generic Git repositories are also supported. The value of `source` in this
   137  case should be a complete Git-compatible URL. Using Git requires that
   138  Git is installed on your system. Example:
   139  
   140  ```
   141  module "consul" {
   142  	source = "git://hashicorp.com/module.git"
   143  }
   144  ```
   145  
   146  You can also use protocols such as HTTP or SSH, but you'll have to hint
   147  to Terraform (using the forced source type syntax documented below) to use
   148  Git:
   149  
   150  ```
   151  // force https source
   152  module "consul" {
   153  	source = "git::https://hashicorp.com/module.git"
   154  }
   155  
   156  // force ssh source
   157  module "ami" {
   158  	source = "git::ssh://git@github.com/owner/repo.git"
   159  }
   160  ```
   161  
   162  URLs for Git repositories (of any protocol) support the following query
   163  parameters:
   164  
   165    * `ref` - The ref to checkout. This can be a branch, tag, commit, etc.
   166  
   167  An example of using these parameters is shown below:
   168  
   169  ```
   170  module "consul" {
   171  	source = "git::https://hashicorp.com/module.git?ref=master"
   172  }
   173  ```
   174  
   175  ## Generic Mercurial Repository
   176  
   177  Generic Mercurial repositories are supported. The value of `source` in this
   178  case should be a complete Mercurial-compatible URL. Using Mercurial requires that
   179  Mercurial is installed on your system. Example:
   180  
   181  ```
   182  module "consul" {
   183  	source = "hg::http://hashicorp.com/module.hg"
   184  }
   185  ```
   186  
   187  In the case of above, we used the forced source type syntax documented below.
   188  Mercurial repositories require this.
   189  
   190  URLs for Mercurial repositories (of any protocol) support the following query
   191  parameters:
   192  
   193    * `rev` - The rev to checkout. This can be a branch, tag, commit, etc.
   194  
   195  ## HTTP URLs
   196  
   197  Any HTTP endpoint can serve up Terraform modules. For HTTP URLs (SSL is
   198  supported, as well), Terraform will make a GET request to the given URL.
   199  An additional GET parameter `terraform-get=1` will be appended, allowing
   200  you to optionally render the page differently when Terraform is requesting it.
   201  
   202  Terraform then looks for the resulting module URL in the following order.
   203  
   204  First, if a header `X-Terraform-Get` is present, then it should contain
   205  the source URL of the actual module. This will be used.
   206  
   207  If the header isn't present, Terraform will look for a `<meta>` tag
   208  with the name of "terraform-get". The value will be used as the source
   209  URL.
   210  
   211  ## Forced Source Type
   212  
   213  In a couple places above, we've referenced "forced source type." Forced
   214  source type is a syntax added to URLs that allow you to force a specific
   215  method for download/updating the module. It is used to disambiguate URLs.
   216  
   217  For example, the source "http://hashicorp.com/foo.git" could just as
   218  easily be a plain HTTP URL as it might be a Git repository speaking the
   219  HTTP protocol. The forced source type syntax is used to force Terraform
   220  one way or the other.
   221  
   222  Example:
   223  
   224  ```
   225  module "consul" {
   226  	source = "git::http://hashicorp.com/foo.git"
   227  }
   228  ```
   229  
   230  The above will force Terraform to get the module using Git, despite it
   231  being an HTTP URL.
   232  
   233  If a forced source type isn't specified, Terraform will match the exact
   234  protocol if it supports it. It will not try multiple methods. In the case
   235  above, it would've used the HTTP method.