Amazon web services 地形条件供应

Amazon web services 地形条件供应,amazon-web-services,terraform,Amazon Web Services,Terraform,我对Terraform资源调配有问题。当我第一次运行terraform时,我正在使用AWS控制台中生成的SSH密钥。这个键被添加到ubuntu用户中(它是ubuntu 16.04 AMI)。然后我运行remoteexecprovisioning: provisioner "remote-exec" { inline = [ "sudo apt -y update && sudo apt install -y python" ] connection { u

我对Terraform资源调配有问题。当我第一次运行terraform时,我正在使用AWS控制台中生成的SSH密钥。这个键被添加到ubuntu用户中(它是ubuntu 16.04 AMI)。然后我运行
remoteexec
provisioning:

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时,它会搜索一个文件
文件(${var.aws\u default\u key\u name}.pem“
)。 现在我有一个问题,如何在后续运行中跳过此设置

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

我可以创建一个空文件来“欺骗”地形,但我不喜欢这个解决方案


有更好的想法吗?

不要在
aws\u实例
块中进行资源调配,而是将其移出到具有适当触发器的块中

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]
  }
}
如果您的触发器未更改,则在后续运行中将不会触发空\u资源调配。

是基于Terraform的基础架构的轻量级调配器。与其他调配工具相比,Terraform应用的好处是基础架构引导与调配分离的
阶段n阶段,因此您可以执行以下操作:

$ 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_私钥
并使用新私钥(我想是与ansible相关的吧?)


注:披露-我是工具作者

我会测试并让你知道,但似乎很有希望!