terrafying-components 2.4.4 → 2.4.5

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
  SHA256:
3
- metadata.gz: 23e03608c87c75ba0f94d3062a0c141c8117dd6f96df80a711ee1697de6cd0ec
4
- data.tar.gz: 3b4cb879c44f1e263fcc0a43e2c1cad928bfa24a8539438faa178d59306a6f03
3
+ metadata.gz: 1ac3e2c81fcce31c9eb2a7f055cefa5a8e1ece7497a0bfd46015be371777b373
4
+ data.tar.gz: 54e8efdb2687a96cf2c9dccdf1c6b74534df8416f0545cbfb0e4359e7a67a4d6
5
5
  SHA512:
6
- metadata.gz: a3a8a7897c64f9ec6326e1f576a7f97e7f494fad5e1409cb8ce4317950ea183e44063f4ae8b9916411c0b80fc06a69bf7679d7cb52864d05ffa29e80608ea91d
7
- data.tar.gz: bfe5e6519f8040f5b31a5988d032b3c23bd6ec2f8e3b12a3412a2b3dc332e13e4336f7a2be94910a3ccebb914dd4529c48cd126ccdfdbf1913a74a939564a5e2
6
+ metadata.gz: 2617ac149143c69ef6158686906b71ecead34c265ff583883fb8f8ee7c061148df10f161e3a7823c6ed4fa0a0d5b267b690af0567acc827e5db7003aa6ea4ae9
7
+ data.tar.gz: 7763c6b7fff418dd0e7c3df9c91459db585301334f9e788d8ee1438c899698d7cda56adb0927e4591ae9290a20df385869fee509f406fee240452ce3a85583ee
@@ -3,11 +3,11 @@
3
3
  module Terrafying
4
4
  module Components
5
5
  class Auditd
6
- def self.fluentd_conf(role, tags = [])
7
- new.fluentd_conf(role, tags)
6
+ def self.fluentd_conf(ignition, role, tags = [])
7
+ new.fluentd_conf(ignition, role, tags)
8
8
  end
9
9
 
10
- def fluentd_conf(role, tags)
10
+ def fluentd_conf(ignition, role, tags)
11
11
  tags = default_tags.merge(
12
12
  custom_tags(tags)
13
13
  )
