Я понимаю, что это, вероятно, ОЧЕНЬ глупый вопрос. Но я не могу найти ответ!
Я изучаю Terraform уже несколько дней и создал сценарий для настройки различной инфраструктуры/ресурсов, таких как виртуальные машины, группы ресурсов, виртуальные сети, подсети, группы безопасности сети и т. д. Скрипт принимает имя в качестве переменной и создает все, что мне нужно - и это здорово.
Моя проблема в том, как мне сделать этот скрипт многоразовым? В настоящее время я использую его в VS Code, но планирую вскоре перенести его на конвейер DevOps. Однако на данный момент я могу запустить его только один раз.
Например, если я запускаю скрипт с именем клиента «Желтый»:
resource "azurerm_resource_group" "NewTest-RG1" {
name = "${var.Client_name}-RG01"
location = "UK South"
}
Затем, если я снова запущу сценарий с именем клиента «Blue», я хочу, чтобы он создал новую группу ресурсов под названием «Blue-RG01». Вместо этого он пытается уничтожить «Желтую» группу ресурсов, а затем создать «Синюю».
Я хочу иметь возможность многократно запускать этот сценарий для множества разных клиентов, не разрушая при этом какую-либо ранее созданную инфраструктуру; но, похоже, я могу запускать его только для одного клиента одновременно. Я встречал упоминания о модулях и рабочих пространствах как о возможных решениях, но не нашел четкого ответа.
Любая помощь будет принята с благодарностью.
Спасибо!
См. Работа с несколькими средами в Terraform.
Вы можете использовать файл удаленного состояния с модулем для переключения рабочей области вместо удаления существующих ресурсов. Используя этот метод, вы можете создавать новые ресурсы, не уничтожая существующие, вот мой результат рабочее пространство terraform новый желтый, рабочее пространство terraform выберите желтый, примените terraform
Значит, рабочие пространства — лучший способ для этого? Это также можно настроить и совместимо через конвейер Azure DevOps?
AFAIK, да, в DevOps Pipeline вы можете использовать EnvironmentVariables для выбора рабочего пространства перед применением terraform.
Вы можете использовать файл remote state
с модулем для переключения рабочей области вместо ресурсов deleting existing
. Используя этот метод, вы можете создавать новые ресурсы, не уничтожая существующие.
├── 1.main.tf
├── modules/
│ └── my-module/
│ ├── resource.tf
│ ├── variables.tf
│
provider "azurerm" {
features {}
}
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
}
}
backend "azurerm" {
resource_group_name = "Automation_RG"
storage_account_name = "sampledemotest"
container_name = "demo"
key = "terraform.tfstate"
access_key = "= = "
}
}
locals {
current_workspace = terraform.workspace
}
module "Block_client" {
source = "./my-module"
client_name = "Block"
location = "eastus"
count = local.current_workspace == "Block" ? 1 : 0
}
module "blue_client" {
source = "./my-module"
client_name = "Blue"
location = "eastus2"
count = local.current_workspace == "blue" ? 1 : 0
}
module "Green_client" {
source = "./my-module"
client_name = "Green"
location = "eastus2"
count = local.current_workspace == "Green" ? 1 : 0
}
module "Red_client" {
source = "./my-module"
client_name = "Red"
location = "eastus"
count = local.current_workspace == "Red" ? 1 : 0
}
мой модуль
ресурс.tf
resource "azurerm_resource_group" "rg" {
name = "${var.client_name}-RG01"
location = var.location
}
переменные.tf
variable "client_name" {
type = string
}
variable "location" {
type = string
default = "eastus"
}
Вывод Terrafrom:
Если вы хотите создать другую группу ресурсов, просто измените рабочую область, используя команды ниже.
terraform workspace new Red
terraform workspace select Red
terraform apply
Выход:
Спасибо за это! Это «стандартный» способ? Или я могу ПРОСТО использовать рабочие пространства?
Вы можете использовать Workspace для создания тех же ресурсов, не уничтожая существующие ресурсы путем изменения рабочего пространства.
@MichaelBrown Хорошо принять решение, если оно решило проблему. Это во благо сообщества SO, смотрите SO Ссылка
Имейте разные файлы состояния для каждого клиента. (или среды) Удаленное хранилище состояний является для этого благом.