tfmod-generator 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37fd1137c1115a7724196254fbfaa3ec573d4628
4
- data.tar.gz: 14b40605f879d54076fc55baca90ae141b44369c
3
+ metadata.gz: 7ff260788fbe5e9f46965ee305d4b5bb5e49afea
4
+ data.tar.gz: f24f2c13161e1f266ae328a281d803de1449a22c
5
5
  SHA512:
6
- metadata.gz: 7911c4eb6580a0476d49ad581c9ea65925433b31a1d9ab150c5c120165f5577a6e943abb77442bf8da5d0e3a8a97d0544da709853e41538ab07f9e88ec854cb3
7
- data.tar.gz: a8a21a3019ea63e55a1cac1b9986520d6e9c1203d2f680cda0885329591ecbe17bacc86803ea74d250e6b0aba9af64c19a52825660d983d4e727dc86ddb32770
6
+ metadata.gz: 138959c998eb3bbee70c93a7b45f9869c8ebd179f0d4200fbef7a4c5f9464ddb583acde060b222a4a684c6232ade2ed273dbe55bb6a95ac020888cc7a9b82e5d
7
+ data.tar.gz: 5e2b6cb06f14ad4a0e7e0c96b0ad7d515e413660f0ef66c614d36b07b34b7a8049e514a6247aab8f77b54f9bcd199a66cb86e715e51a6d24ab30fabe08572733
data/bin/tfmod CHANGED
@@ -4,7 +4,7 @@ require 'thor'
4
4
  require 'tfmod/generator'
5
5
 
6
6
  # Main class
7
- class TfModule < Thor::Group
7
+ class TfModuleGenerator < Thor::Group
8
8
  include Thor::Actions
9
9
 
10
10
  argument :name
@@ -37,6 +37,14 @@ class TfModule < Thor::Group
37
37
  template('../templates/variables.tf.erb', "#{name}/variables.tf")
38
38
  end
39
39
 
40
+ def create_remote_scripts_dir
41
+ empty_directory("#{name}/remote_scripts")
42
+ end
43
+
44
+ def create_user_data_file
45
+ template('../templates/user-data.sh.erb', "#{name}/remote_scripts/user-data.sh.tpl")
46
+ end
47
+
40
48
  def create_test_dir
41
49
  empty_directory("#{name}/test")
42
50
  end
@@ -46,4 +54,4 @@ class TfModule < Thor::Group
46
54
  end
47
55
  end
48
56
 
49
- TfModule.start
57
+ TfModuleGenerator.start
@@ -1,5 +1,5 @@
1
1
  module Tfmod
2
2
  module Generator
3
- VERSION = "0.1.5"
3
+ VERSION = "0.1.6"
4
4
  end
5
5
  end
@@ -1 +1,71 @@
1
1
  // main tf file for <%= name.capitalize %>