@@ -15,8 +15,8 @@ module Terrafying
15
15
  {
16
16
  files: [
17
17
  systemd_input,
18
- ec2_filter(tags),
19
- s3_output(role)
18
+ ec2_filter(ignition, tags),
19
+ s3_output(ignition, role)
20
20
  ],
21
21
  iam_policy_statements: [
22
22
  allow_describe_instances,
@@ -103,7 +103,7 @@ module Terrafying
103
103
  )
104
104
  end
105
105
 
106
- def ec2_filter(tags)
106
+ def ec2_filter(ignition, tags)
107
107
  file_of(
108
108
  '20_auditd_filter_ec2',
109
109
  <<~EC2_FILTER
@@ -111,47 +111,81 @@ module Terrafying
111
111
  @type ec2_metadata
112
112
  metadata_refresh_seconds 300
113
113
  <record>
114
- #{map_tags(tags)}
114
+ #{map_tags(ignition, tags)}
115
115
  </record>
116
116
  </filter>
117
117
  EC2_FILTER
118
118
  )
119
119
  end
120
120
 
121
- def map_tags(tags)
122
- tags.map { |k, v| "#{k} ${#{v}}" }
123
- .reduce { |out, e| +out << "\n #{e}" }
121
+ def map_tags(ignition, tags)
122
+ if ignition == false
123
+ return tags.map { |k, v| "#{k} $${#{v}}" }
124
+ .reduce { |out, e| +out << "\n #{e}" }
125
+ end
126
+ return tags.map { |k, v| "#{k} ${#{v}}" }
127
+ .reduce { |out, e| +out << "\n #{e}" }
124
128
  end
125
129
 
126
- def s3_output(audit_role)
127
- file_of(
128
- '30_auditd_output_s3',
129
- <<~S3_OUTPUT
130
- <match auditd>
131
- @type s3
132
- <assume_role_credentials>
133
- role_arn #{audit_role}
134
- role_session_name "auditd-logging-\#{Socket.gethostname}"
135
- </assume_role_credentials>
136
- auto_create_bucket false
137
- s3_bucket uswitch-auditd-logs
138
- s3_region eu-west-1
139
- acl bucket-owner-full-control
140
- path auditd/%Y/%m/%d/
141
- s3_object_key_format "\%{path}\%{time_slice}_\#{Socket.gethostname}.\%{file_extension}"
142
- <buffer time>
143
- @type file
144
- path /fluent/var/s3
145
- timekey 300 # 5 minute partitions
146
- timekey_wait 0s
147
- timekey_use_utc true
148
- </buffer>
149
- <format>
150
- @type json
151
- </format>
152
- </match>
153
- S3_OUTPUT
154
- )
130
+ def s3_output(ignition, audit_role)
131
+ if ignition == false
132
+ return file_of(
133
+ '30_auditd_output_s3',
134
+ <<~S3_OUTPUT
135
+ <match auditd>
136
+ @type s3
137
+ <assume_role_credentials>
138
+ role_arn #{audit_role}
139
+ role_session_name "auditd-logging-\#{Socket.gethostname}"
140
+ </assume_role_credentials>
141
+ auto_create_bucket false
142
+ s3_bucket uswitch-auditd-logs
143
+ s3_region eu-west-1
144
+ acl bucket-owner-full-control
145
+ path auditd/%Y/%m/%d/
146
+ s3_object_key_format "\%%{path}\%%{time_slice}_\#{Socket.gethostname}.\%%{file_extension}"
147
+ <buffer time>
148
+ @type file
149
+ path /fluent/var/s3
150
+ timekey 300 # 5 minute partitions
151
+ timekey_wait 0s
152
+ timekey_use_utc true
153
+ </buffer>
154
+ <format>
155
+ @type json
156
+ </format>
157
+ </match>
158
+ S3_OUTPUT
159
+ )
160
+ end
161
+ return file_of(
162
+ '30_auditd_output_s3',
163
+ <<~S3_OUTPUT
164
+ <match auditd>
165
+ @type s3
166
+ <assume_role_credentials>
167
+ role_arn #{audit_role}
168
+ role_session_name "auditd-logging-\#{Socket.gethostname}"
169
+ </assume_role_credentials>
170
+ auto_create_bucket false
171
+ s3_bucket uswitch-auditd-logs
172
+ s3_region eu-west-1
173
+ acl bucket-owner-full-control
174
+ path auditd/%Y/%m/%d/
175
+ s3_object_key_format "\%{path}\%{time_slice}_\#{Socket.gethostname}.\%{file_extension}"
176
+ <buffer time>
177
+ @type file
178
+ path /fluent/var/s3
179
+ timekey 300 # 5 minute partitions
180
+ timekey_wait 0s
181
+ timekey_use_utc true
182
+ </buffer>
183
+ <format>
184
+ @type json
185
+ </format>
186
+ </match>
187
+ S3_OUTPUT
188
+ )
155
189
  end
156
190
  end
157
191
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ # this file is copied from ignition.rb: https://github.com/uswitch/terrafying-components/blob/master/lib/terrafying/components/ignition.rb
4
+
5
+ require 'erb'
6
+ require 'ostruct'
7
+ require 'yaml'
8
+
9
+ module Terrafying
10
+ module Components
11
+ class Cloudconfig
12
+ UNIT_REQUIRED_KEYS = [:name].freeze
13
+ FILE_REQUIRED_KEYS = %i[path mode contents].freeze
14
+
15
+ def self.generate(options = {})
16
+ options = {
17
+ keypairs: [],
18
+ volumes: [],
19
+ files: [],
20
+ units: [],
21
+ users: [],
22
+ networkd_units: [],
23
+ ssh_group: 'cloud',
24
+ disable_update_engine: false,
25
+ region: Terrafying::Generator.aws.region
26
+ }.merge(options)
27
+
28
+ unless options[:units].all? { |u| UNIT_REQUIRED_KEYS.all? { |key| u.key?(key) } }
29
+ raise "All units require the following keys: #{UNIT_REQUIRED_KEYS}"
30
+ end
31
+
32
+ unless options[:units].all? { |u| u.key?(:contents) || u.key?(:dropins) || u.fetch(:enabled, true) == false || u.fetch(:mask, false) == true }
33
+ raise 'All enabled unmasked units have to have contents and/or dropins'
34
+ end
35
+
36
+ unless options[:files].all? { |f| FILE_REQUIRED_KEYS.all? { |key| f.key?(key) } }
37
+ raise "All files require the following keys: #{FILE_REQUIRED_KEYS}"
38
+ end
39
+
40
+ options[:cas] = options[:keypairs].map { |kp| kp[:ca] }.compact.sort.uniq
41
+
42
+ # changes apart from ignition.rb
43
+ # changed template file to cloudconfig.yaml
44
+ erb_path = File.join(File.dirname(__FILE__), 'templates/cloudconfig.yaml')
45
+ erb = ERB.new(IO.read(erb_path), nil, '-')
46
+ # instead of ignition json, we'll output the yaml file
47
+ erb.result(OpenStruct.new(options).instance_eval { binding })
48
+
49
+ end
50
+ end
51
+ end
52
+ end
@@ -24,6 +24,7 @@ module Terrafying
24
24
  prom_name: 'prometheus',
25
25
  prom_version: 'v2.25.0',
26
26
  instances: 2,
27
+ ami:'',
27
28
  instance_type: 't3a.small',
28
29
  thanos_instance_type: 't3a.small',
29
30
  prometheus_tsdb_retention: '1d',
@@ -38,6 +39,7 @@ module Terrafying
38
39
  @prom_name = prom_name
39
40
  @prom_version = prom_version
40
41
  @instances = instances
42
+ @ami = ami
41
43
  @prometheus_instance_type = instance_type
42
44
  @thanos_instance_type = thanos_instance_type
43
45
  @prometheus_tsdb_retention = prometheus_tsdb_retention
@@ -96,6 +98,7 @@ module Terrafying
96
98
  instance_type: @prometheus_instance_type,
97
99
  iam_policy_statements: thanos_store_access,
98
100
  instances: [{}] * @instances,
101
+ ami: @ami,
99
102
  units: [prometheus_unit, thanos_sidecar_unit],
100
103
  files: [prometheus_conf, thanos_bucket],
101
104
  volumes: [prometheus_data_volume],
@@ -129,6 +132,7 @@ module Terrafying
129
132
  }
