首页 > 解决方案 > 如何在 terraform “local-exec” 块中运行 sudo

问题描述

我有一个问题,在本地 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"]
  }
}

标签: pythonamazon-web-servicesterraform

解决方案


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

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

然后你可以指定 remote-exec 块

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

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


推荐阅读