https://github.com/tedivm/terraform-general-cloudinit
A cloudinit wrapper module that enables quick machine configuration
https://github.com/tedivm/terraform-general-cloudinit
cloud-init terraform terraform-module
Last synced: 10 months ago
JSON representation
A cloudinit wrapper module that enables quick machine configuration
- Host: GitHub
- URL: https://github.com/tedivm/terraform-general-cloudinit
- Owner: tedivm
- License: mit
- Created: 2022-03-07T17:41:37.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2023-03-30T12:34:24.000Z (almost 3 years ago)
- Last Synced: 2025-04-14T02:35:50.402Z (10 months ago)
- Topics: cloud-init, terraform, terraform-module
- Language: HCL
- Homepage: https://registry.terraform.io/modules/tedivm/cloudinit/general/latest
- Size: 17.6 KB
- Stars: 8
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Cloud Init Module
This module creates a multi-part mime encoded cloud init userdata blob.
In other words, it can be used to configure EC2 (or other cloudinit enabled) machines.
It has two components- a "cloud-config" formatted file based off of the inputs to the module, and the ability to take in arbitrary "parts" that can be added as separate files. The cloud-config section should be good enough for pretty much everything though.
This module even automatically compresses the userdata if it gets too large, so that it's easily readable if small while still allowing larger files when needed.
## Usage
### Example
This first example enables two services, runs a bunch of commands, and adds two configuration files.
```terraform
module "cloudinit" {
source = "tedivm/cloudinit/general"
version = "~> 1.0
services = ["consul", "nomad"]
runcmd = [
"sed -i 's/After=network-online.target/After=opt.mount network-online.target consul.service/' /lib/systemd/system/nomad.service",
"sed -i 's/After=network-online.target/After=opt.mount network-online.target/' /lib/systemd/system/consul.service",
"mkdir -p /opt/consul",
"chown consul:consul /opt/consul",
"mkdir -p /opt/nomad",
"chown nomad:nomad /opt/nomad"
]
config_files = {
"/etc/nomad.d/nomad.hcl" : templatefile("${path.module}/templates/nomad.hcl", local.template_vars),
"/etc/consul.d/consul.hcl" : templatefile("${path.module}/templates/consul.hcl", local.template_vars),
}
}
```
This version is a big more complex- it installs packages, enables and starts services, installs script files (with execution permissions), mounts an EBS volume with partition growth enabled, and then after everything else is done it runs a command to launch nomad jobs.
```terraform
locals {
service_template_vars = {
controller_count : var.controller_count,
cluster_id : var.cluster_id,
advertise_address : tolist(aws_network_interface.main.private_ips)[0]
}
service_files = {
"/etc/nomad.d/nomad.hcl" : templatefile("${path.module}/templates/nomad.hcl", local.service_template_vars),
"/etc/consul.d/consul.hcl" : templatefile("${path.module}/templates/consul.hcl", local.service_template_vars),
}
cron_files = {
"/etc/cron.d/nomad_submit" : templatefile("${path.module}/templates/nomad_cron", { "config_bucket" : var.config_bucket })
}
script_files = {
"/opt/nomad_core_jobs.sh" : templatefile("${path.module}/templates/nomad_core_jobs.sh",
{
"config_bucket" : var.config_bucket,
"cluster_id" : var.cluster_id
}
),
"/opt/awscli_install.sh" : templatefile("${path.module}/templates/awscli_installer.sh", {}),
}
}
module "cloudinit" {
source = "tedivm/cloudinit/general"
version = "~> 1.0
package_update = true
packages = ["unzip", "jq"]
services = ["consul", "nomad"]
script_files = local.script_files
config_files = merge(local.service_files, local.cron_files)
mounts = [
["/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${replace(aws_ebs_volume.opt.id, "-", "")}", "/opt/data", "xfs", "defaults,x-systemd.makefs,x-systemd.required-by=consul.service,x-systemd.required-by=nomad.service", "0", "1"]
]
grow_partition_devices = [
"/opt/data"
]
runcmd = [
"systemctl start opt-data.mount",
"/opt/awscli_install.sh",
"mkdir -p /opt/jobspecs",
"mkdir -p /opt/data/consul",
"chown consul:consul /opt/data/consul",
"mkdir -p /opt/data/nomad",
"chown nomad:nomad /opt/data/nomad"
]
endcmd = [
"/opt/nomad_core_jobs.sh"
]
}
```
### Outputs
* `rendered` - The string containing the `user_data` to pass to the EC2 instances or Launch Templates.
## Resources Affected
This module only creates data- no resources are actually created by it.