【问题标题】:How to run sudo in terraform "local-exec" block如何在 terraform “local-exec” 块中运行 sudo
【发布时间】:2019-08-20 11:09:20
【问题描述】:

我有一个问题,在本地 exec 中添加 sudo 会继续运行。

简而言之,没有 local-exec 块。我能够创建和访问我的 EC2 实例。使用 ssh -vi path/to/key.pem ec2-user@ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com。

但是现在只要我添加下面的块;并运行apply 它在密码提示后一直显示“仍在创建”。

 provisioner "local-exec" {
    command = <<EOH
      sudo yum -y update
      sudo yum install -y python36u python36u-libs python36u-devel python36u-pip
    EOH
  }

那么,我的问题是这里的 sudo 用户是哪个用户?是 ec2-user 还是我最初创建的用于设置我的 AWS 的用户(仅包括访问密钥 ID 和秘密访问密钥)?

我该如何设置,有什么文档可以参考吗?

下面是我的 main.tf


provider "aws" {
  region = "us-east-2"
  version = "~> 1.2.0"
}

resource "aws_instance" "hello-world" {
  ami = "ami-ef92b08a"
  instance_type = "t2.micro"

  provisioner "local-exec" {
    command = <<EOH
      sudo yum -y update
      sudo yum install -y python36u python36u-libs python36u-devel python36u-pip
    EOH
  }

  tags {
    Name = "my-aws-terraform-hello-world"
  }
}

resource "aws_security_group" "allow-tcp" {
  name = "my-aws-terraform-hello-world"
  ingress {
    from_port = 8080
    to_port = 8080
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

【问题讨论】:

  • Local-exec 在本地运行,即在您的机器上运行,而不是在您刚刚创建的实例上运行。改用 remote-exec 连接到您的 EC2 实例(或者更好的是使用用户数据,甚至更好的是尽可能多地烘焙到 AMI 中然后部署它)。

标签: python amazon-web-services terraform


【解决方案1】:

创建实例后,local-exec 中的命令会在您的计算机上本地运行。使用remote-exec 如下在 EC2 实例上运行您的命令。

 connection {
    type     = "ssh"
    user     = "ec2-user"
    host = "${self.private_ip}"
    private_key  = "${file("/path/to/your/pemfile")}"
    agent = true
  }

然后你可以指定远程执行块

 provisioner "remote-exec" {
    inline = [
      "sudo yum -y update",
      "sudo yum install -y python36 python36-libs python36-devel python36-pip",
    ]
  }

如果在外部块中,多个远程供应商可以使用相同的连接块。

【讨论】:

  • 谢谢。出于某种原因,我在 remote-exec 块中也有同样的问题。从我的本地机器上,我可以看到它已到达 AWS EC2 公共 IP,但无法执行命令。你知道为什么会这样吗?它试图在连接块中保持循环?内联 = [ "sudo yum -y update", "sudo yum install -y python36 python36-libs python36-devel python36-pip", ] 和连接 { type = "ssh" user = "ec2-user" password = "" private_key = "${file("~/.ssh/my-key-pair.pem")}" 主机 = "${self.private_ip}" 超时 = "2m" 代理 = false }
  • 你能显示日志或错误消息吗?你能通过 ssh 进入 ec2 吗? ssh -i /path/to/pemfile user@ip_address.
【解决方案2】:

由于这是一个 EC2 实例,我建议您使用 USER_DATA,这将作为映像创建的一部分运行。 AWS 文档here。

这是 Terraform 的 user_data 属性。

这里是你将如何实现你正在做的事情,由于 USER_DATA 以 root 身份运行,你不需要 sudo。

resource "aws_instance" "web" {
  ami = "hello-world"
  instance_type = "t2.micro"
  user_data = <<-EOF
                #!/bin/bash
                yum -y update
                yum install -y python36u python36u-libs python36u-devel python36u-pip
              EOF
  tags {
    Name = "my-aws-terraform-hello-world"
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2020-03-22
    • 2020-07-07
    • 2020-10-04
    • 2020-01-20
    • 2021-05-03
    • 2020-10-26
    相关资源
    最近更新 更多