summaryrefslogtreecommitdiff
path: root/doc/user/infrastructure/iac/gitlab_terraform_helpers.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/user/infrastructure/iac/gitlab_terraform_helpers.md')
-rw-r--r--doc/user/infrastructure/iac/gitlab_terraform_helpers.md137
1 files changed, 137 insertions, 0 deletions
diff --git a/doc/user/infrastructure/iac/gitlab_terraform_helpers.md b/doc/user/infrastructure/iac/gitlab_terraform_helpers.md
new file mode 100644
index 00000000000..8be949c40cd
--- /dev/null
+++ b/doc/user/infrastructure/iac/gitlab_terraform_helpers.md
@@ -0,0 +1,137 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# GitLab Terraform helpers **(FREE)**
+
+GitLab provides two helpers to ease your integration with the [GitLab-managed Terraform State](terraform_state.md).
+
+- The `gitlab-terraform` script, which is a thin wrapper around the `terraform` command.
+- The `terraform-images` container images, which include the `gitlab-terraform` script and `terraform` itself.
+
+Both helpers are maintained in the [Terraform Images](https://gitlab.com/gitlab-org/terraform-images)
+project.
+
+## `gitlab-terraform`
+
+The `gitlab-terraform` script is a thin wrapper around the `terraform` command.
+
+Run `gitlab-terraform` in a CI/CD pipeline to set up the necessary environment
+variables to connect to the [GitLab-managed Terraform State](terraform_state.md) backend.
+
+### Source (but do not run) the helper script
+
+When the `gitlab-terraform` script is sourced, it
+configures the environment for a `terraform` call, but does not
+actually run `terraform`. You can source the script when you need to do
+extra steps to prepare your environment, or to use alternative
+tools like `terragrunt`.
+
+To source the script, execute:
+
+```shell
+source $(which gitlab-terraform)
+```
+
+Some shells, like BusyBox, do not support the case
+of another script sourcing your script. For more information, see [this Stack Overflow thread](https://stackoverflow.com/a/28776166).
+To resolve this issue, you should use `bash`, `zsh` or `ksh`, or source `gitlab-terraform` directly
+from the shell.
+
+### Commands
+
+You can run `gitlab-terraform` with the following commands.
+
+| Command | Forwards command line? | Implicit init? | Description |
+|------------------------------|------------------------|-----------------------|--------------------------------------------------------------------------------------------------------|
+| `gitlab-terraform apply` | Yes | Yes | Runs `terraform apply`. |
+| `gitlab-terraform destroy` | Yes | Yes | Runs `terraform destroy`. |
+| `gitlab-terraform fmt` | Yes | No | Runs `terraform fmt` in check mode. |
+| `gitlab-terraform init` | Yes | Not applicable | Runs `terraform init`. |
+| `gitlab-terraform plan` | Yes | Yes | Runs `terraform plan` and produces a `plan.cache` file. |
+| `gitlab-terraform plan-json` | No | No | Converts a `plan.cache` file into a GitLab Terraform report for a [MR integration](mr_integration.md). |
+| `gitlab-terraform validate` | Yes | Yes (without backend) | Runs `terraform validate`. |
+| `gitlab-terraform -- <cmd>` | Yes | No | Runs `terraform <cmd>`, even if it is wrapped. |
+| `gitlab-terraform <cmd>` | Yes | No | Runs `terraform <cmd>`, if the command is not wrapped. |
+
+### Generic variables
+
+When you run `gitlab-terraform`, these variables are configured.
+
+| Variable | Default | Description |
+|----------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `TF_ROOT` | Not set | Root of the Terraform configuration. If set, it is used as the Terraform `-chdir` argument value. All read and written files are relative to the given configuration root. |
+| `TF_CLI_CONFIG_FILE` | `$HOME/.terraformrc` | Location of the [Terraform configuration file](https://developer.hashicorp.com/terraform/cli/config/config-file). |
+| `TF_IN_AUTOMATION` | `true` | Set to `true` to indicate that Terraform commands are automated. |
+| `TF_GITLAB_SOURCED` | `false` | Set to `true` if `gitlab-terraform` [was sourced](#source-but-do-not-run-the-helper-script). |
+| `TF_PLAN_CACHE` | `$TF_ROOT/plan.cache` or `$PWD/plan.cache` | Location of the plan cache file. If `TF_ROOT` is not set, then its path is relative to the current working directory (`$PWD`). |
+| `TF_PLAN_JSON` | `$TF_ROOT/plan.json` or `$PWD/plan.json` | Location of the plan JSON file for [MR integration](mr_integration.md). If `TF_ROOT` is not set, then its path is relative to the current working directory (`$PWD`). |
+| `DEBUG_OUTPUT` | `"false"` | If set to `"true"` every statement is logged with `set -x`. |
+
+### GitLab-managed Terraform state variables
+
+When you run `gitlab-terraform`, these variables are configured.
+
+| Variable | Default | Description |
+|--------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `TF_STATE_NAME` | Not set | If `TF_ADDRESS` is not set, and `TF_STATE_NAME` is provided, then the value of `TF_STATE_NAME` is used as [GitLab-managed Terraform State](terraform_state.md) name. |
+| `TF_ADDRESS` | Terraform State API URL for `$TF_STATE_NAME` | Used as default for [`TF_HTTP_ADDRESS`](https://developer.hashicorp.com/terraform/language/settings/backends/http#address). Uses `TF_STATE_NAME` as [GitLab-managed Terraform State](terraform_state.md) name by default. |
+| `TF_USERNAME` | [`$GITLAB_USER_LOGIN`](../../../ci/variables/predefined_variables.md) or `gitlab-ci-token` if `$TF_PASSWORD` is not set | Used as default for [`TF_HTTP_USERNAME`](https://developer.hashicorp.com/terraform/language/settings/backends/http#username). |
+| `TF_PASSWORD` | [`$CI_JOB_TOKEN`](../../../ci/variables/predefined_variables.md) | Used as default for [`TF_HTTP_PASSWORD`](https://developer.hashicorp.com/terraform/language/settings/backends/http#password). |
+| `TF_HTTP_ADDRESS` | `$TF_ADDRESS` | [Address to the Terraform backend](https://developer.hashicorp.com/terraform/language/settings/backends/http#address). |
+| `TF_HTTP_LOCK_ADDRESS` | `$TF_ADDRESS/lock` | [Address to the Terraform backend lock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#lock_address). |
+| `TF_HTTP_LOCK_METHOD` | `POST` | [Method to use for the Terraform backend lock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#lock_method). |
+| `TF_HTTP_UNLOCK_ADDRESS` | `$TF_ADDRESS/lock` | [Address to the Terraform backend unlock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#unlock_address). |
+| `TF_HTTP_UNLOCK_METHOD` | `DELETE` | [Method to use for the Terraform backend unlock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#unlock_method). |
+| `TF_HTTP_USERNAME` | `$TF_USERNAME` | [Username to authenticate with the Terraform backend](https://developer.hashicorp.com/terraform/language/settings/backends/http#username). |
+| `TF_HTTP_PASSWORD` | `$TF_PASSWORD` | [Password to authenticate with the Terraform backend](https://developer.hashicorp.com/terraform/language/settings/backends/http#password). |
+| `TF_HTTP_RETRY_WAIT_MIN` | `5` | [Minimum time in seconds to wait](https://developer.hashicorp.com/terraform/language/settings/backends/http#retry_wait_min) between HTTP request attempts to the Terraform backend. |
+
+### Command variables
+
+When you run `gitlab-terraform`, these variables are configured.
+
+| Variable | Default | Description |
+|--------------------------|----------|-------------------------------------------------------------------------------------------|
+| `TF_IMPLICIT_INIT` | `true` | If `true`, an implicit `terraform init` runs before the wrapped commands that require it. |
+| `TF_INIT_NO_RECONFIGURE` | `false` | If `true`, the implicit `terraform init` runs without `-reconfigure`. |
+| `TF_INIT_FLAGS` | Not set | Additional `terraform init` flags. |
+
+### Terraform input variables
+
+When you run `gitlab-terraform`, these Terraform input variables are set automatically.
+For more information about the default values, see [Predefined variables](../../../ci/variables/predefined_variables.md).
+
+| Variable | Default |
+|-------------------------------|-------------------------|
+| `TF_VAR_CI_JOB_ID` | `$CI_JOB_ID` |
+| `TF_VAR_CI_COMMIT_SHA` | `$CI_COMMIT_SHA` |
+| `TF_VAR_CI_JOB_STAGE` | `$CI_JOB_STAGE` |
+| `TF_VAR_CI_PROJECT_ID` | `$CI_PROJECT_ID` |
+| `TF_VAR_CI_PROJECT_NAME` | `$CI_PROJECT_NAME` |
+| `TF_VAR_CI_PROJECT_NAMESPACE` | `$CI_PROJECT_NAMESPACE` |
+| `TF_VAR_CI_PROJECT_PATH` | `$CI_PROJECT_PATH` |
+| `TF_VAR_CI_PROJECT_URL` | `$CI_PROJECT_URL` |
+
+## Terraform images
+
+The `gitlab-terraform` helper script and `terraform` itself are provided in container images
+under `registry.gitlab.com/gitlab-org/terraform-images/`. You can use these images to configure
+and manage your integration.
+
+The following images are provided:
+
+| Image name | Tag | Description |
+|-------------------------------|-----------------------------|--------------------------------------------------------------------------------|
+| `stable` | `latest` | Latest `terraform-images` release bundled with the latest Terraform release. |
+| `releases/$TERRAFORM_VERSION` | `latest` | Latest `terraform-images` release bundled with a specific Terraform release. |
+| `releases/$TERRAFORM_VERSION` | `$TERRAFORM_IMAGES_VERSION` | Specific `terraform-images` release bundled with a specific Terraform release. |
+
+For supported combinations, see [the `terraform-images` container registry](https://gitlab.com/gitlab-org/terraform-images/container_registry).
+
+## Related topics
+
+- [Terraform CI/CD templates](index.md)
+- [Terraform template recipes](terraform_template_recipes.md)