如何在Terraform“ local-exec”块中运行sudo

时间:2019-03-29 13:34:13

标签: python amazon-web-services terraform

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

2 个答案:

答案 0 :(得分:0)

创建实例之后,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",
]

}

如果在外部块中,则多个远程预配器可以使用同一连接块。

答案 1 :(得分:0)

由于这是一个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"
  }
}