skip to Main Content

I have provided an .sh file as user_data in my Terraform script:

resource "aws_instance" "alpha-terraform"{
    ami=var.amis[var.region]
    instance_type="t2.micro"
    vpc_security_group_ids=[aws_security_group.alpha-terraform-sg.id]
    user_data = file("user_data_bootstrap.sh")
    key_name = "alpha-terraform"

    tags={
        type="alpha"
        purpose="terraform"        
    }
}

The .sh file contains:

#Jenkins Installation:
sudo apt update
sudo apt install openjdk-8-jdk --yes
wget –q –O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add –
sudo sh -c 'echo deb https://pkg.jenkins.io/debian binary/ >> /etc/apt/sources.list'
sudo apt update
sudo apt install Jenkins
sudo systemctl status jenkins
find /usr/lib/jvm/java-1.8* | head -n 3

My instance is getting created all right. However, I believe my user_data is not getting executed. I can see the user_data is being copied to /var/lib/cloud/instance/ as user-data.txt and user-data.txt.i but still not getting executed.

Why is this happening and how can I debug it further?

Update

I tried accessing the server through and executing each command one by one but getting following error while updating apt packages:

ubuntu@ip-172-31-52-**:~$ apt update
Reading package lists... Done
W: chmod 0700 of directory /var/lib/apt/lists/partial failed - SetupAPTPartialDirectory (1: Operation not permitted)
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)
ubuntu@ip-172-31-52-**:~$ sudo apt update
Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/

4

Answers


  1. I will prefer templatefile over file where you have more control and pass variable to user data as well.

    templatefile reads the file at the given path and renders its content as a template using a supplied set of template variables where file reads the contents of a file at the given path and returns them as a string.

    templatefile(path, vars)
    
    data "template_file" "backend_cloud_init" {
      template = "${file("user_data_bootstrap.sh")}"
      vars = {
        JDK_VERSION = "openjdk-8-jdk"
      }
    }
    

    then use the template_file in a userdata section

    resource "aws_instance" "alpha-terraform"{
        ami=var.amis[var.region]
        instance_type="t2.micro"
        vpc_security_group_ids=[aws_security_group.alpha-terraform-sg.id]
        user_data                   = "${data.template_file.backend_cloud_init.rendered}"
        key_name = "alpha-terraform"
    
        tags={
            type="alpha"
            purpose="terraform"        
        }
    }
    

    Also, add the hashbang in the file with debug

    #!/usr/bin/env bash
    set -x
    
    Login or Signup to reply.
  2. You’re missing #!/bin/bash at the beginning of the file. From the documentation:

    User data shell scripts must start with the #! characters and the path to the interpreter you want to read the script (commonly /bin/bash). For a great introduction on shell scripting, see the BASH Programming HOW-TO at the Linux Documentation Project (tldp.org).

    Login or Signup to reply.
  3. I verified the script on my sandbox account.

    It had mistakes. The corrected version is as follows:

    #!/bin/bash -xe
    
    #Jenkins Installation:
    apt update
    apt install openjdk-8-jdk --yes
    wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
    echo "deb https://pkg.jenkins.io/debian binary/" >> /etc/apt/sources.list
    apt update
    apt install -y jenkins
    systemctl status jenkins
    find /usr/lib/jvm/java-1.8* | head -n 3
    

    The changes were:

    • removal of sudo
    • fixing to -
    • fixing apt install Jenkins to apt install -y jenkins

    I can confirm that it works now with terraform on Ubuntu 18.04 instance.

    Upon launching the instance, jenkins is available at http://<instance-ip>:8080:

    enter image description here

    Login or Signup to reply.
  4. To help troubleshooting, it’s a good idea to SSH and check folder /var/lib/cloud/instances/instance-id/. You should find the data_user script there. Read it to check if everything is as expected.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search