标签: terraform

如何使用 Terraform 清除软删除的 APIM?

Azure API 管理现在是“软删除”的,以便您可以在误删除时将其恢复。

使用已删除的名称创建 Azure API 管理会导致名称“已在使用中”错误

使用terraform destroy它时会进行软删除,这使得开发变得棘手,因为您经常想要重新创建它。

如何使用 terraform 清除软删除的 APIM?

azure azure-api-management terraform

1
推荐指数
1
解决办法
2329
查看次数

使用 Terraform 创建多个新实例

我编写了一个 Terraform 脚本,该脚本应该从一个模板创建多个服务器实例。我现在创建了两个不同的变量文件。

但是当我运行脚本时,会使用第一个变量文件创建一个新实例,但使用第二个变量文件时,第一个实例始终会被覆盖/更改。我不知道为什么 Terraform 引用之前新创建的实例。我怎样才能防止这种情况发生?

服务器1.tfvars:

vsphere_user                     = "administrator@vsphere.local"
vsphere_password                 = "#Password"
vsphere_server                   = "vsphere.server"
vsphere_datacenter               = "Datacenter"
vsphere_datastore                = "Storage_1"
vsphere_compute_cluster          = "Cluster"
vsphere_network                  = "Network_1"
vsphere_virtual_machine_template = "Template_Microsoft_Windows_Server_2019_x64_english"
system_name                      = "server-1"
system_cores                     = 2
system_cores_per_socket          = 2
system_memory                    = 2048
system_local_admin_password      = "#Password"
system_ipv4_address              = "172.22.15.11"
system_ipv4_netmask              = 24
system_dns_server_list           = ["172.22.15.101"]
system_ipv4_gateway              = "172.22.15.1"
system_disk1_size                = 75
system_domain_admin_user         = "Administrator"
system_domain_admin_password     = "#Password"
Run Code Online (Sandbox Code Playgroud)

服务器2.tfvars:

vsphere_user                     = "administrator@vsphere.local"
vsphere_password                 = "#Password"
vsphere_server                   = "vsphere.server"
vsphere_datacenter               = "Datacenter" …
Run Code Online (Sandbox Code Playgroud)

vsphere terraform terraform-provider-vsphere

1
推荐指数
1
解决办法
4554
查看次数

Terraform dynamodb 错误 - 必须对所有属性建立索引

我正在尝试使用以下 terraform 资源模块创建一个简单的 dynamodb 表。

运行 terraform 时出现以下错误: 必须对所有属性建立索引。未使用的属性:[“pactitle”“ipadress”“Timestamp”]。 为什么我们需要索引所有属性?如何解决这个问题?