130
133
  ],
131
134
  instance_type: @thanos_instance_type,
135
+ ami: @ami,
132
136
  units: [thanos_unit(prometheus_thanos_sidecar_srv_fqdn)],
133
137
  instances: [{}] * @instances,
134
138
  loadbalancer: true,
@@ -5,6 +5,7 @@ require 'hash/merge_with_arrays'
5
5
  require 'terrafying/generator'
6
6
  require 'terrafying/util'
7
7
  require 'terrafying/components/auditd'
8
+ require 'terrafying/components/cloudconfig'
8
9
  require 'terrafying/components/dynamicset'
9
10
  require 'terrafying/components/endpointservice'
10
11
  require 'terrafying/components/ignition'
@@ -42,6 +43,7 @@ module Terrafying
42
43
  def create_in(vpc, name, options = {})
43
44
  options = {
44
45
  ami: aws.ami('base-image-fc-75aa2aef', owners = ['477284023816']),
46
+ ignition: true,
45
47
  instance_type: 't3a.micro',
46
48
  ports: [],
47
49
  instances: [{}],
@@ -66,12 +68,16 @@ module Terrafying
66
68
  }.merge(options)
67
69
 
68
70
  unless options[:audit_role].nil?
69
- fluentd_conf = Auditd.fluentd_conf(options[:audit_role], options[:tags].keys)
71
+ fluentd_conf = Auditd.fluentd_conf(options[:ignition], options[:audit_role], options[:tags].keys)
70
72
  options = options.merge_with_arrays_merged(fluentd_conf)
