【问题标题】:Terraform fails remote-exec (aws/ec2)Terraform 无法远程执行 (aws/ec2)
【发布时间】:2019-09-16 15:00:58
【问题描述】:

当尝试执行 shell 脚本时,在 terraform 连接未建立时抛出配置程序“remote-exec”

我将 ami 用于 ubuntu-xenial-16.04,所以用户是 ubuntu

这是我用来执行 shell 脚本的最后一段代码:

resource "aws_instance" "secondary_zone" {
  count = 1
  instance_type = "${var.ec2_instance_type}"
  ami           = "${data.aws_ami.latest-ubuntu.id}"
  key_name = "${aws_key_pair.deployer.key_name}"
  subnet_id = "${aws_subnet.secondary.id}"
  vpc_security_group_ids =  ["${aws_security_group.server.id}"]
  associate_public_ip_address = true

  provisioner "remote-exec" {
    inline = ["${template_file.script.rendered}"]
  }

  connection {
    type        = "ssh"
    user        = "ubuntu"
    private_key = "${file("~/.ssh/id_rsa")}"
  }
}

这是控制台中的内容:

aws_instance.secondary_zone (remote-exec): Connecting to remote host via SSH...
aws_instance.secondary_zone (remote-exec):   Host: x.x.x.x
aws_instance.secondary_zone (remote-exec):   User: ubuntu
aws_instance.secondary_zone (remote-exec):   Password: false
aws_instance.secondary_zone (remote-exec):   Private key: true
aws_instance.secondary_zone (remote-exec):   SSH Agent: false
aws_instance.secondary_zone (remote-exec):   Checking Host Key: false

感谢您的帮助...

【问题讨论】:

  • 您的实例的安全组是否允许从您运行 Terraform 的计算机进行 SSH 访问?
  • 是的,当然,我将配置器类型更改为“文件”,然后配置器“remote-exec”
  • 这确实是一个环境问题,所以任何人都很难回答。但是作为一个要尝试的事情的清单:在不使用配置器时,您可以从运行 Terraform 的机器上使用该用户/密钥组合 SSH 到实例吗?运行provisioner时连接最终会超时吗?它是否以某种方式出错?
  • @ydaetskcoR 我认为你是对的。当我尝试从另一个位置应用它时,它连接正常。此外 template_file 已被弃用,因此我更改了代码。我分享它。

标签: amazon-ec2 terraform terraform-provider-aws


【解决方案1】:

正如我所提到的,我的情况是连接问题。

此外,template_file 已被弃用,因此我将代码更改为:

resource "aws_instance" "secondary_zone" {
  instance_type = "${var.ec2_instance_type}"
  ami           = "${data.aws_ami.latest-ubuntu.id}"
  key_name = "${aws_key_pair.deployer.key_name}"
  subnet_id = "${aws_subnet.secondary.id}"
  vpc_security_group_ids =  ["${aws_security_group.server.id}"]
  associate_public_ip_address = true

    connection {
    type     = "ssh"
    user = "ubuntu"
    private_key = "${file("~/.ssh/id_rsa")}"
    timeout = "2m"

  }

  provisioner "file" {
    source      = "/server/script.sh"
    destination = "/tmp/script.sh"
  }  

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "/tmp/script.sh args",
    ]
  }
}

另外,我了解到 scrip.sh 必须格式化为 LR

【讨论】:

  • 我认为这个答案并不能真正解决这个问题,除了“打开你的安全组/其他网络策略到实例以允许来自运行 Terraform 的机器的 SSH”之外,你的问题基本上是无法回答的
  • 实际上,我很确定情况并非如此。解决方案就在这里,但并没有引起任何人的注意。这是因为连接节中的 private_key 行。
【解决方案2】:

如果您只是尝试运行一些脚本来配置您使用 Terraform 创建的任何 ec2 节点,我会尝试设置 user-data 参数来引用您的脚本。用户数据脚本在节点初始化时自动运行。

这将确保您的部署不存在与生命周期相关的问题(例如,正在创建 EC2 节点,并且主机不可用于远程执行成功)和整体更清洁的体验。

一个例子如下所示:

resource "aws_instance" "secondary_zone" {
  count = 1
  instance_type = "${var.ec2_instance_type}"
  ami           = "${data.aws_ami.latest-ubuntu.id}"
  key_name = "${aws_key_pair.deployer.key_name}"
  subnet_id = "${aws_subnet.secondary.id}"
  vpc_security_group_ids =  ["${aws_security_group.server.id}"]
  associate_public_ip_address = true

  user_data = "${template_file.script.rendered}"
}

希望这会有所帮助!

进一步阅读: TF docs Userdata examples

【讨论】:

    【解决方案3】:

    我有同样的问题。在您的连接块中尝试指定主机。

      connection {
        type        = "ssh"
        user        = "ubuntu"
        private_key = "${file("~/.ssh/id_rsa")}"
        host        = self.public_ip
      }
    

    我还必须创建一个路由和网关并将它们关联到我的 vpc。我仍在学习 terraform,但这对我有用。

    resource "aws_internet_gateway" "test-env-gw" {
      vpc_id = aws_vpc.test-env.id
    }
    
    resource "aws_route_table" "route-table-test-env" {
      vpc_id = aws_vpc.test-env.id
      route {
        cidr_block = "0.0.0.0/0"
        gateway_id = aws_internet_gateway.test-env-gw.id
      }
    }
    
    resource "aws_route_table_association" "subnet-association" {
      subnet_id      = aws_subnet.us-east-2a-public.id
      route_table_id = aws_route_table.route-table-test-env.id
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 2021-07-11
      • 1970-01-01
      • 2021-05-15
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      相关资源
      最近更新 更多