2
+
3
+ // example ec2 resource that leverages Terraform template provider to update user-data
4
+ // some variables presented here are not in the variables.tf generated but are here for example usage
5
+
6
+ resource "aws_instance" "<%= name -%>" {
7
+ count = "${var.<%= name %>_count}"
8
+ ami = "${var.custom_ebs_ami != "" ? var.custom_ebs_ami : data.aws_ami.ubuntu.id}"
9
+ instance_type = "${var.<%= name %>_instance_type}"
10
+ iam_instance_profile = "${var.instance_profile}"
11
+ subnet_id = "${element(var.subnet_id, count.index)}"
12
+ vpc_security_group_ids = ["${var.vpc_security_group_ids}"]
13
+ key_name = "${var.key_name}"
14
+ user_data = "${element(data.template_cloudinit_config.userdata.*.rendered, count.index)}"
15
+
16
+ root_block_device {
17
+ volume_type = "${var.root_block_device_volume_type}"
18
+ volume_size = "${var.root_block_device_volume_size}"
19
+ delete_on_termination = "${var.root_block_device_delete_on_termination}"
20
+ }
21
+
22
+ lifecycle {
23
+ ignore_changes = ["ami", "user_data"]
24
+ }
25
+
26
+ tags {
27
+ Name = "<%= name %>${count.index + 1}-${var.team}-${var.product}-${var.environment}"
28
+ Environment = "${var.environment}"
29
+ Team = "${var.team}"
30
+ Service = "${var.service}"
31
+ Product = "${var.product}"
32
+ Owner = "${var.owner}"
33
+ Description = "${var.description}"
34
+ }
35
+ }
36
+
37
+ data "template_file" "script" {
38
+ count = "${var.<%= name %>_count}"
39
+ template = "${file("${path.module}/remote_scripts/user-data.sh.tpl")}"
40
+
41
+ vars {
42
+ environment = "${var.environment}"
43
+ team = "${var.team}"
44
+ domain = "${var.domain}"
45
+ service = "${var.service}"
46
+ product = "${var.product}"
47
+ <%= name %>_count = "${count.index + 1}"
48
+ consul_server_tag_key = "${var.consul_server_tag_key}"
49
+ consul_server_tag_value = "${var.consul_server_tag_value}"
50
+ consul_datacenter = "${var.consul_datacenter}"
51
+ consul_agent_version = "${var.consul_agent_version}"
52
+ consul_template_version = "${var.consul_template_version}"
53
+ }
54
+ }
55
+
56
+ data "template_cloudinit_config" "userdata" {
57
+ count = "${var.<%= name %>_count}"
58
+ gzip = true
59
+ base64_encode = true
60
+
61
+ part {
62
+ content_type = "text/x-shellscript"
63
+ content = "${element(data.template_file.script.*.rendered, count.index)}"
64
+ }
65
+
66
+ // optional script you can pass in as a variable to append to managed user-data template
67
+ part {
68
+ content_type = "${var.post_script_type}"
69
+ content = "${var.post_script}"
70
+ }
71
+ }
@@ -0,0 +1,128 @@
1
+ #!/bin/bash
2
+
3
+ # Example user-data bootstrap
4
+
5
+ # User data script bootstrap takes variables from Terraform template provider
6
+ # Requires some parameters to be passed in via Terraform template variables.
7
+ # Requires a working local consul agent that can connect to a consul cluster to join via Ec2 tags
8
+
9
+ # userdata template variables passed in via Terraform
10
+ # Environment: ${environment}
11
+ # Domain: ${domain}
12
+ # Team: ${team}
13
+ # Service: ${service}
14
+ # Product: ${product}
15
+ # Count: ${<%= name %>_count}
16
+ # Consul template version: ${consul_template_version}
17
+ # Consul cluster AWS tag key: ${consul_server_tag_key}
18
+ # Consul cluster AWS tag value: ${consul_server_tag_value}
19
+ # Consul agent version: ${consul_agent_version}
20
+
21
+ export IP_ADDRESS=$(curl http://169.254.169.254/latest/meta-data/local-ipv4)
22
+ export REGION=$(curl -s 169.254.169.254/latest/meta-data/placement/availability-zone)
23
+ export AWS_DEFAULT_REGION=$\{REGION::-1\}
24
+
25
+ function set_hostname {
26
+ echo "SETTING HOSTNAME ${service}${<%= name %>_count}-${team}-${product}-${environment}.${domain}"
27
+ hostname ${service}${<%= name %>_count}-${team}-${product}-${environment}.${domain}
28
+ echo "Updating /etc/hostname"
29
+ echo "${service}${<%= name %>_count}-${team}-${product}-${environment}.${domain}" > /etc/hostname
30
+ echo "Updating /etc/hosts"
31
+ echo "127.0.0.1 ${service}${<%= name %>_count}-${team}-${product}-${environment}.${domain}" >> /etc/hosts
32
+ }
33
+
34
+ function install_awscli {
35
+ apt-get update
36
+ apt-get install -qq python-pip
37
+ pip install awscli
38
+ }
39
+
40
+ function install_ssm_agent {
41
+ curl https://amazon-ssm-us-west-2.s3.amazonaws.com/latest/debian_amd64/amazon-ssm-agent.deb \
42
+ -o amazon-ssm-agent.deb
43
+ dpkg -i amazon-ssm-agent.deb
44
+ systemctl start amazon-ssm-agent
45
+ }
46
+
47
+ function install_consul {
48
+ # Install consul agent function
49
+ apt-get update
50
+ apt-get install -qq curl unzip
51
+ mkdir -p /var/lib/consul
52
+ wget https://releases.hashicorp.com/consul/${consul_agent_version}/consul_${consul_agent_version}_linux_amd64.zip
53
+ unzip consul_${consul_agent_version}_linux_amd64.zip -d /usr/local/bin
54
+ rm consul_${consul_agent_version}_linux_amd64.zip
55
+ }
56
+
57
+ function install_consul_template {
58
+ # Install consul template
59
+ apt-get update
60
+ apt-get install -qq curl unzip
61
+ wget https://releases.hashicorp.com/consul-template/${consul_template_version}/consul-template_${consul_template_version}_linux_amd64.zip
62
+ unzip consul-template_${consul_template_version}_linux_amd64.zip -d /usr/local/bin
63
+ rm consul-template_${consul_template_version}_linux_amd64.zip
64
+ }
65
+
66
+ function prep_consul_agent_service {
67
+ #Setup consul service
68
+ cat > consul.service <<'CONSUL_AGENT_SYSTEMD'
69
+ [Unit]
70
+ Description=consul
71
+ Documentation=https://consul.io/docs/
72
+
73
+ [Service]
74
+ ExecStart=/usr/local/bin/consul agent \
75
+ -advertise=ADVERTISE_ADDR \
76
+ -bind=ADVERTISE_ADDR \
77
+ -client=ADVERTISE_ADDR \
78
+ -data-dir=/var/lib/consul \
79
+ -config-dir=/etc/consul.d \
80
+ -retry-join-ec2-tag-key=${consul_server_tag_key} \
81
+ -retry-join-ec2-tag-value=${consul_server_tag_value} \
82
+ -datacenter=${consul_datacenter}
83
+
84
+ ExecReload=/bin/kill -HUP $MAINPID
85
+ LimitNOFILE=65536
86
+ Restart=always
87
+ RestartSec=5
88
+
89
+ [Install]
90
+ WantedBy=multi-user.target
91
+ CONSUL_AGENT_SYSTEMD
92
+ sed -i "s/ADVERTISE_ADDR/$\{IP_ADDRESS\}/" consul.service
93
+ mv consul.service /etc/systemd/system/consul.service
94
+ mkdir /etc/consul.d
95
+ }
96
+
97
+ function prep_dnsmasq {
98
+ mkdir -p /etc/dnsmasq.d
99
+ cat > /etc/dnsmasq.d/10-consul <<'DNSMASQ_CONFIG'
100
+ server=/consul/127.0.0.1#8600
101
+ DNSMASQ_CONFIG
102
+ }
103
+
104
+ function enable_services {
105
+ /bin/systemctl enable consul
106
+ /bin/systemctl enable dnsmasq
107
+ }
108
+
109
+ function start_services {
110
+ /bin/systemctl start consul
111
+ /bin/systemctl start dnsmasq
112
+ }
113
+
114
+ function main {
115
+ set_hostname
116
+ install_awscli
117
+ install_ssm_agent
118
+ install_consul
119
+ install_consul_template
120
+
121
+ prep_consul_agent_service
122
+ prep_dnsmasq
123
+ enable_services
124
+ start_services
125
+ }
126
+
127
+ #Entry point
128
+ main
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  f.match(%r{^(test|spec|features)/})
24
24
  end
25
25
  spec.bindir = "bin"
26
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
26
+ spec.executables = "tfmod"
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_development_dependency "bundler", "~> 1.13"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tfmod-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - zane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-13 00:00:00.000000000 Z
11
+ date: 2017-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,8 +84,6 @@ description: A Terraform module generator from command line.
84
84
  email:
85
85
  - zane.williamson@gmail.com
86
86
  executables:
87
- - console
88
- - setup
89
87
  - tfmod
90
88
  extensions: []
91
89
  extra_rdoc_files: []
@@ -107,6 +105,7 @@ files:
107
105
  - templates/gitignore.erb
108
106
  - templates/main.tf.erb
109
107
  - templates/outputs.tf.erb
108
+ - templates/user-data.sh.erb
110
109
  - templates/variables.tf.erb
111
110
  - tfmod-generator.gemspec
112
111
  homepage: https://github.com/sepulworld/tfmod-generator