Как создать файл terraform backend.tf из python перед выполнением, чтобы устранить проблему с файлом состояния интерполяции - PullRequest
0 голосов
/ 31 октября 2019

На самом деле мы создаем веб-приложение, оттуда передаем переменные в terraform на

, как показано ниже

terraform apply -input=false -auto-approve -var ami="%ami%" -var region="%region%" -var icount="%count%" -var type="%instance_type%"

На самом деле проблема заключалась в том, что бэкэнд не поддерживает переменные, мне нужно передать туда значениятакже создайте приложение.

Чтобы решить эту проблему, я нашел какое-то решение, например, нам нужно создать backend.tf перед выполнением.

Но я не могу понять, как это сделать, если у кого-то есть какие-либоПримеры относительно этого, пожалуйста, помогите мне.

Заранее спасибо ..

Мне нужно создать файл backend.tf из python, используя переменные ниже.

И нужно заменить ключ= "$ {profile} / tfstate

для каждого профиля, который требуется заменить профилем

Я думаю об использовании git-репо с помощью git, мы создаем файлы и извлекаем значения и снова фиксируем и выполняем

Пожалуйста, помогите мне с некоторыми примерами и идеями.

Код как ниже:

Мой main.tf как ниже

terraform {
    backend “s3” {
        bucket = “terraform-007”
        key = “key”
        region = “ap-south-1”
        profile=“venu”
    }
} 

provider “aws” {
    profile = “ var.awsprofile"
    region="{var.aws_region}”
}

resource “aws_instance” “VM” {
    count = var.icount
    ami = var.ami
    instance_type = var.type
    tags = {
        Environment = “${var.env_indicator}”
    }
}

vars.tfкак

variable “aws_profile” {
    default = “default”
    description = “AWS profile name, as set in ~/.aws/credentials”
}

variable “aws_region” {
    type = “string”
    default = “ap-south-1”
    description = “AWS region in which to create resources”
}

variable “env_indicator” {
    type = “string”
    default = “dev”
    description = “What environment are we in?”
}

variable “icount” {
    default = 1
}

variable “ami” {
    default =“ami-54d2a63b”
}

variable “bucket” {
    default=“terraform-002”
}

variable “type” {
    default=“t2.micro”
}

output.tf как:

output “ec2_public_ip” {    
    value = ["${aws_instance.VM.*.public_ip}"]    
}

output “ec2_private_ip” {
    value = ["${aws_instance.VM.*.private_ip}"]
}

На самом деле проблема здесь заключалась в том, что бэкэнд не поддерживает переменные, мне нужно передавать туда значения и из приложения.

Чтобы решить эту проблему, я нашел какое-то решение, например, что нам нужно создать backend.tf перед тем, какказнь.

Но я не могу понять, как это сделать, если кто-нибудь, имеющий какие-либо примеры по этому поводу, пожалуйста, помогите мне.

Заранее спасибо ..

1 Ответ

0 голосов
/ 31 октября 2019

Поскольку конфигурация для бэкэнда не может использовать интерполяцию, мы использовали подход конфигурации по соглашению.

  1. Terraform для всех наших коллекций состояний (микросервисов и другой инфраструктуры) используетта же корзина S3 для хранения состояний и та же таблица DynamoDB для блокировки.

  2. При выполнении terraform мы используем ту же роль IAM (выделенный пользователь только terraform).

  3. Мы определяем ключ для состояния черезсоглашение, так что его не нужно генерировать.

    key = "platform/services/{name-of-service}/terraform.tfstate"
    

Я бы избегал процесса, который приводит к изменениям в коде инфраструктуры при его развертывании для обеспечения максимального понимания. способность инженеров читать / поддерживать код.

РЕДАКТИРОВАТЬ: Добавление ключевых примеров

Для пользовательской службы:

key = "platform/services/users/terraform.tfstate"

Для службы поиска:

key = "platform/services/search/terraform.tfstate"

Для обслуживания продукта:

key = "platform/services/products/terraform.tfstate"
...