71
73
  end
72
74
 
73
- unless options.key? :user_data
74
- options[:user_data] = Ignition.generate(options)
75
+ unless options.key? :user_data
76
+ if options[:ignition] == true
77
+ options[:user_data] = Ignition.generate(options)
78
+ elsif options[:ignition] == false
79
+ options[:user_data] = Cloudconfig.generate(options)
80
+ end
75
81
  end
76
82
 
77
83
  unless options.key?(:loadbalancer_subnets)
@@ -0,0 +1,62 @@
1
+ #cloud-config
2
+ write_files:
3
+ <% units.each { |unit| %>
4
+ - path: "/etc/systemd/system/<%= unit[:name] %>"
5
+ content: "<%= unit[:contents].dump[1..-2] %>"
6
+ owner: "root:root"
7
+ <% } %>
8
+
9
+ <% files.each { |file| %>
10
+ - path: <%= file[:path] %>
11
+ permissions: '<%= file[:mode] %>'
12
+ owner: "root:root"
13
+ <% if !file[:contents].is_a?(Hash) %>
14
+ content: "<%= file[:contents].gsub(/\n/, '\\n').gsub(/\"/, '\\"') %>"
15
+ <% end %>
16
+ <% } %>
17
+
18
+ <% volumes.each { |volume| %>
19
+ - path: "/etc/systemd/system/<%= volume[:mount].tr('/','-')[1..-1] %>.mount"
20
+ owner: "root:root"
21
+ content: |
22
+ [Install]
23
+ WantedBy=local-fs.target
24
+ [Unit]
25
+ Before=docker.service
26
+ [Mount]
27
+ What=<%= volume[:device] %>
28
+ Where=<%= volume[:mount] %>
29
+ Type=ext4
30
+ <% } %>
31
+
32
+ - path: '/etc/usersync.env'
33
+ permissions: 0644
34
+ owner: "root:root"
35
+ content: |
36
+ USERSYNC_SSH_GROUP="<%= ssh_group %>"
37
+
38
+
39
+ runcmd:
40
+ <% units.each { |unit| %>
41
+ - systemctl restart <%= unit[:name] %>
42
+ - systemctl enable <%= unit[:name] %>
43
+ <% } %>
44
+ <% keypairs.each { |keypair| %>
45
+ - aws s3 cp <%= keypair[:source][:cert] %> <%= keypair[:path][:cert] %>
46
+ - aws s3 cp <%= keypair[:source][:key] %> <%= keypair[:path][:key] %>
47
+ <% } %>
48
+ <% cas.each { |ca| %>
49
+ - aws s3 cp <%= ca.source %> /etc/ssl/<%= ca.name %>/ca.cert
50
+ <% } %>
51
+
52
+ <% files.each { |file| %>
53
+ <% if file[:contents].is_a?(Hash) %>
54
+ - aws s3 cp <%= file[:contents][:source] %> <%= file[:path] %>
55
+ <% end %>
56
+ <% } %>
57
+
58
+ <% volumes.each { |volume| %>
59
+ - mkfs -t ext4 <%= volume[:device] %>
60
+ - mount <%= volume[:device] %> <%= volume[:mount].tr('/','-')[1..-1] %>
61
+ - systemctl enable <%= volume[:mount].tr('/','-')[1..-1] %>.mount
62
+ <% } %>
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Terrafying
4
4
  module Components
5
- VERSION = '2.4.4'
5
+ VERSION = '2.4.5'
6
6
  end
7
7
  end
