terraform-wrapper 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +2 -0
- data/lib/terraform-wrapper.rb +2 -1
- data/lib/terraform-wrapper/shared/backends/aws.rb +41 -8
- data/lib/terraform-wrapper/shared/logger.rb +3 -3
- data/lib/terraform-wrapper/shared/runner.rb +22 -0
- data/lib/terraform-wrapper/tasks.rb +1 -0
- data/lib/terraform-wrapper/tasks/import.rb +70 -0
- data/lib/terraform-wrapper/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0f59fe60b44165f5771d0e20fe31b8e6d9f4dd05646a7a32ee5cb41de1c94ce
|
4
|
+
data.tar.gz: 268a408964acce9c9bc9745fea9c5ef154f7aee861f3245c4ea668a43548cc1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9f91604fe4042be3b34dcb59cc2049808a28dd0ccfef2f8998518fbb4d6ed3c62801472bd4e8c1d9e0d035697b9e9ec0542e464c9e15bafbe3ed6047d2c9177
|
7
|
+
data.tar.gz: 5fc7cd614aa04419fa0a09c8843bd20e1b2a78f684926ddd5a98b4a1d4e429ceca8cee92be0ad0cbf837d8dc49b8dfd61faed176c547e3c2561676d8d2c0d9af
|
data/.gitlab-ci.yml
CHANGED
data/lib/terraform-wrapper.rb
CHANGED
@@ -14,7 +14,7 @@ module TerraformWrapper
|
|
14
14
|
|
15
15
|
###############################################################################
|
16
16
|
|
17
|
-
@logger = Shared::Logging.logger_for("TerraformWrapper")
|
17
|
+
@logger = TerraformWrapper::Shared::Logging.logger_for("TerraformWrapper")
|
18
18
|
|
19
19
|
###############################################################################
|
20
20
|
|
@@ -51,6 +51,7 @@ module TerraformWrapper
|
|
51
51
|
tasks << TerraformWrapper::Tasks::Binary.new(binary: binary)
|
52
52
|
tasks << TerraformWrapper::Tasks::Clean.new(code: code)
|
53
53
|
tasks << TerraformWrapper::Tasks::Destroy.new(binary: binary, code: code, options: config_options)
|
54
|
+
tasks << TerraformWrapper::Tasks::Import.new(binary: binary, code: code, options: config_options)
|
54
55
|
tasks << TerraformWrapper::Tasks::Init.new(binary: binary, code: code, options: config_options)
|
55
56
|
tasks << TerraformWrapper::Tasks::Plan.new(binary: binary, code: code, options: config_options)
|
56
57
|
tasks << TerraformWrapper::Tasks::PlanDestroy.new(binary: binary, code: code, options: config_options)
|
@@ -29,6 +29,7 @@ module TerraformWrapper
|
|
29
29
|
###############################################################################
|
30
30
|
|
31
31
|
attr_reader :bucket
|
32
|
+
attr_reader :encrypt
|
32
33
|
attr_reader :key
|
33
34
|
attr_reader :region
|
34
35
|
|
@@ -41,11 +42,17 @@ module TerraformWrapper
|
|
41
42
|
###############################################################################
|
42
43
|
|
43
44
|
def hash()
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
result = Hash.new
|
46
|
+
|
47
|
+
result["bucket"] = @bucket
|
48
|
+
result["region"] = @region
|
49
|
+
result["key"] = @key
|
50
|
+
result["encrypt"] = @encrypt.to_s
|
51
|
+
|
52
|
+
result["kms_key_id"] = @kms unless @kms.nil?
|
53
|
+
result["role_arn"] = @role unless @role.nil?
|
54
|
+
|
55
|
+
return result
|
49
56
|
end
|
50
57
|
|
51
58
|
###############################################################################
|
@@ -55,6 +62,9 @@ module TerraformWrapper
|
|
55
62
|
###############################################################################
|
56
63
|
|
57
64
|
def specific()
|
65
|
+
kms = nil
|
66
|
+
role = nil
|
67
|
+
|
58
68
|
logger.fatal("AWS backend mandatory option 'bucket' has not been set!") unless @options.key?("bucket")
|
59
69
|
logger.fatal("AWS backend mandatory option 'region' has not been set!") unless @options.key?("region")
|
60
70
|
|
@@ -73,6 +83,24 @@ module TerraformWrapper
|
|
73
83
|
logger.fatal("AWS backend S3 bucket key must be a String!") unless key.kind_of?(String)
|
74
84
|
logger.fatal("AWS backend S3 bucket key must not be blank!") if key.strip.empty?
|
75
85
|
|
86
|
+
encrypt = @options.key?("encrypt") ? @options["encrypt"] : true
|
87
|
+
|
88
|
+
logger.fatal("AWS backend S3 bucket encryption enabled must be a Boolean!") unless [ true, false ].include?(encrypt)
|
89
|
+
|
90
|
+
if @options.key?("kms") then
|
91
|
+
kms = @options["kms"]
|
92
|
+
|
93
|
+
logger.fatal("AWS backend S3 bucket encryption KMS key ARN must be a String if specified!") unless kms.kind_of?(String)
|
94
|
+
logger.fatal("AWS backend S3 bucket encryption KMS key ARN must not be blank if specified!") if kms.strip.empty?
|
95
|
+
end
|
96
|
+
|
97
|
+
if @options.key?("role") then
|
98
|
+
role = @options["role"]
|
99
|
+
|
100
|
+
logger.fatal("AWS backend role to assume ARN must be a String if specified!") unless role.kind_of?(String)
|
101
|
+
logger.fatal("AWS backend role to assume ARN must not be blank if specified!") if role.strip.empty?
|
102
|
+
end
|
103
|
+
|
76
104
|
logger.fatal("AWS backend S3 bucket name or key must include %{service}.") unless (bucket.include?("%{service}") or key.include?("%{service}"))
|
77
105
|
logger.fatal("AWS backend S3 bucket name or key must include %{config}.") unless (bucket.include?("%{config}") or key.include?("%{config}"))
|
78
106
|
logger.fatal("AWS backend S3 bucket name or key must include %{component}.") unless (bucket.include?("%{component}") or key.include?("%{component}"))
|
@@ -81,15 +109,20 @@ module TerraformWrapper
|
|
81
109
|
bucket = bucket % @variables
|
82
110
|
region = region % @variables
|
83
111
|
key = key % @variables
|
112
|
+
kms = kms % @variables unless kms.nil?
|
113
|
+
role = role % @variables unless role.nil?
|
84
114
|
rescue
|
85
115
|
logger.fatal("AWS backend options contain variables that are not included in the configuration file!")
|
86
116
|
end
|
87
117
|
|
88
118
|
logger.fatal("Key: #{key} is too long for backend of type: #{@@type}") if key.length > 1024
|
89
119
|
|
90
|
-
@bucket
|
91
|
-
@region
|
92
|
-
@key
|
120
|
+
@bucket = bucket
|
121
|
+
@region = region
|
122
|
+
@key = key
|
123
|
+
@encrypt = encrypt
|
124
|
+
@kms = kms
|
125
|
+
@role = role
|
93
126
|
end
|
94
127
|
|
95
128
|
###############################################################################
|
@@ -39,19 +39,19 @@ module TerraformWrapper
|
|
39
39
|
###############################################################################
|
40
40
|
|
41
41
|
def warn(message)
|
42
|
-
|
42
|
+
super(format(colour: 33, message: message))
|
43
43
|
end
|
44
44
|
|
45
45
|
###############################################################################
|
46
46
|
|
47
47
|
def error(message)
|
48
|
-
|
48
|
+
super(format(colour: 31, message: message))
|
49
49
|
end
|
50
50
|
|
51
51
|
###############################################################################
|
52
52
|
|
53
53
|
def fatal(message)
|
54
|
-
|
54
|
+
super(format(colour: 31, message: message))
|
55
55
|
exit(1)
|
56
56
|
end
|
57
57
|
|
@@ -43,6 +43,28 @@ module TerraformWrapper
|
|
43
43
|
logger.fatal("Failed to download Terraform modules.") unless @downloaded
|
44
44
|
end
|
45
45
|
|
46
|
+
###############################################################################
|
47
|
+
|
48
|
+
def import(address: nil, id: nil)
|
49
|
+
logger.fatal("Cannot Terraform import before initialising backend!") unless initialised
|
50
|
+
|
51
|
+
logger.fatal("Terraform state address for import must be a String!") unless address.kind_of?(String)
|
52
|
+
logger.fatal("Terraform state address for import must be a String!") unless address.kind_of?(String)
|
53
|
+
logger.fatal("Terraform state address for import must not be blank!") if address.strip.empty?
|
54
|
+
|
55
|
+
logger.fatal("Identification for infrastructure to import must be a String!") unless id.kind_of?(String)
|
56
|
+
logger.fatal("Identification for infrastructure to import must not be blank!") if id.strip.empty?
|
57
|
+
|
58
|
+
parameters = Array.new
|
59
|
+
parameters.concat(variable_files)
|
60
|
+
parameters.concat(variable_strings)
|
61
|
+
|
62
|
+
parameters.append("\"#{address}\"")
|
63
|
+
parameters.append("\"#{id}\"")
|
64
|
+
|
65
|
+
logger.fatal("Terraform import failed!") unless run(action: "import", parameters: parameters)
|
66
|
+
end
|
67
|
+
|
46
68
|
###############################################################################
|
47
69
|
|
48
70
|
def init(config:, upgrade: true)
|
@@ -4,6 +4,7 @@ require_relative 'tasks/apply'
|
|
4
4
|
require_relative 'tasks/binary'
|
5
5
|
require_relative 'tasks/clean'
|
6
6
|
require_relative 'tasks/destroy'
|
7
|
+
require_relative 'tasks/import'
|
7
8
|
require_relative 'tasks/init'
|
8
9
|
require_relative 'tasks/plan'
|
9
10
|
require_relative 'tasks/plandestroy'
|
@@ -0,0 +1,70 @@
|
|
1
|
+
###############################################################################
|
2
|
+
|
3
|
+
require 'rake/tasklib'
|
4
|
+
|
5
|
+
###############################################################################
|
6
|
+
|
7
|
+
module TerraformWrapper
|
8
|
+
|
9
|
+
###############################################################################
|
10
|
+
|
11
|
+
module Tasks
|
12
|
+
|
13
|
+
###############################################################################
|
14
|
+
|
15
|
+
class Import < ::Rake::TaskLib
|
16
|
+
|
17
|
+
###############################################################################
|
18
|
+
|
19
|
+
include TerraformWrapper::Shared::Logging
|
20
|
+
|
21
|
+
###############################################################################
|
22
|
+
|
23
|
+
@binary
|
24
|
+
@code
|
25
|
+
@options
|
26
|
+
|
27
|
+
###############################################################################
|
28
|
+
|
29
|
+
def initialize(binary:, code:, options:)
|
30
|
+
@binary = binary
|
31
|
+
@code = code
|
32
|
+
@options = options
|
33
|
+
|
34
|
+
yield self if block_given?
|
35
|
+
|
36
|
+
import_task
|
37
|
+
end
|
38
|
+
|
39
|
+
###############################################################################
|
40
|
+
|
41
|
+
def import_task
|
42
|
+
desc "Import a piece of existing infrastructure into Terraform state for a given configuration on an infrastructure component."
|
43
|
+
task :import, [:config, :address, :id] => :binary do |t, args|
|
44
|
+
options = @options.merge({"name" => args[:config]})
|
45
|
+
|
46
|
+
logger.info("Processing configuration for Terraform import...")
|
47
|
+
|
48
|
+
config = TerraformWrapper::Shared::Config.new(code: @code, options: options)
|
49
|
+
runner = TerraformWrapper::Shared::Runner.new(binary: @binary, code: @code)
|
50
|
+
|
51
|
+
logger.info("Running Terraform import for service: #{config.service}, component: #{@code.name}...")
|
52
|
+
|
53
|
+
runner.init(config: config)
|
54
|
+
runner.import(address: args[:address], id: args[:id])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
###############################################################################
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
###############################################################################
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
###############################################################################
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
###############################################################################
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terraform-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Lees
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A ruby wrapper for managing Terraform binaries and remote state. Each
|
14
14
|
Terraform command (plan, apply, etc) is wrapped so that the correct binary is used
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/terraform-wrapper/tasks/binary.rb
|
51
51
|
- lib/terraform-wrapper/tasks/clean.rb
|
52
52
|
- lib/terraform-wrapper/tasks/destroy.rb
|
53
|
+
- lib/terraform-wrapper/tasks/import.rb
|
53
54
|
- lib/terraform-wrapper/tasks/init.rb
|
54
55
|
- lib/terraform-wrapper/tasks/plan.rb
|
55
56
|
- lib/terraform-wrapper/tasks/plandestroy.rb
|