我正在将打包程序与ansible Provisioner一起使用以构建一个ami,并使用terraform将该ami作为源来设置基础架构-类似于本文:http://www.paulstack.co.uk/blog/2016/01/02/building-an-elasticsearch-cluster-in-aws-with-packer-and-terraform

当命令packer build pack.json成功完成时,我得到以下格式的输出ami id:

eu-central-1: ami-12345678

在我的terraform变量variables.tf中,我需要指定源ami id,区域等。这里的问题是我不想手动或多次指定它们。对于区域(我事先知道),这很容易,因为我可以在两种情况下都使用环境变量,但是输出ami呢?是否有一种内置的方法来链接这些产品,或者有一些不那么拙劣的方法来实现这些目的?

编辑:对于可能感兴趣的任何人的Hacky方法。在此解决方案中,我使用packt输出的awt区域和ami进行grep编码,并在perl中使用正则表达式将结果写入terraform.tfvars文件:
vars=$(pwd)"/terraform.tfvars"
packer build pack.json | \
    tee /dev/tty | \
    grep -E -o '\w{2}-\w+-\w{1}: ami-\w+' | \
    perl -ne '@parts = split /[:,\s]+/, $_; print "aws_amis." . $parts[0] ." = \"" . $parts[1] . "\"\n"' > ${vars}

最佳答案

您应该考虑将Terraform的数据源用于aws_ami。这样,您可以依赖在创建AMI时在AMI上设置的自定义标签(例如,版本号或时间戳)。然后,在Terraform配置中,您可以简单地为此帐户和区域过滤可用的AMI,以获取所需的AMI ID。

https://www.terraform.io/docs/providers/aws/d/ami.html

data "aws_ami" "nat_ami" {
  most_recent = true
  executable_users = ["self"]
  filter {
    name = "owner-alias"
    values = ["amazon"]
  }
  filter {
    name = "name"
    values = ["amzn-ami-vpc-nat*"]
  }
  name_regex = "^myami-\\d{3}"
  owners = ["self"]
}

注意:在上面的示例中(来自docs),过滤器的组合可能过多。您可能可以通过以下方式得到很好的解决:
data "aws_ami" "image" {
  most_recent = true
  owners = ["self"]
  filter {
    name = "tag:Application"
    values = ["my-app-name"]
  }
}

output "ami_id" {
  value = "${data.aws_ami.image.id}"
}

这样做的另一个好处是,您可以使用相同的配置并且没有变量映射来部署到多个区域!

关于bash - 如何将Packer的输出ami id自动链接到Terraform变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37357618/

10-12 22:03