2

I am using Terraform and Packer for the first time. I am trying to create and AWS AMI for CentOS with Docker built-in. As can be seen from my packer script below, all I am doing is running a number of yum commands as described in docker documentation in order to install docker.

{
    "builders": [
    {
        "type": "amazon-ebs",
        "profile": "digital",
        "source_ami": "ami-061b1560",
        "instance_type": "t2.micro",
        "ssh_username": "centos",
        "ami_name": "centos-docker {{timestamp}}"
    }
],

"provisioners": [{
    "type": "shell",
    "inline": [
        "sleep 30",
        "sudo yum install -y yum-utils device-mapper-persistent-data lvm2",
        "sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo",
        "sudo yum makecache fast",
        "sudo yum install docker-ce"
    ]
}]

}

I then use the AMI created by the above script in my terraform script and add local-exec provisioners to start the docker service

provider "aws" {
   profile = "digital"
   region = "eu-west-1" 
}

resource "aws_instance" "chat-server" {
    ami = "ami-XXXXXX" 
    instance_type = "t2.micro"

    provisioner "local-exec" {
        command = "sudo systemctl start docker"
    }
}

When I run terraform apply, it hangs around the command where it's trying to start the docker service.

aws_instance.chat-server: Creating...
  ami:                          "" => "ami-609f6919"
  associate_public_ip_address:  "" => "<computed>"
  availability_zone:            "" => "<computed>"
  ebs_block_device.#:           "" => "<computed>"
  ephemeral_block_device.#:     "" => "<computed>"
  instance_state:               "" => "<computed>"
  instance_type:                "" => "t2.micro"
  ipv6_address_count:           "" => "<computed>"
  ipv6_addresses.#:             "" => "<computed>"
  key_name:                     "" => "<computed>"
  network_interface.#:          "" => "<computed>"
  network_interface_id:         "" => "<computed>"
  placement_group:              "" => "<computed>"
  primary_network_interface_id: "" => "<computed>"
  private_dns:                  "" => "<computed>"
  private_ip:                   "" => "<computed>"
  public_dns:                   "" => "<computed>"
  public_ip:                    "" => "<computed>"
  root_block_device.#:          "" => "<computed>"
  security_groups.#:            "" => "<computed>"
  source_dest_check:            "" => "true"
  subnet_id:                    "" => "<computed>"
  tenancy:                      "" => "<computed>"
  volume_tags.%:                "" => "<computed>"
  vpc_security_group_ids.#:     "" => "<computed>"
aws_instance.chat-server: Still creating... (10s elapsed)
aws_instance.chat-server: Still creating... (20s elapsed)
aws_instance.chat-server: Still creating... (30s elapsed)
aws_instance.chat-server: Provisioning with 'local-exec'...
aws_instance.chat-server (local-exec): Executing: /bin/sh -c "sudo 
systemctl start docker"
Password:aws_instance.chat-server: Still creating... (40s elapsed)
aws_instance.chat-server: Still creating... (50s elapsed)
aws_instance.chat-server: Still creating... (1m0s elapsed)
.
.
.
aws_instance.chat-server: Still creating... (9m0s elapsed)
aws_instance.chat-server: Still creating... (9m10s elapsed)

Interrupt received.
Please wait for Terraform to exit or data loss may occur.
Gracefully shutting down...
stopping apply operation...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

What am I doing wrong here?

Suhas
  • 7,919
  • 5
  • 34
  • 54

1 Answers1

3

You are using the wrong provisioner, you should use remote-exec.

Rickard von Essen
  • 4,110
  • 2
  • 23
  • 27