Terraform 条件化配置

5

我在使用Terraform进行配置时遇到了问题。第一次运行Terraform时,我使用了在AWS控制台生成的SSH密钥。该密钥被添加到ubuntu用户中(它是Ubuntu 16.04 AMI)。然后我运行了remote-exec配置:

provisioner "remote-exec" {
  inline = [
  "sudo apt -y update && sudo apt install -y python"
  ]
  connection {
    user = "ubuntu"
    private_key = "${file("${var.aws_default_key_name}.pem")}"
  }
}

我需要安装Python以便稍后使用Ansible。这是我唯一需要该密钥的地方,从不需要其他地方,因为我使用我的私钥创建自己的用户。然而,当我尝试稍后运行terraform时,它会搜索一个文件file("${var.aws_default_key_name}.pem"。 现在我有一个问题,如何在后续运行中跳过此配置?

我不想在存储库中存储SSH密钥。

我可以创建一个空文件来"欺骗"terraform,但我不喜欢这个解决方案。

有更好的想法吗?

2个回答

5

不要在 aws_instance 块中进行配置,而是将其移到一个null_resource 块中,并添加适当的触发器。

resource "aws_instance" "cluster" {
  count = 3

  # ...
}

resource "null_resource" "cluster" {
  # Changes to any instance of the cluster requires re-provisioning
  triggers {
    cluster_instance_ids = "${join(",", aws_instance.cluster.*.id)}"
  }

  connection {
    host = "${element(aws_instance.cluster.*.public_ip, 0)}"
  }

  provisioner "remote-exec" {
    inline = [something]
  }
}

如果您的触发器没有更改,则在后续运行中不会触发空资源的预配。

我会测试并告诉你,但看起来很有前途! - Mat

1

Sparrowform是一个基于Terraform的轻量级供应商。与其他供应商工具相比,它的优点在于terraform apply阶段的基础架构引导与供应阶段解耦,因此您可以这样做:

$ terraform apply # does infra bootstrap

$ nano sparrowfile # Sparrowdo equivalent for remote-exec chunk

#!/usr/bin/env perl6

bash 'apt -y update';
package-install 'python';

$ sparrowform --ssh_user=my-user --ssh_private_key=/path/to/key  # do provision stage

显然,您可以自由选择在后续运行中不运行sparrowform。它完成了它的工作(安装ansible相关依赖项)。然后,您放弃初始的ssh_private_key并使用新的私钥(我猜是与ansible相关的?)

附:披露-我是该工具的作者


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接