user389955
user389955

Reputation: 10467

when launching an EC2, can I include a script file with arguments in user_data field?

when launching an EC2, can I include a script file with arguments in user_data field? such as: user_data = "${file("install_software.sh"), user_name pass_word}"

besides, can I include multiple script files in user_data field? such as: user_data = "${file("install_software1.sh","install_software2.sh")}"

I did not see any examples of them yet, so I do not know what can be the format. If I cannot do that using user_data, how to do that? should I use remote-exec or sth. else?

============= update: Thanks KOE for responding me. Here I post the complete answers in case sb. else need. I have tested them.

+++++++++++ how to include arguments in user_data field:

userdata_arguments_test.tf:

data "template_file" "user_data_test" {
      template = "${file("userdata_arg_test.tfl")}"
      vars {
        myuser = "${var.myuser}"
        mypassword = "${var.mypassword}"
      }
}
resource "aws_instance" "user_data_test" {
......
  user_data = "${data.template_file.user_data_test.rendered}"
}

userdata_arg_test.tfl

#!/bin/bash
echo ${myuser}, ${mypassword} >/tmp/my_info.log

+++++++++++ how to include multiple files in user_data field:

userdata_mfiles_test.tf:

 data "template_file" "user_data_common" {
  template = "${file("userdata_arg_test.tfl")}"
  vars {
    myuser = "${var.myuser}"
    mypassword = "${var.mypassword}"
  }
}
data "template_file" "user_data_master" {
  template = "${file("userdata_arg_test2.tfl")}"
  vars {
    myuser2 = "${var.myuser}"
    mypassword2 = "${var.mypassword}"
  }
}
data "template_cloudinit_config" "master" {
  gzip          = true
  base64_encode = true

 part {
   content_type = "text/x-shellscript"
   content      = "${data.template_file.user_data_common.rendered}"
 }

  part {
    content_type = "text/x-shellscript"
    content      = "${data.template_file.user_data_master.rendered}"
  }
}
resource "aws_instance" "user_data_test" {
  ....
  user_data     = "${data.template_cloudinit_config.master.rendered}"
}

userdata_arg_test.tfl

#!/bin/bash
echo ${myuser}, ${mypassword} >/tmp/my_info.log

userdata_arg_test2.tfl

#!/bin/bash
echo ${myuser2} + ${mypassword2} >/tmp/my_info2.log

Upvotes: 3

Views: 1425

Answers (2)

user389955
user389955

Reputation: 10467

Thanks KOE for responding me. Here I post the complete answers in case sb. else need. I have tested them.

How to include arguments in user_data field

userdata_arguments_test.tf:

data "template_file" "user_data_test" {
      template = "${file("userdata_arg_test.tfl")}"
      vars {
        myuser = "${var.myuser}"
        mypassword = "${var.mypassword}"
      }
}

resource "aws_instance" "user_data_test" {
......
  user_data = "${data.template_file.user_data_test.rendered}"
}

userdata_arg_test.tfl

#!/bin/bash
echo ${myuser}, ${mypassword} >/tmp/my_info.log

How to include multiple files in user_data field

userdata_mfiles_test.tf:

 data "template_file" "user_data_common" {
  template = "${file("userdata_arg_test.tfl")}"
  vars {
    myuser = "${var.myuser}"
    mypassword = "${var.mypassword}"
  }
}

data "template_file" "user_data_master" {
  template = "${file("userdata_arg_test2.tfl")}"
  vars {
    myuser2 = "${var.myuser}"
    mypassword2 = "${var.mypassword}"
  }
}

data "template_cloudinit_config" "master" {
  gzip          = true
  base64_encode = true

 part {
   content_type = "text/x-shellscript"
   content      = "${data.template_file.user_data_common.rendered}"
 }

  part {
    content_type = "text/x-shellscript"
    content      = "${data.template_file.user_data_master.rendered}"
  }
}

resource "aws_instance" "user_data_test" {
  ....
  user_data     = "${data.template_cloudinit_config.master.rendered}"
}

userdata_arg_test.tfl

#!/bin/bash
echo ${myuser}, ${mypassword} >/tmp/my_info.log

userdata_arg_test2.tfl

#!/bin/bash
echo ${myuser2} + ${mypassword2} >/tmp/my_info2.log

Upvotes: 1

Koe
Koe

Reputation: 1298

What you want to use is template_file

data "template_file" "user_data" {
  template = "${file("script1.sh.tpl")}"

  vars {
    var1 = "foo"
    var2 = "bar"
  }
}

If you want to use multiple scripts in your user_data you need to follow the cloud-init multipart format and put it in one or several file *.tpl, then combine them using terraform standard interpolation or inline templates.

Reference:

https://www.terraform.io/docs/providers/template/d/file.html http://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive https://github.com/ukayani/cloud-init-example/blob/master/SampleUserData

Upvotes: 4

Related Questions