【问题标题】:Terraform - what is null provider?Terraform - 什么是空提供者?
【发布时间】:2021-09-04 05:36:04
【问题描述】:

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

我浏览了 Terraform 文档 - https://registry.terraform.io/providers/hashicorp/null/latest/docs,但帮助不大。

空提供者

null 提供程序是一个非常不寻常的提供程序,它具有构造 故意什么都不做。这听起来可能很奇怪,而且确实 在大多数情况下不需要使用这些结构,但它们可以 在各种情况下很有用,以帮助协调棘手的行为或 解决限制。

此提供程序的每个功能的文档,可通过 导航,给出了这些构造可能的情况的示例 证明有用。

使用 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"
}

【问题讨论】:

  • 进展如何?仍然不清楚 null 提供程序?

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

您正在使用空资源主要null_resource

null 资源的主要用例是作为供应商采取的任意操作的无操作容器。

正如描述所写,您主要将它与provisioners 一起使用,例如local-execremote-exec

一个常见的场景是在创建大量资源时使用local-execremote-exec 执行自定义操作。这种情况的示例是在资源创建中引入延迟,如图here

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"]
}

【讨论】:

    【解决方案2】:

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

    @Marcin 回答概述了一个使用null_resourcelocal-exec 的示例,我想我会扩展一个具体示例,说明何时必须使用remote_exec

    我遇到了一个问题,即我无法销毁具有 aws_volume_attachment 的 EC2 aws_instance,因为在销毁之前未分离 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"
        ]
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2015-02-09
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多