2017-07-18 128 views
2

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

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

我需要蟒蛇正装,所以我可以在以后使用Ansible。这是我唯一需要这个密钥的地方,从来没有更多,因为我用我的私钥创建了自己的用户。但是,当我尝试在以后运行terraform时,它将搜索文件file("${var.aws_default_key_name}.pem"。 现在我有一个问题,如何在随后的运行中跳过此配置?

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

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

有什么更好的点子?

回答

2

而不是在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] 
    } 
} 

如果您的触发器不改变,null_resource配置将不会在随后的运行中被触发。

+0

我会测试并让你知道,但看起来很有前途! – Mat

0

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运行。它是它的工作(安装可靠的相关依赖关系,就是这样)。然后,你放弃你的初始ssh_private_key,并与新的私人密钥(我相信吗?)

PS。披露 - 我是工具作者