@@ -35,6 +35,8 @@ module Terrafying
35
35
  def initialize(
36
36
  vpc:,
37
37
  name:,
38
+ ignition: true,
39
+ ami: '',
38
40
  client_id:,
39
41
  issuer_url:,
40
42
  ca: nil,
@@ -53,6 +55,8 @@ module Terrafying
53
55
  super()
54
56
  @vpc = vpc
55
57
  @name = name
58
+ @ignition = ignition
59
+ @ami = ami
56
60
  @client_id = client_id
57
61
  @issuer_url = issuer_url
58
62
  @ca = ca
@@ -74,6 +78,7 @@ module Terrafying
74
78
  def create_in
75
79
  units = [
76
80
  openvpn_service,
81
+ add_iptables_rules_service,
77
82
  openvpn_authz_service(@ca, @fqdn, @route_all_traffic, @route_dns_entries, @groups, @client_id, @issuer_url),
78
83
  ]
79
84
 
@@ -100,10 +105,12 @@ module Terrafying
100
105
  @service = add! Service.create_in(
101
106
  @vpc, @name,
102
107
  {
108
+ ignition: @ignition,
103
109
  eip: @public,
104
110
  public: @public,
105
111
  ports: [22, 443, { number: 1194, type: 'udp' }],
106
112
  tags:@tags,
113
+ ami:@ami,
107
114
  units: units + @units,
108
115
  files: files,
109
116
  keypairs: keypairs,
@@ -243,6 +250,24 @@ module Terrafying
243
250
  }
244
251
  end
245
252
 
253
+ # these iptables rules are needed in order to get VPN working
254
+ def add_iptables_rules_service
255
+ {
256
+ name: 'add-iptables-rules.service',
257
+ enabled: false,
258
+ contents: <<~ADD_IPTABLES_RULE
259
+ [Install]
260
+ WantedBy=multi-user.target
261
+ [Unit]
262
+ Description=Add Iptables rules
263
+ [Service]
264
+ Type=oneshot
265
+ ExecStartPre=/sbin/iptables -A FORWARD -i tun+ -j ACCEPT
266
+ ExecStart=/sbin/iptables -A FORWARD -o tun+ -j ACCEPT
267
+ ADD_IPTABLES_RULE
268
+ }
269
+ end
270
+
246
271
  def openvpn_service
247
272
  Ignition.container_unit(
248
273
  'openvpn', @openvpn_image,
@@ -252,7 +277,7 @@ module Terrafying
252
277
  '/etc/ssl/openvpn:/etc/ssl/openvpn:ro',
253
278
  '/etc/openvpn:/etc/openvpn'
254
279
  ],
255
- required_units: ['docker.service', 'network-online.target', 'openvpn-authz.service']
280
+ required_units: ['docker.service', 'network-online.target', 'openvpn-authz.service', 'add-iptables-rules.service']
256
281
  )
257
282
  end
258
283
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terrafying-components
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.4
4
+ version: 2.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - uSwitch Limited
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-28 00:00:00.000000000 Z
11
+ date: 2022-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -91,6 +91,7 @@ files:
91
91
  - lib/terrafying/components.rb
92
92
  - lib/terrafying/components/auditd.rb
93
93
  - lib/terrafying/components/ca.rb
94
+ - lib/terrafying/components/cloudconfig.rb
94
95
  - lib/terrafying/components/dynamicset.rb
95
96
  - lib/terrafying/components/endpoint.rb
96
97
  - lib/terrafying/components/endpointservice.rb
@@ -114,6 +115,7 @@ files:
114
115
  - lib/terrafying/components/service.rb
115
116
  - lib/terrafying/components/staticset.rb
116
117
  - lib/terrafying/components/subnet.rb
118
+ - lib/terrafying/components/templates/cloudconfig.yaml
117
119
  - lib/terrafying/components/templates/ignition.yaml
118
120
  - lib/terrafying/components/usable.rb
119
121
  - lib/terrafying/components/version.rb