resource "aws_dynamodb_table" "this" {
  count = var.create_table ? 1 : 0

  name             = var.name
  billing_mode     = var.billing_mode
  hash_key         = var.hash_key
  range_key        = var.range_key
  read_capacity    = var.read_capacity
  write_capacity   = var.write_capacity
  //stream_enabled   = var.stream_enabled
  //stream_view_type = var.stream_view_type

  dynamic "attribute" {
    for_each = var.attributes

    content {
      name = attribute.value.name
      type = attribute.value.type
    }
  }


  server_side_encryption {
    enabled     = var.server_side_encryption_enabled
    kms_key_arn = var.server_side_encryption_kms_key_arn
  }

  tags = merge(
    var.tags,
    {
      "Name" = format("%s", var.name)
    }, …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-dynamodb terraform

1
推荐指数
1
解决办法
3985
查看次数

Terraform - 如何创建可选数据块

我创建了一些数据块来查找合适的 AMI。我有 4 个数据块来查找基于 4 个操作系统的 4 个 AMI。例子,

data "aws_ami" "centos" {
    owners = ["123456789"]
    most_recent = true
    filter {
        name = "name"
        values = ["CentOS*${var.os-version}*x86_64"]
    }
}
data "aws_ami" "suse" {
    owners = ["amazon"]
    most_recent = true
    filter {
        name = "name"
        values = ["suse-sles-${var.os-version}-sp*-v????????-hvm-ssd-x86_64"]
    }
}
Run Code Online (Sandbox Code Playgroud)

我像下面这样称呼他们ami_id=data.${os_name}.image-id

所以我想要的是只运行已经被调用的数据块。如果用户选择“suse”,则仅运行 suse 数据块。不是所有的人。现在这是一个问题,因为用户根据操作系统选择版本。例如,16.04 仅适用于 ubuntu,不适用于其他任何版本,因此其他数据块会抛出如下异常,

Error: Your query returned no results. Please change your search criteria and try again.

  on main.tf line 79, in data "aws_ami" "suse":
  79: data …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

1
推荐指数
1
解决办法
4327
查看次数

我们如何在多个 terraform 提供者中创建相同的资源?

我正在使用 terraform 创建 Kubernetes 命名空间。下面的示例

resource "kubernetes_namespace" "test1" {
  metadata {
    name = local.ns_name
  }

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 terraform 按照此链接创建蓝/绿类型的部署。作为其中的一部分,我现在创建了两个 kubernetes 集群。一个是蓝色的,另一个是绿色的,现在我有两个 kubernetes 提供者

provider "kubernetes" {
  alias                  = "kubernetes_blue"
}

provider "kubernetes" {
  alias                  = "kubernetes_green"
}
Run Code Online (Sandbox Code Playgroud)

我想了解是否有一种方法,我可以有一些条件kubernetes_namespace,根据标志var.enable_green_sidevar.enable_blue_side,我可以在多个 kubernetes 集群中创建相同的命名空间,而不必重复整个资源块,如下所示

resource "kubernetes_namespace" "test1" {
  metadata {
    name = local.ns_name
  }

  provider = kubernetes.kubernetes_blue  
}

resource "kubernetes_namespace" "test2" {
  metadata {
    name = local.ns_name
  }

  provider = kubernetes.kubernetes_green  
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

kubernetes terraform terraform-provider-kubernetes

1
推荐指数
1
解决办法
2289
查看次数

Terraform 跳过 null for_each

我正在为 AMI 设置标签。我有 ubuntu 和 EKS AMI,其中 EKS AMI 需要设置 k8s 版本、containerd 等,其他操作系统不需要这些。我已将 EKS 特定的所有变量声明为默认为 null,假设在运行 for_each 时它们会跳过,但会出错。这是代码和错误。

locals {

  tags = {
    docker_version = var.docker_version
    kubernetes = var.k8s_version
    cni_plugin_version = var.cni_plugin_version
    containerd_version = var.containerd_version
    target = var.target
    source_ami_id = var.source_ami_id
    Release = var.ami_release-version
    Description = var.ami_description
    Name = var.ami_name
    Creator = var.creator
  }

data "aws_ami" "ami_image" {
  most_recent      = true
  owners           = ["xxxxxxxx"]
  name_regex = var.ami_regex
}

output "ami_id" {
  value = data.aws_ami.ami_image.id
}
output "ami_arn" {
  value = …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

1
推荐指数
1
解决办法
4182
查看次数

设置 S3 策略时出错:MalformedPolicy:策略语法无效

我正在尝试在 Terraform 中设置 S3 存储桶策略。我在模块中编写了以下代码core/main.tf

\n
resource "aws_s3_bucket_policy" "access_to_bucket" {\n\n  bucket = aws_s3_bucket.some_bucket.id\n\n  policy = jsonencode({\n    Version = "2012-10-17"\n    Statement = [\n      {\n        Action    = ["s3:GetObject", "s3:GetObjectAcl", "s3:ListBucket"]\n        Effect    = "Allow"\n        Principal = "${var.some_variable_name}"\n        Resource = [\n          "${aws_s3_bucket.some_bucket.arn}",\n          "${aws_s3_bucket.some_bucket.arn}/*"\n        ]\n      },\n    ]\n  })\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

然后在本地模块中实例化,该模块使用 localstack 在本地运行。

\n

这是生成的计划:

\n
Terraform will perform the following actions:\n\n  # module.local.aws_s3_bucket_policy.access_to_bucket will be created\n  + resource "aws_s3_bucket_policy" "access_to_bucket" {\n      + bucket = "some_bucket"\n      + id     = (known after apply)\n      + policy …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services terraform terraform-provider-aws

1
推荐指数
1
解决办法
4626
查看次数

如何通过 terraform 将快照计划添加到 GCP boot_disk

我正在尝试将快照计划添加到 vm_instance 的启动磁盘。

provider "google" {
  project = "xxxxxx"
}
resource "google_compute_instance" "xxxxxx" {
  name         = "xxxxxx"
  machine_type = "xxxxxx"
  zone         = "xxxxxx"

  boot_disk {
    initialize_params {
      image = "???"
    }
  }
  metadata_startup_script = ";;"
  network_interface {
    network = "default"
   }
}      
Run Code Online (Sandbox Code Playgroud)

我知道如何将计划添加到外部磁盘: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_disk_resource_policy_attachment

但是如何使用 vm_instance 磁盘执行此操作呢?

谢谢

disk google-cloud-platform terraform terraform-provider-gcp

1
推荐指数
1
解决办法
3985
查看次数

为什么 `terraform fmt` 似乎没有改变任何内容却输出文件名?

我有一个文件 A,已提交到 git 中。

如果我做了terraform fmt --check --recursive .它输出A.

但是,如果我随后执行 a,git diff我会得到空白输出并且git status报告没有任何更改。

如果我再次重新运行terraform fmt --check --recursive .它输出A.

有什么建议吗?出了什么问题?

我对https://www.terraform.io/docs/cli/commands/fmt.html的理解 是,如果它更改了该文件,它只会输出文件名。

例子

resource "aws_vpc" "test_vpc" {
  cidr_block = "192.168.0.0/16"
  instance_tenancy = "default"
}
Run Code Online (Sandbox Code Playgroud)

问题出在这一行:instance_tenancy。在 vi 中查看它,我看不到任何奇怪的字符。

Terraform v0.15.4
on linux_amd64
+ provider registry.terraform.io/hashicorp/aws v3.37.0
Run Code Online (Sandbox Code Playgroud)

terraform

1
推荐指数
1
解决办法
677
查看次数

true 和 false 结果表达式必须具有一致的类型。给定的表达式分别是字符串和数字的列表

我正在尝试使用 terraform 代码创建中转网关 VPC 附件,但是,当我执行 terraform 计划时出现以下错误;\nterraform 版本为 0.12

\n

错误:-

\n
\xe2\x94\x82 Error: Inconsistent conditional result types\n\xe2\x94\x82\n\xe2\x94\x82   on vpn-dynamic\\main.tf line 67, in resource "aws_ec2_transit_gateway_vpc_attachment" "tgw_vpc_attachment":\n\xe2\x94\x82   67:   subnet_ids         = lower(var.transit_gateway) == "enabled" ? var.tgw_subnet_ids : 0\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\xe2\x94\x82     \xe2\x94\x82 var.tgw_subnet_ids is a list of string, known only after apply\n\xe2\x94\x82     \xe2\x94\x82 var.transit_gateway is a string, known only after apply\n\xe2\x94\x82\n\xe2\x94\x82 The true and false result expressions must have consistent types. The given expressions are list of      \n\xe2\x94\x82 string and number, respectively.\n
Run Code Online (Sandbox Code Playgroud)\n

main.tf:- …

amazon-web-services terraform

1
推荐指数
1
解决办法
2万
查看次数