2014-09-27 21:28:07 +02:00
---
layout: "docs"
page_title: "Command: init"
sidebar_current: "docs-commands-init"
2014-10-22 05:21:56 +02:00
description: |-
2017-02-15 22:14:32 +01:00
The `terraform init` command is used to initialize a Terraform configuration. This is the first command that should be run for any new or existing Terraform configuration. It is safe to run this command multiple times.
2014-09-27 21:28:07 +02:00
---
# Command: init
2020-10-02 20:02:59 +02:00
> **Hands-on:** Try the [Terraform: Get Started](https://learn.hashicorp.com/collections/terraform/aws-get-started?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS) collection on HashiCorp Learn.
2020-07-31 22:16:35 +02:00
2017-06-03 01:59:52 +02:00
The `terraform init` command is used to initialize a working directory
containing Terraform configuration files. This is the first command that should
be run after writing a new Terraform configuration or cloning an existing one
from version control. It is safe to run this command multiple times.
2014-09-27 21:28:07 +02:00
## Usage
main: new global option -chdir
This new option is intended to address the previous inconsistencies where
some older subcommands supported partially changing the target directory
(where Terraform would use the new directory inconsistently) where newer
commands did not support that override at all.
Instead, now Terraform will accept a -chdir command at the start of the
command line (before the subcommand) and will interpret it as a request
to direct all actions that would normally be taken in the current working
directory into the target directory instead. This is similar to options
offered by some other similar tools, such as the -C option in "make".
The new option is only accepted at the start of the command line (before
the subcommand) as a way to reflect that it is a global command (not
specific to a particular subcommand) and that it takes effect _before_
executing the subcommand. This also means it'll be forced to appear before
any other command-specific arguments that take file paths, which hopefully
communicates that those other arguments are interpreted relative to the
overridden path.
As a measure of pragmatism for existing uses, the path.cwd object in
the Terraform language will continue to return the _original_ working
directory (ignoring -chdir), in case that is important in some exceptional
workflows. The path.root object gives the root module directory, which
will always match the overriden working directory unless the user
simultaneously uses one of the legacy directory override arguments, which
is not a pattern we intend to support in the long run.
As a first step down the deprecation path, this commit adjusts the
documentation to de-emphasize the inconsistent old command line arguments,
including specific guidance on what to use instead for the main three
workflow commands, but all of those options remain supported in the same
way as they were before. In a later commit we'll make those arguments
produce a visible deprecation warning in Terraform's output, and then
in an even later commit we'll remove them entirely so that -chdir is the
single supported way to run Terraform from a directory other than the
one containing the root module configuration.
2020-09-02 00:45:12 +02:00
Usage: `terraform init [options]`
2014-09-27 21:28:07 +02:00
2017-07-25 02:04:28 +02:00
This command performs several different initialization steps in order to
main: new global option -chdir
This new option is intended to address the previous inconsistencies where
some older subcommands supported partially changing the target directory
(where Terraform would use the new directory inconsistently) where newer
commands did not support that override at all.
Instead, now Terraform will accept a -chdir command at the start of the
command line (before the subcommand) and will interpret it as a request
to direct all actions that would normally be taken in the current working
directory into the target directory instead. This is similar to options
offered by some other similar tools, such as the -C option in "make".
The new option is only accepted at the start of the command line (before
the subcommand) as a way to reflect that it is a global command (not
specific to a particular subcommand) and that it takes effect _before_
executing the subcommand. This also means it'll be forced to appear before
any other command-specific arguments that take file paths, which hopefully
communicates that those other arguments are interpreted relative to the
overridden path.
As a measure of pragmatism for existing uses, the path.cwd object in
the Terraform language will continue to return the _original_ working
directory (ignoring -chdir), in case that is important in some exceptional
workflows. The path.root object gives the root module directory, which
will always match the overriden working directory unless the user
simultaneously uses one of the legacy directory override arguments, which
is not a pattern we intend to support in the long run.
As a first step down the deprecation path, this commit adjusts the
documentation to de-emphasize the inconsistent old command line arguments,
including specific guidance on what to use instead for the main three
workflow commands, but all of those options remain supported in the same
way as they were before. In a later commit we'll make those arguments
produce a visible deprecation warning in Terraform's output, and then
in an even later commit we'll remove them entirely so that -chdir is the
single supported way to run Terraform from a directory other than the
one containing the root module configuration.
2020-09-02 00:45:12 +02:00
prepare the current working directory for use with Terraform. More details on
these are in the sections below, but in most cases it is not necessary to worry
about these individual steps.
2014-09-27 21:28:07 +02:00
2017-07-25 02:04:28 +02:00
This command is always safe to run multiple times, to bring the working
directory up to date with changes in the configuration. Though subsequent runs
may give errors, this command will never delete your existing configuration or
state.
2014-12-06 00:29:00 +01:00
2017-07-25 02:04:28 +02:00
## General Options
2017-02-15 22:14:32 +01:00
2017-07-25 02:04:28 +02:00
The following options apply to all of (or several of) the initialization steps:
2014-12-06 00:29:00 +01:00
2017-07-25 02:04:28 +02:00
* `-input=true` Ask for input if necessary. If false, will error if
input was required.
2014-12-06 00:29:00 +01:00
2017-07-25 02:04:28 +02:00
* `-lock=false` Disable locking of state files during state-related operations.
2017-06-16 23:27:57 +02:00
2017-07-25 02:04:28 +02:00
* `-lock-timeout=<duration>` Override the time Terraform will wait to acquire
a state lock. The default is `0s` (zero seconds), which causes immediate
failure if the lock is already held by another process.
2017-06-16 23:27:57 +02:00
2017-07-25 02:04:28 +02:00
* `-no-color` Disable color codes in the command output.
2017-06-16 23:27:57 +02:00
2017-07-25 02:04:28 +02:00
* `-upgrade` Opt to upgrade modules and plugins as part of their respective
2018-01-24 18:41:42 +01:00
installation steps. See the sections below for more details.
2014-12-06 00:29:00 +01:00
2017-07-29 00:23:29 +02:00
## Copy a Source Module
By default, `terraform init` assumes that the working directory already
contains a configuration and will attempt to initialize that configuration.
Optionally, init can be run against an empty directory with the
2017-08-11 02:56:11 +02:00
`-from-module=MODULE-SOURCE` option, in which case the given module will be
2017-07-29 00:23:29 +02:00
copied into the target directory before any other initialization steps are
run.
This special mode of operation supports two use-cases:
* Given a version control source, it can serve as a shorthand for checking out
2018-09-09 07:40:33 +02:00
a configuration from version control and then initializing the working directory
2017-07-29 00:23:29 +02:00
for it.
* If the source refers to an _example_ configuration, it can be copied into
a local directory to be used as a basis for a new configuration.
2018-01-24 18:41:42 +01:00
For routine use it is recommended to check out configuration from version
2017-07-29 00:23:29 +02:00
control separately, using the version control system's own commands. This way
2018-01-24 18:41:42 +01:00
it is possible to pass extra flags to the version control system when necessary,
2017-07-29 00:23:29 +02:00
and to perform other preparation steps (such as configuration generation, or
activating credentials) before running `terraform init` .
2017-07-25 02:04:28 +02:00
## Backend Initialization
During init, the root configuration directory is consulted for
[backend configuration ](/docs/backends/config.html ) and the chosen backend
is initialized using the given configuration settings.
2019-03-21 20:20:29 +01:00
Re-running init with an already-initialized backend will update the working
2017-07-25 02:04:28 +02:00
directory to use the new backend settings. Depending on what changed, this
may result in interactive prompts to confirm migration of workspace states.
The `-force-copy` option suppresses these prompts and answers "yes" to the
migration questions. The `-reconfigure` option disregards any existing
configuration, preventing migration of any existing state.
2017-04-20 23:34:14 +02:00
2017-07-25 02:04:28 +02:00
To skip backend configuration, use `-backend=false` . Note that some other init
2018-01-24 18:41:42 +01:00
steps require an initialized backend, so it is recommended to use this flag only
2017-07-25 02:04:28 +02:00
when the working directory was already previously initialized for a particular
backend.
2014-12-06 00:29:00 +01:00
2017-07-25 02:04:28 +02:00
The `-backend-config=...` option can be used for
[partial backend configuration ](/docs/backends/config.html#partial-configuration ),
in situations where the backend settings are dynamic or sensitive and so cannot
be statically specified in the configuration file.
2015-10-19 01:23:13 +02:00
2017-07-25 02:04:28 +02:00
## Child Module Installation
2017-04-04 19:48:59 +02:00
2017-07-25 02:04:28 +02:00
During init, the configuration is searched for `module` blocks, and the source
code for referenced [modules ](/docs/modules/ ) is retrieved from the locations
given in their `source` arguments.
2017-04-04 19:48:59 +02:00
2017-07-25 02:04:28 +02:00
Re-running init with modules already installed will install the sources for
any modules that were added to configuration since the last init, but will not
change any already-installed modules. Use `-upgrade` to override this behavior,
updating all modules to the latest available source code.
2017-04-04 19:48:59 +02:00
2017-07-25 02:04:28 +02:00
To skip child module installation, use `-get=false` . Note that some other init
steps can complete only when the module tree is complete, so it's recommended
to use this flag only when the working directory was already previously
initialized with its child modules.
2017-04-04 19:48:59 +02:00
2017-07-25 02:04:28 +02:00
## Plugin Installation
2017-06-20 17:50:31 +02:00
2020-10-08 03:26:31 +02:00
Most Terraform providers are published separately from Terraform as plugins.
2018-10-03 01:53:29 +02:00
During init, Terraform searches the configuration for both direct and indirect
2020-10-08 03:26:31 +02:00
references to providers and attempts to install the plugins for those providers.
For providers that are published in either
[the public Terraform Registry ](https://registry.terraform.io/ ) or in a
third-party provider registry, `terraform init` will automatically find,
download, and install the necessary provider plugins. If you cannot or do not
wish to install providers from their origin registries, you can customize how
Terraform installs providers using
[the provider installation settings in the CLI configuration ](./cli-config.html#provider-installation ).
For more information about specifying which providers are required for each
of your modules, see [Provider Requirements ](/docs/configuration/provider-requirements.html ).
After successful installation, Terraform writes information about the selected
providers to [the dependency lock file ](/docs/configuration/dependency-lock.html ).
You should commit this file to your version control system to ensure that
when you run `terraform init` again in future Terraform will select exactly
the same provider versions. Use the `-upgrade` option if you want Terraform
to ignore the dependency lock file and consider installing newer versions.
2018-10-03 01:53:29 +02:00
You can modify `terraform init` 's plugin behavior with the following options:
2020-10-08 03:26:31 +02:00
- `-upgrade` Upgrade all previously-selected plugins to the newest version
that complies with the configuration's version constraints. This will
cause Terraform to ignore any selections recorded in the dependency lock
file, and to take the newest available version matching the configured
version constraints.
- `-get-plugins=false` — Skip plugin installation. If you previously ran
`terraform init` without this option, the previously-installed plugins will
remain available in your current working directory. If you have not
previously run without this option, subsequent Terraform commands will
fail due to the needed provider plugins being unavailable.
- `-plugin-dir=PATH` — Force plugin installation to read plugins _only_ from
the specified directory, as if it had been configured as a `filesystem_mirror`
in the CLI configuration. If you intend to routinely use a particular
filesystem mirror then we recommend
[configuring Terraform's installation methods globally ](./cli-config.html#provider-installation ).
You can use `-plugin-dir` as a one-time override for exceptional situations,
such as if you are testing a local build of a provider plugin you are
currently developing.
2017-03-17 07:27:05 +01:00
2017-07-25 02:04:28 +02:00
## Running `terraform init` in automation
2017-03-17 07:27:05 +01:00
2017-07-25 02:04:28 +02:00
For teams that use Terraform as a key part of a change management and
deployment pipeline, it can be desirable to orchestrate Terraform runs in some
sort of automation in order to ensure consistency between runs, and provide
other interesting features such as integration with version control hooks.
2017-03-17 07:27:05 +01:00
2017-07-25 02:04:28 +02:00
There are some special concerns when running `init` in such an environment,
including optionally making plugins available locally to avoid repeated
re-installation. For more information, see
2020-10-02 20:02:59 +02:00
the [Running Terraform in Automation ](https://learn.hashicorp.com/tutorials/terraform/automate-terraform?in=terraform/automation&utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS ) tutorial on HashiCorp Learn.
main: new global option -chdir
This new option is intended to address the previous inconsistencies where
some older subcommands supported partially changing the target directory
(where Terraform would use the new directory inconsistently) where newer
commands did not support that override at all.
Instead, now Terraform will accept a -chdir command at the start of the
command line (before the subcommand) and will interpret it as a request
to direct all actions that would normally be taken in the current working
directory into the target directory instead. This is similar to options
offered by some other similar tools, such as the -C option in "make".
The new option is only accepted at the start of the command line (before
the subcommand) as a way to reflect that it is a global command (not
specific to a particular subcommand) and that it takes effect _before_
executing the subcommand. This also means it'll be forced to appear before
any other command-specific arguments that take file paths, which hopefully
communicates that those other arguments are interpreted relative to the
overridden path.
As a measure of pragmatism for existing uses, the path.cwd object in
the Terraform language will continue to return the _original_ working
directory (ignoring -chdir), in case that is important in some exceptional
workflows. The path.root object gives the root module directory, which
will always match the overriden working directory unless the user
simultaneously uses one of the legacy directory override arguments, which
is not a pattern we intend to support in the long run.
As a first step down the deprecation path, this commit adjusts the
documentation to de-emphasize the inconsistent old command line arguments,
including specific guidance on what to use instead for the main three
workflow commands, but all of those options remain supported in the same
way as they were before. In a later commit we'll make those arguments
produce a visible deprecation warning in Terraform's output, and then
in an even later commit we'll remove them entirely so that -chdir is the
single supported way to run Terraform from a directory other than the
one containing the root module configuration.
2020-09-02 00:45:12 +02:00
## Passing a Different Configuration Directory
Terraform v0.13 and earlier also accepted a directory path in place of the
plan file argument to `terraform apply` , in which case Terraform would use
that directory as the root module instead of the current working directory.
That usage is still supported in Terraform v0.14, but is now deprecated and we
plan to remove it in Terraform v0.15. If your workflow relies on overriding
the root module directory, use
[the `-chdir` global option ](./#switching-working-directory-with--chdir )
instead, which works across all commands and makes Terraform consistently look
in the given directory for all files it would normaly read or write in the
current working directory.
If your previous use of this legacy pattern was also relying on Terraform
writing the `.terraform` subdirectory into the current working directory even
though the root module directory was overridden, use
[the `TF_DATA_DIR` environment variable ](environment-variables.html#TF_DATA_DIR )
to direct Terraform to write the `.terraform` directory to a location other
than the current working directory.