我想知道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"
}
有些人可能会详述-,但它们在各种情况下都很有用,可以帮助协调棘手的行为或绕过限制。并提供进一步的参考资料来探索此提供商。
@Marcin的回答概述了一个使用null_resource
和local-exec
的例子,我想我应该用一个具体的例子来扩展,说明我何时必须使用remote_exec
。
我遇到了一个问题,无法销毁具有aws_volume_attachment
的EC2aws_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"
]
}
}
您使用的是null资源primary null_resource:
null资源的主要用例是作为一个不做任何事情的容器,用于提供程序所采取的任意操作。
正如描述所写,您主要将其与local-exec
和remote-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"]
}