Terraform - 什么是空提供者?

jov*_*ven 5 amazon-web-services terraform terraform-provider-aws

我想知道 terraform null 提供程序的真正用途是什么以及何时使用和不使用它。

我已经浏览了 Terraform 文档 - https://registry.terraform.io/providers/hashicorp/null/latest/docs 但没有什么帮助。

空提供者

空提供程序是一个相当不寻常的提供程序,它具有故意不执行任何操作的构造。这可能听起来很奇怪,实际上在大多数情况下不需要使用这些构造,但它们在各种情况下都非常有用,可以帮助协调棘手的行为或解决限制。

该提供程序的每个功能的文档(可通过导航访问)给出了这些构造可能有用的情况的示例。

使用 null 提供程序可能会使 Terraform 配置更难以理解。虽然它在某些情况下可能有用,但应谨慎使用,并在可用时首选其他解决方案。

有人可以详细说明吗? 但它们在各种情况下都非常有用,可以帮助协调棘手的行为或解决限制。并提供进一步的参考来探索该提供商。

-- 这就是我的providers.tf 文件的样子-

provider "aws" {
  alias   = "primary"
  region  = "us-east-1"
  profile = "${local.primary_aws_profile}"
  version = "~> 2.70.0"
}

provider "template" {
  version = "~> 1.0"
}

provider null {
  version = "~> 1.0"
}
Run Code Online (Sandbox Code Playgroud)

Fer*_*min 6

有人可以详细说明吗?但它们在各种情况下都非常有用,可以帮助协调棘手的行为或解决限制。并提供进一步的参考来探索该提供商。

@Marcin 答案概述了一个使用null_resourcewith 的示例local-exec,我想我应该用一个具体的例子来扩展我何时必须使用 with 的一个例子remote_exec

我遇到了一个问题,我无法销毁aws_instance具有 的EC2 aws_volume_attachment,因为 EBS 卷在销毁之前未分离。null_resource解决方法是在实例和卷附件销毁时使用卸载卷。

resource "aws_instance" "instance" { ..snip .. }

resource "aws_ebs_volume" "data" { ..snip.. }

resource "aws_volume_attachment" "data_att" {
  device_name  = "/dev/sdf"
  volume_id    = aws_ebs_volume.data.id
  instance_id  = aws_instance.instance.id
}

resource "null_resource" "unmount_data_drive" {
  triggers = {
    public_ip = aws_instance.instance.public_ip
  }

  depends_on = [aws_volume_attachment.data_att, aws_instance.instance]

  provisioner "remote-exec" {
    when       = destroy
    on_failure = continue
    connection {
      type        = "ssh"
      agent       = false
      host        = self.triggers.public_ip
      user        = "ubuntu"
      private_key = file(var.key_pair)
    }
    inline = [
      "sudo umount /opt/data",
      "sudo sed -i '/opt\\/data/d' /etc/fstab"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*cin 4

您正在使用空资源主要 null_resource

空资源的主要用例是作为配置者采取的任意操作的不执行任何操作的容器。

正如描述所写,您主要将其与诸如和 之类的配置程序一起使用。local-execremote-exec

local-exec一个常见的场景是使用和remote-exec当创建多个资源时执行自定义操作。这种情况的示例是在资源创建中引入延迟,如下所示

resource "null_resource" "before" {
}

resource "null_resource" "delay" {
  provisioner "local-exec" {
    command = "sleep 10"
  }
  triggers = {
    "before" = "${null_resource.before.id}"
  }
}

resource "null_resource" "after" {
  depends_on = ["null_resource.delay"]
}
Run Code Online (Sandbox Code Playgroud)