Как обещали в моей последней статье, Terraform AWS — динамические подсети Сегодня вы собираетесь научиться управлять Рабочие пространства В террафоре, которые просто используются для сегрегирования ваших разрабатывающих сред (разработчика, QA, Stage, Prod), разделяя ту же инфраструктуру между ними. Мы также воспользуемся бесплатным Террафору облако Сервис для удаленного хранения файла состояния (tfstate) удаленно.
- Поделиться той же инфраструктурой, что и код (IAC) в нескольких средах (рабочие пространства)
- Хранить tfstate file Удаленно Разрешить коллегам управлять инфраструктурой, вы работаете над
- Вы читаете мой Terraform AWS — динамические подсети Учебник, который охватывает большую часть функций террафора, которые я буду использовать в этом руководстве
- Вы знаете, как использовать AWS по имени профили
- Репозиторий вашей инфраструктуры в один Из следующего: github, gitlab или bitbucket. Репозиторий я буду пользоваться в Гадость
- Я создам один ведро S3 Bucket. Мы сможем создать этот ресурс в каждой среде, просто переключающие рабочие пространства; мы доберемся до этого
Создать рабочие пространства
- Создайте бесплатный аккаунт в Terraporm Cloud
- Создать новую организацию; Я создал Учебники Организация
- Создайте новое рабочее пространство и подключите его к поставщику VCS. Выберите Только выберите репозитории и выберите соответствующий репозиторий, в моем случае, это TF-Tutorial-Workspaces
- Нажмите имя репозитория, чтобы продолжить
- Имя рабочей области должно быть названием среды, над которой вы работаете, в моем случае TF-Tutorial-Workspaces- Развитие
- (Необязательно) Настройка Workspace Дополнительные параметры — Вставить ветвь VCS в случае необходимости. Я буду использовать Мастер ветка
- Нажмите Создать рабочее пространство Действительно
- Повторите шаги с 3 по 7, в моем случае: TF-tutorial-workspaces- QA. , TF-Tutorial — рабочие пространства- Постановка , TF-Tutorial — рабочие пространства- производство
- Для каждого созданного рабочего пространства, которые вы создали, нажмите WorksPaces -> Нажмите имя рабочего пространства -> Настройки -> Общие -> Режим выполнения: Местный
Важно : Режим выполнения по умолчанию для каждого рабочего пространства является удаленным, что является лучшей практикой для выполнения плана террафора. К сожалению, есть ошибка, и режим удаленного выполнения не работает с переменной Terraform.workspace.
. Убедитесь, что вы устанавливаете режим исполнения в локальный, пока эта ошибка не будет исправлена, вы можете отслеживать его здесь, Выпуск 22802 Отказ
Страница рабочее пространство должна выглядеть что-то подобное:
Теперь пришло время генерировать токен, который позволит нам использовать рабочие пространства, которые мы создали.
Террафом облако токенс
Есть два типа токенов, которые мы собираемся использовать, первый — Team Token , который мы будем использовать в наших процессах автоматизации и CI/CD-трубопроводы. Второй токен это Токен пользователя и мы будем использовать его для планирования/применения инфраструктуры вручную, Так что это обычно хорошо для планирования и тестирования. В этом руководстве мы создадим оба токена.
Примечание : В случае, если вы обеспокоены двумя факторными аутентификацией, он будет игнорироваться при использовании токенов в качестве метода аутентификации, поэтому удерживайте это в виду.
Командный токен
- Создайте файл .terraformrc-team в каталоге вашего проекта, с Bash это
Touch/.terraformrc-team
- Генерировать токен в облаке Terraform; Нажмите на настройки -> Команды -> Создать токен аутентификации
- Отредактируйте файл /.terraformrc-team с Bash это:
vim/.terraformrc-team
затем ударить Я Для вставки режима Файл должен выглядеть так:
credentials "app.terraform.io" { token = "Your.generated.team.token.xctOeIoLtmjydg.jCCpJ6GKjCCpJe" }
Vim : Чтобы сохранить файл в VIM, нажмите ESC , тип: : x
и ударить Введите Отказ Чтобы убедиться, что файл был правильно сохранен, выполнить Cat/.terraformrc.
Выходной вывод должен выглядеть как приведенный выше пример. Вот отличный Vim-Notebook Отказ И если вы задаете себе, зачем использовать Vim, затем прочитайте Vim: от врага другу за 9 минут
Токен пользователя
- Создайте файл .terraformrc-user В каталоге вашего проекта с Bash это
touch/.terraformrc-user.
- Генерировать токен в облаке Terraform; Нажмите на фотографию своего профиля -> Настройки пользователя -> Токены -> Создать токен
- Отредактируйте файл /.terraformrc-user с Bash это:
vim/.terraformrc-user
затем ударить Я Для вставки режима Файл должен выглядеть так:
credentials "app.terraform.io" { token = "Your.generated.user.token.xctOeIoLtmjydg.jCCpJ6GKjCCpJe" }
Настройка профилей AWS с именем
Чтобы иметь возможность применять изменения, мы создадим именованный профиль для каждой среды (рабочее пространство).
Примечание : Разработчики террафора решили использовать Word Workspace вместо окружающей среды из-за чрезмерного использования этого слова, см. Здесь Анкет Правильный выбор (не шучу).
Учетные данные и файл конфигурации должны выглядеть так: ~/.aws/учетные данные
[tf-tutorial-workspaces-development] aws_access_key_id = ACCESS_KEY_FOR_DEVELOPMENT aws_secret_access_key = ZKBZ6_rsRFJx+bU2#=jY]w%u_e!Xrau?9fc!}:}c [tf-tutorial-workspaces-qa] aws_access_key_id = ACCESS_KEY_FOR_QA aws_secret_access_key = K9N?Bjb:w>Uyw9w.k^,Ap2BK-7CbsZ^fY*J3t}vp [tf-tutorial-workspaces-staging] aws_access_key_id = ACCESS_KEY_FOR_STAGING aws_secret_access_key = VpKHs2*Urp3BhE3j~MVC9@W&TpR.aQu?s.n.PrBP [tf-tutorial-workspaces-production] aws_access_key_id = ACCESS_KEY_FOR_PRODUCTION aws_secret_access_key = Kk~Xo&Z>3QKi-M%Vq6]LRLNAwy>7R-q4=C2rGJ8x
~/.aws/конфигурация
[profile tf-tutorial-workspaces-development] output = json [profile tf-tutorial-workspaces-qa] output = json [profile tf-tutorial-workspaces-staging] output = json [profile tf-tutorial-workspaces-prodcution] output = json
Настройка бэкэнда
Теперь нам нужно настроить нашу инфраструктуру для использования Удаленный бэкэнд Терраформ Анкет
Структура проекта:
. ├── LICENSE ├── README.md ├── main.tf └── variables.tf
main.tf
Сначала давайте настроим main.tf
:
main.tf
provider "aws" { version = "~> 2.28" profile = lookup(local.profile, local.environment) region = lookup(local.region, local.environment) } terraform { required_version = "~> 0.12" backend "remote" { hostname = "app.terraform.io" organization = "tutorials" workspaces { prefix = "tf-tutorial-workspaces-" } } }
Некоторые объяснения к коду выше:
- Профиль — будет выбран в соответствии с окружающей средой (рабочее пространство)
- регион — будет выбран в соответствии с окружающей средой (рабочее пространство)
Бэкэнд «remote» {} — Настройка нашего бэкэнда
- Имя хоста — Это конфигурация, которая сообщает нашим TFState для удаленного в app.terrasom.io (Терраформ облако)
- Организация — организация, которую мы создали в облаке террафора
- Рабочие пространства — Поскольку мы используем несколько рабочих областей (среды), нам нужно использовать ключевое слово префикс Анкет Возьмите префикс ваших рабочих областей и добавьте тире ( — ) до конца его, как и в коде выше
Важно : Конфигурация бэкэнда в настоящее время не поддерживает использование переменных/локальных значений. Мы должны жесткокодировать наш префикс; В противном случае я бы использовал "$ {local.profile_prefix} -"
variables.tf
Переход к variables.tf
Файл, вот где происходит волшебство. Прежде чем я делюсь 30 строк кода с вами, давайте сломаем его для наших потребностей и как мы отвечаем на эти потребности.
- app_name — Нам нужно дать имя нашего приложения, это будет служить префиксом для всех наших ресурсов
- profile_prefix . — Для удобства будет использоваться в местном значении профиль
- Профиль — Нам нужна карта для профиля на окружающую среду (Workspace), используемая в
main.tf.
- регион — Нам нужна карта для региона на среду (рабочее пространство), также используемая в
main.tf.
- окружающая среда — Нам нужно инициализировать эту переменную с именем Workspace, в настоящее время использую, к счастью, у нас есть
Terraform.workspace
для этого - common_tags — Для удобства мы будем использовать его во всех ресурсах, это поможет нам отметить ресурсы, которые управляются Terraform
- name_prefix — Для удобства мы будем использовать его во всех ресурсах
variables.tf
locals { app_name = "workspaces-app" profile_prefix = "tf-tutorial-workspaces" } locals { profile = { "development" = "${local.profile_prefix}-development" "qa" = "${local.profile_prefix}-qa" "staging" = "${local.profile_prefix}-staging" "production" = "${local.profile_prefix}-production" } region = { "development" = "us-west-2" "qa" = "us-east-2" "staging" = "us-east-1" "production" = "ca-central-1" } } locals { environment = "${terraform.workspace}" } locals { common_tags = { Terraform = "true" Environment = local.environment } name_prefix = "${local.app_name}-${local.environment}" }
Примечание : Я разделил локальные значения на четыре группы, чтобы сделать его более читаемым и организованным.
Все готово! Теперь нам нужно инициализировать террафору, чтобы заставить его работать с рабочими пространствами и удаленной бэкэнда, которая хранит TFstate.
Выберите соответствующие файл конфигурации Terraformrc
Мы создали файлы Terraformrc-команда
и Terraformrc-user
, так как мы выполняем ручную работу, и мы не выполняем CI/CD-трубопровод, мы будем использовать Terraformrc-user
Отказ Переменная среды Tf_cli_config_file Определяет местоположение файла конфигурации, которое будет использоваться для текущего запуска.
Предполагая, что ваш текущий рабочий каталог является каталогом вашего проекта:
export TF_CLI_CONFIG_FILE="${PWD}/.terraformrc-user"
Вы можете автоматически установить эту среду переменную на систему запуска, следуйте этим инструкциям: Windows Git Bash , Ubuntu , Macos Анкет Убедитесь, что вы замените $ {Pwd}
с абсолютным путем к .terraformrc-user.
Инициализировать терраформ
Убедитесь, что вы находитесь в рабочем режиме репозитория, в моем случае это ./tf-tutorial-workspaces
Анкет
Выполнять:
terraform init
При предложении выбрать рабочую область, вставить один (1) и нажмите Введите это не имеет значения в этот момент.
Ожидаемый выход:
Initializing the backend... The currently selected workspace (default) does not exist. This is expected behavior when the selected workspace did not have an existing non-empty state. Please enter a number to select a workspace: 1. development 2. production 3. qa 4. staging Enter a value: 1 Initializing provider plugins... - Checking for available provider plugins... - Downloading plugin for provider "aws" (hashicorp/aws) 2.29.0... Terraform has been successfully initialized! # omitted the rest of the text for brevity
Устранение неполадок — Террафор
» Local.environment — по умолчанию »
Эта ошибка происходит, когда режим выполнения удален в настройках рабочей области. Режим удаленного выполнения не работает с Terraform.workspace
Переменная, поэтому убедитесь, что вы устанавливаете его в настройках рабочей области к локальному, по крайней мере, до тех пор, пока Выпуск22802 фиксированный.
Все, что мы делали до сих пор, было первоначальной настройкой. Теперь расскажите своим коллегам:
- Создайте учетную запись в Terraporm Cloud — и тогда вам нужно добавить их в свою организацию, нажмите Название организации -> Настройки -> Команды -> Владельцы -> Добавить новый член
- Если вы не можете видеть владельцы , тогда все в порядке, нажмите «Добавить пользователей», и он добавит этого пользователя к Владельцы команда. Владельцы Команда — команда по умолчанию
- Настройте учетные данные террафора с токеном пользователя в
.terraformrc-user
— Как вы делали ранее. Не забудьте выбрать TF_CLI_CONFIG_FILE - Создайте AWS по имени профили (Config, учетные данные), как вы делали ранее
- Выполнить
Terraform Init.
Ваши коллеги теперь будут использовать тот же файл TFState, который вы используете, и они могут получить доступ к рабочаемым пространствам, которые вы уже создали.
Примечание : Вместо добавления пользователей в Владельцы
Команда, вы должны создать команду на отделение/фактическую команду, например, разработчики команды, операционная команда и т. Д.
Выберите рабочее пространство (среда)
Вы будете поражены тем, насколько просто нужно выбрать среду, вот имеющиеся доступные команды:
Список рабочего пространства Terraform
— список доступных рабочих пространствTerraporm Workspace Выберите Workspace_Name
— Выбирать Соответствующее рабочее пространствоTerraporm Workspace Show
— показывает Выбранное рабочее пространствоТеррафом применяется
— Применить изменения в инфраструктуруТеррафору уничтожить
— уничтожить инфраструктуру
Добавление ресурсов в ваш репозиторий Git
Добавим ведро S3:
s3.tf
resource "aws_s3_bucket" "bucket" { count = "${lookup(local.create_s3, local.environment)}" bucket = "${local.name_prefix}-s3" acl = "private" region = "${lookup(local.region, local.environment)}" versioning { enabled = true } tags = local.common_tags }
S3.variables.tf
— Хороший пример того, как мы можем контролировать создание ресурсов на среду.
locals { create_s3 = { "development" = 0 "qa" = 1 "staging" = 1 "production" = 1 } }
Текущая структура проекта:
. ├── LICENSE ├── README.md ├── main.tf ├── s3.tf ├── s3.variables.tf └── variables.tf
Этот проект доступен на GitHub:
Unfor19/TF-Tutorial-Workspaces
Узнайте, как использовать облако и рабочие пространства Terraform
Пример
$ terraform workspace list * development production qa staging $ terraform workspace select qa $ terraform apply Acquiring state lock. This may take a few moments... # omitted text for brevity # aws_s3_bucket.bucket[0] will be created + resource "aws_s3_bucket" "bucket" { + acceleration_status = (known after apply) + acl = "private" + arn = (known after apply) + bucket = "workspaces-app-qa-s3" + bucket_domain_name = (known after apply) + bucket_regional_domain_name = (known after apply) + force_destroy = false + hosted_zone_id = (known after apply) + id = (known after apply) + region = "us-east-2" + request_payer = (known after apply) + tags = { + "Environment" = "qa" + "Terraform" = "true" } # omitted arguments for brevity } Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions in workspace "qa"? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value:
Посмотрите на имя и регион S3! Все указывает, что мы работаем на рабочем пространстве QA, Woohoo!
Устранение неполадок — Террафор
Error: error starting operation: The configured "remote" backend encountered an unexpected error: invalid value for workspace
Вы выполнили План терраформ
или терраформ применить
без выбора рабочего пространства. Убедитесь, что вы выбираете рабочее пространство в первую очередь.
Terraporm Cloud Service по-прежнему новый, но это фантастически, и если у вас есть какие-либо вопросы или комментарии, пожар по воле!
Моя следующая статья будет о том, как использовать 3-й партийные двоичные файлы, такие как AWS-Vault и Terraform, в Windows Git Bash.
Вам понравился этот учебник? Хлопать/сердце/единорог и поделиться этим с друзьями и коллегами.
Первоначально опубликовано в https://prodops.io 6 октября 2019 года.
Оригинал: «https://dev.to/prodopsio/terraform-workspaces-and-remote-state-3min»