ruby-terraform 0.65.0.pre.15 → 1.1.0

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +15 -15
  3. data/README.md +153 -398
  4. data/Rakefile +25 -0
  5. data/lib/ruby_terraform.rb +707 -45
  6. data/lib/ruby_terraform/commands.rb +0 -2
  7. data/lib/ruby_terraform/commands/apply.rb +7 -7
  8. data/lib/ruby_terraform/commands/base.rb +4 -1
  9. data/lib/ruby_terraform/commands/destroy.rb +6 -5
  10. data/lib/ruby_terraform/commands/force_unlock.rb +6 -4
  11. data/lib/ruby_terraform/commands/format.rb +8 -4
  12. data/lib/ruby_terraform/commands/get.rb +6 -4
  13. data/lib/ruby_terraform/commands/graph.rb +11 -3
  14. data/lib/ruby_terraform/commands/import.rb +8 -7
  15. data/lib/ruby_terraform/commands/init.rb +16 -6
  16. data/lib/ruby_terraform/commands/login.rb +2 -2
  17. data/lib/ruby_terraform/commands/logout.rb +2 -2
  18. data/lib/ruby_terraform/commands/output.rb +2 -2
  19. data/lib/ruby_terraform/commands/plan.rb +6 -3
  20. data/lib/ruby_terraform/commands/providers.rb +9 -3
  21. data/lib/ruby_terraform/commands/providers_lock.rb +10 -7
  22. data/lib/ruby_terraform/commands/providers_mirror.rb +3 -3
  23. data/lib/ruby_terraform/commands/providers_schema.rb +21 -2
  24. data/lib/ruby_terraform/commands/refresh.rb +70 -3
  25. data/lib/ruby_terraform/commands/show.rb +26 -3
  26. data/lib/ruby_terraform/commands/state_list.rb +54 -3
  27. data/lib/ruby_terraform/commands/state_move.rb +64 -6
  28. data/lib/ruby_terraform/commands/state_pull.rb +24 -2
  29. data/lib/ruby_terraform/commands/state_push.rb +49 -3
  30. data/lib/ruby_terraform/commands/state_remove.rb +55 -7
  31. data/lib/ruby_terraform/commands/state_replace_provider.rb +39 -6
  32. data/lib/ruby_terraform/commands/state_show.rb +26 -2
  33. data/lib/ruby_terraform/commands/taint.rb +63 -2
  34. data/lib/ruby_terraform/commands/untaint.rb +55 -2
  35. data/lib/ruby_terraform/commands/validate.rb +51 -6
  36. data/lib/ruby_terraform/commands/workspace_delete.rb +29 -7
  37. data/lib/ruby_terraform/commands/workspace_list.rb +21 -6
  38. data/lib/ruby_terraform/commands/workspace_new.rb +28 -7
  39. data/lib/ruby_terraform/commands/workspace_select.rb +23 -7
  40. data/lib/ruby_terraform/commands/workspace_show.rb +17 -2
  41. data/lib/ruby_terraform/options.rb +1 -1
  42. data/lib/ruby_terraform/options/definition.rb +3 -1
  43. data/lib/ruby_terraform/options/definitions.rb +12 -3
  44. data/lib/ruby_terraform/options/{common.rb → global.rb} +1 -1
  45. data/lib/ruby_terraform/options/types.rb +0 -1
  46. data/lib/ruby_terraform/options/types/flag.rb +8 -4
  47. data/lib/ruby_terraform/options/types/standard.rb +20 -6
  48. data/lib/ruby_terraform/version.rb +1 -1
  49. data/ruby_terraform.gemspec +2 -2
  50. metadata +11 -14
  51. data/lib/ruby_terraform/commands/clean.rb +0 -26
  52. data/lib/ruby_terraform/commands/remote_config.rb +0 -25
  53. data/lib/ruby_terraform/options/types/base.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 856fa5b4cbf4a93f6a7e9d0c7abab4a25c56e362c33f1182762d9fe70f3c8520
4
- data.tar.gz: 695688910f5e277ae91649169e1e9bbfe4ef6fe2fbc4a4c1f3b4f3b4559701b5
3
+ metadata.gz: 9f4ae39c4a34e12d7a51c76fc26e7c7271f21e26b88da83a5a5be854bf9d215b
4
+ data.tar.gz: 98a9f9a1c404535d9c4c4f187e6fe98584c9a01445ef0f66dc65940c9d566230
5
5
  SHA512:
6
- metadata.gz: 1aa00badf71f9f0db717c7a06a4806e7225b6b6005f61601043af3975ebbacb6e82826d24f792a3b602365178711f3a0b4a010b642dbb5c3be300e0f8955a202
7
- data.tar.gz: faf27462271fc0c7a04b38e0221590c33e2fb25679816317509744c3ddfd6024200587cb0c92cc3eeb7e12290a48bb105c05ddc16e3deb30144cd033889bda6e
6
+ metadata.gz: 7af4793a1b9570710f2180d6f02d912f7beb174084eb1b5624548417cb8022eda04f9b0680e777bad9f9b430c72548c146df37c9c587bba9b962e0324072d366
7
+ data.tar.gz: 9d85298f945230b68d9a42a9a321de1362cd1775f78af10a237add1f42544882b92ba42a50778aff0998f46464ca4f81f079de9d7909378f9e8a4a3d87e68524
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-terraform (0.65.0.pre.15)
5
- immutable-struct (>= 2.4)
6
- lino (>= 2.5)
4
+ ruby-terraform (1.1.0)
5
+ immutable-struct (~> 2.4)
6
+ lino (~> 2.7)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (6.1.3.1)
11
+ activesupport (6.1.3.2)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
13
  i18n (>= 1.6, < 2)
14
14
  minitest (>= 5.1)
@@ -22,7 +22,7 @@ GEM
22
22
  concurrent-ruby (1.1.8)
23
23
  diff-lcs (1.4.4)
24
24
  docile (1.3.5)
25
- excon (0.80.1)
25
+ excon (0.81.0)
26
26
  faker (2.17.0)
27
27
  i18n (>= 1.6, < 2)
28
28
  faraday (1.4.1)
@@ -56,7 +56,7 @@ GEM
56
56
  i18n (1.8.10)
57
57
  concurrent-ruby (~> 1.0)
58
58
  immutable-struct (2.4.1)
59
- lino (2.5.0)
59
+ lino (2.7.0)
60
60
  hamster (~> 3.0)
61
61
  open4 (~> 1.3)
62
62
  listen (3.5.1)
@@ -70,12 +70,12 @@ GEM
70
70
  notiffany (0.1.3)
71
71
  nenv (~> 0.1)
72
72
  shellany (~> 0.0)
73
- octokit (4.20.0)
73
+ octokit (4.21.0)
74
74
  faraday (>= 0.9)
75
75
  sawyer (~> 0.8.0, >= 0.5.3)
76
76
  open4 (1.3.4)
77
77
  parallel (1.20.1)
78
- parser (3.0.1.0)
78
+ parser (3.0.1.1)
79
79
  ast (~> 2.4.1)
80
80
  pry (0.14.1)
81
81
  coderay (~> 1.1)
@@ -121,20 +121,20 @@ GEM
121
121
  diff-lcs (>= 1.2.0, < 2.0)
122
122
  rspec-support (~> 3.10.0)
123
123
  rspec-support (3.10.2)
124
- rubocop (1.13.0)
124
+ rubocop (1.14.0)
125
125
  parallel (~> 1.10)
126
126
  parser (>= 3.0.0.0)
127
127
  rainbow (>= 2.2.2, < 4.0)
128
128
  regexp_parser (>= 1.8, < 3.0)
129
129
  rexml
130
- rubocop-ast (>= 1.2.0, < 2.0)
130
+ rubocop-ast (>= 1.5.0, < 2.0)
131
131
  ruby-progressbar (~> 1.7)
132
132
  unicode-display_width (>= 1.4.0, < 3.0)
133
- rubocop-ast (1.4.1)
134
- parser (>= 2.7.1.5)
133
+ rubocop-ast (1.5.0)
134
+ parser (>= 3.0.1.1)
135
135
  rubocop-rake (0.5.1)
136
136
  rubocop
137
- rubocop-rspec (2.2.0)
137
+ rubocop-rspec (2.3.0)
138
138
  rubocop (~> 1.0)
139
139
  rubocop-ast (>= 1.1.0)
140
140
  ruby-progressbar (1.11.0)
@@ -150,7 +150,7 @@ GEM
150
150
  simplecov-html (~> 0.11)
151
151
  simplecov_json_formatter (~> 0.1)
152
152
  simplecov-html (0.12.3)
153
- simplecov_json_formatter (0.1.2)
153
+ simplecov_json_formatter (0.1.3)
154
154
  sshkey (2.0.0)
155
155
  thor (1.1.0)
156
156
  tzinfo (2.0.4)
@@ -182,4 +182,4 @@ DEPENDENCIES
182
182
  yard (~> 0.9)
183
183
 
184
184
  BUNDLED WITH
185
- 2.2.16
185
+ 2.2.17
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # RubyTerraform
2
2
 
3
3
  A simple wrapper around the Terraform binary to allow execution from within
4
- a Ruby program or Rakefile.
4
+ a Ruby program, RSpec test or Rakefile.
5
5
 
6
6
 
7
7
  ## Installation
@@ -23,451 +23,165 @@ Or install it yourself as:
23
23
 
24
24
  ## Usage
25
25
 
26
- RubyTerraform needs to know where the terraform binary is located before it
27
- can do anything. By default, RubyTerraform looks on the path however this can
28
- be configured with:
26
+ To require `RubyTerraform`:
29
27
 
30
28
  ```ruby
31
- RubyTerraform.configure do |config|
32
- config.binary = 'vendor/terraform/bin/terraform'
33
- end
29
+ require 'ruby-terraform'
34
30
  ```
35
31
 
36
- In addition, each command that requires the terraform binary (all except
37
- `clean`) takes a `binary` keyword argument at initialisation that overrides the
38
- global configuration value.
32
+ ### Supported versions and commands
39
33
 
40
- ### RubyTerraform::Commands::Clean
41
-
42
- The clean command can be called in the following ways:
43
-
44
- ```ruby
45
- RubyTerraform.clean
46
- RubyTerraform.clean(directory: 'infra/.terraform')
47
- RubyTerraform::Commands::Clean.new(directory: 'infra/.terraform').execute
48
- RubyTerraform::Commands::Clean.new.execute(directory: 'infra/.terraform')
49
- ```
34
+ `RubyTerraform` supports all commands and options up to Terraform 0.15, except
35
+ `terraform console`, `terraform test` and `terraform version`.
50
36
 
51
- When called, it removes the contents of the .terraform directory in the
52
- working directory by default. If another directory is specified, it instead
53
- removes the specified directory.
37
+ ### Getting started
54
38
 
39
+ There are a couple of ways to call Terraform using `RubyTerraform`.
55
40
 
56
- ### RubyTerraform::Commands::Init
41
+ Firstly, the `RubyTerraform` module includes class methods for each of the
42
+ supported Terraform commands. Each class method takes a parameter hash
43
+ containing options to pass to Terraform.
57
44
 
58
- The init command will initialise a terraform environment. It can be called in
59
- the following ways:
60
-
61
- ```ruby
62
- RubyTerraform.init
63
- RubyTerraform.init(from_module: 'some/module/path', path: 'infra/module')
64
- RubyTerraform::Commands::Init.new.execute
65
- RubyTerraform::Commands::Init.new.execute(
66
- from_module: 'some/module/path',
67
- path: 'infra/module')
68
- ```
69
-
70
- The init command supports the following options passed as keyword arguments:
71
- * `from_module`: the source module to use to initialise; required if `path` is
72
- specified
73
- * `path`: the path to initialise.
74
- * `backend`: `true`/`false`, whether or not to configure the backend.
75
- * `get`: `true`/`false`, whether or not to get dependency modules.
76
- * `backend_config`: a map of backend specific configuration parameters.
77
- * `no_color`: whether or not the output from the command should be in color;
78
- defaults to `false`.
79
- * `plugin_dir`: directory containing plugin binaries. Overrides all default;
80
- search paths for plugins and prevents the automatic installation of plugins.
81
-
82
-
83
- ### RubyTerraform::Commands::Get
84
-
85
- The get command will fetch any modules referenced in the provided terraform
86
- configuration directory. It can be called in the following ways:
87
-
88
- ```ruby
89
- RubyTerraform.get(directory: 'infra/networking')
90
- RubyTerraform::Commands::Get.new.execute(directory: 'infra/networking')
91
- ```
92
-
93
- The get command supports the following options passed as keyword arguments:
94
- * `directory`: the directory containing terraform configuration; required.
95
- * `update`: whether or not already downloaded modules should be updated;
96
- defaults to `false`.
97
- * `no_color`: whether or not the output from the command should be in color;
98
- defaults to `false`.
99
-
100
-
101
- ### RubyTerraform::Commands::Plan
102
-
103
- The plan command will generate the execution plan in the provided
104
- configuration directory. It can be called in the following ways:
45
+ For example, to save the plan of changes for a Terraform configuration located
46
+ under `infra/network` to a file called `network.tfplan` whilst providing some
47
+ vars:
105
48
 
106
49
  ```ruby
107
50
  RubyTerraform.plan(
108
- directory: 'infra/networking',
109
- vars: {
110
- region: 'eu-central'
111
- })
112
- RubyTerraform::Commands::Plan.new.execute(
113
- directory: 'infra/networking',
51
+ chdir: 'infra/network',
52
+ out: 'network.tfplan',
114
53
  vars: {
115
54
  region: 'eu-central'
116
- })
55
+ },
56
+ var_file: 'defaults.tfvars'
57
+ )
117
58
  ```
118
59
 
119
- The plan command supports the following options passed as keyword arguments:
120
- * `directory`: the directory containing terraform configuration; required.
121
- * `vars`: a map of vars to be passed in to the terraform configuration.
122
- * `var_file`: the path to a terraform var file; if both `var_file` and
123
- `var_files` are provided, all var files will be passed to terraform.
124
- * `var_files`: an array of paths to terraform var files; if both `var_file` and
125
- `var_files` are provided, all var files will be passed to terraform.
126
- * `target`: the address of a resource to target; if both `target` and
127
- `targets` are provided, all targets will be passed to terraform.
128
- * `targets`: and array of resource addresses to target; if both `target` and
129
- `targets` are provided, all targets will be passed to terraform.
130
- * `state`: the path to the state file in which to store state; defaults to
131
- terraform.tfstate in the working directory or the remote state if configured.
132
- * `plan`: the name of the file in which to save the generated plan.
133
- * `input`: when `false`, will not ask for input for variables not directly set;
134
- defaults to `true`.
135
- * `destroy`: when `true`, a plan will be generated to destroy all resources
136
- managed by the given configuration and state; defaults to `false`.
137
- * `no_color`: whether or not the output from the command should be in color;
138
- defaults to `false`.
139
-
140
-
141
- ### RubyTerraform::Commands::Apply
142
-
143
- The apply command applies terraform configuration in the provided terraform
144
- configuration directory. It can be called in the following ways:
60
+ To apply the generated plan of changes:
145
61
 
146
62
  ```ruby
147
63
  RubyTerraform.apply(
148
- directory: 'infra/networking',
64
+ chdir: 'infra/network',
65
+ plan: 'network.tfplan',
149
66
  vars: {
150
67
  region: 'eu-central'
151
- })
152
- RubyTerraform::Commands::Apply.new.execute(
153
- directory: 'infra/networking',
154
- vars: {
155
- region: 'eu-central'
156
- })
157
- ```
158
-
159
- The apply command supports the following options passed as keyword arguments:
160
- * `directory`: the directory containing terraform configuration; required.
161
- * `vars`: a map of vars to be passed in to the terraform configuration.
162
- * `var_file`: the path to a terraform var file; if both `var_file` and
163
- `var_files` are provided, all var files will be passed to terraform.
164
- * `var_files`: an array of paths to terraform var files; if both `var_file` and
165
- `var_files` are provided, all var files will be passed to terraform.
166
- * `target`: the address of a resource to target; if both `target` and
167
- `targets` are provided, all targets will be passed to terraform.
168
- * `targets`: and array of resource addresses to target; if both `target` and
169
- `targets` are provided, all targets will be passed to terraform.
170
- * `state`: the path to the state file in which to store state; defaults to
171
- terraform.tfstate in the working directory or the remote state if configured.
172
- * `backup`: the path to the backup file in which to store the state backup.
173
- * `input`: when `false`, will not ask for input for variables not directly set;
174
- defaults to `true`.
175
- * `no_backup`: when `true`, no backup file will be written; defaults to `false`.
176
- * `no_color`: whether or not the output from the command should be in color;
177
- defaults to `false`.
178
- * `auto_approve`: if `true`, the command applys without prompting the user to
179
- confirm the changes; defaults to `false`.
180
-
181
-
182
- ### RubyTerraform::Commands::Show
183
-
184
- The show command produces human-readable output from a state file or a plan
185
- file. It can be called in the following ways:
186
-
187
- ```ruby
188
- RubyTerraform.show(
189
- path: 'infra/networking')
190
- RubyTerraform::Commands::Show.new.execute(
191
- path: 'infra/networking')
68
+ },
69
+ var_file: 'defaults.tfvars'
70
+ )
192
71
  ```
193
72
 
194
- The show command supports the following options passed as keyword arguments:
195
- * `path`: the path to a state or plan file; required.
196
- * `no_color`: whether or not the output from the command should be in color;
197
- defaults to `false`.
198
- * `module_depth`: the depth of modules to show in the output; defaults to
199
- showing all modules.
200
- * `json`: whether or not the output from the command should be in json format;
201
- defaults to `false`.
202
-
203
- ### RubyTerraform::Commands::Destroy
204
-
205
- The destroy command destroys all resources defined in the terraform
206
- configuration in the provided terraform configuration directory. It can be
207
- called in the following ways:
73
+ ...and to destroy the resulting resources:
208
74
 
209
75
  ```ruby
210
76
  RubyTerraform.destroy(
211
- directory: 'infra/networking',
212
- vars: {
213
- region: 'eu-central'
214
- })
215
- RubyTerraform::Commands::Destroy.new.execute(
216
- directory: 'infra/networking',
77
+ chdir: 'infra/network',
217
78
  vars: {
218
79
  region: 'eu-central'
219
- })
80
+ },
81
+ var_file: 'defaults.tfvars'
82
+ )
220
83
  ```
221
84
 
222
- The destroy command supports the following options passed as keyword arguments:
223
- * `directory`: the directory containing terraform configuration; required.
224
- * `vars`: a map of vars to be passed in to the terraform configuration.
225
- * `var_file`: the path to a terraform var file; if both `var_file` and
226
- `var_files` are provided, all var files will be passed to terraform.
227
- * `var_files`: an array of paths to terraform var files; if both `var_file` and
228
- `var_files` are provided, all var files will be passed to terraform.
229
- * `target`: the address of a resource to target; if both `target` and
230
- `targets` are provided, all targets will be passed to terraform.
231
- * `targets`: and array of resource addresses to target; if both `target` and
232
- `targets` are provided, all targets will be passed to terraform.
233
- * `state`: the path to the state file containing the current state; defaults to
234
- terraform.tfstate in the working directory or the remote state if configured.
235
- * `force`: if `true`, the command destroys without prompting the user to confirm
236
- the destruction; defaults to `false`.
237
- * `backup`: the path to the backup file in which to store the state backup.
238
- * `no_backup`: when `true`, no backup file will be written; defaults to `false`.
239
- * `no_color`: whether or not the output from the command should be in color;
240
- defaults to `false`.
241
-
242
-
243
- ### RubyTerraform::Commands::Output
244
-
245
- The output command retrieves an output from a state file. It can be called in
246
- the following ways:
85
+ Additionally, `RubyTerraform` allows command instances to be constructed and
86
+ invoked separately. This is useful when you need to override global
87
+ configuration on a command by command basis or when you need to pass a command
88
+ around.
247
89
 
248
- ```ruby
249
- RubyTerraform.output(name: 'vpc_id')
250
- RubyTerraform::Commands::Destroy.new.execute(name: 'vpc_id')
251
- ```
252
-
253
- The output command supports the following options passed as keyword arguments:
254
- * `name`: the name of the output to retrieve; required.
255
- * `state`: the path to the state file containing the current state; defaults to
256
- terraform.tfstate in the working directory or the remote state if configured.
257
- * `no_color`: whether or not the output from the command should be in color;
258
- defaults to `false`.
259
- * `module`: the name of a module to retrieve output from.
260
-
261
-
262
- ### RubyTerraform::Commands::Refresh
263
-
264
- The refresh command will reconcile state with resources found in the target
265
- environment. It can be called in the following ways:
90
+ Using the command class approach, the equivalent plan invocation above can be
91
+ achieved using:
266
92
 
267
93
  ```ruby
268
- RubyTerraform.refresh(
269
- directory: 'infra/networking',
270
- vars: {
271
- region: 'eu-central'
272
- })
273
- RubyTerraform::Commands::Refresh.new.execute(
274
- directory: 'infra/networking',
94
+ command = RubyTerraform::Commands::Plan.new
95
+ command.execute(
96
+ chdir: 'infra/network',
97
+ out: 'network.tfplan',
275
98
  vars: {
276
99
  region: 'eu-central'
277
- })
100
+ },
101
+ var_file: 'defaults.tfvars'
102
+ )
278
103
  ```
279
104
 
280
- The refresh command supports the following options passed as keyword arguments:
281
- * `directory`: the directory containing terraform configuration; required.
282
- * `vars`: a map of vars to be passed in to the terraform configuration.
283
- * `var_file`: the path to a terraform var file; if both `var_file` and
284
- `var_files` are provided, all var files will be passed to terraform.
285
- * `var_files`: an array of paths to terraform var files; if both `var_file` and
286
- `var_files` are provided, all var files will be passed to terraform.
287
- * `target`: the address of a resource to target; if both `target` and
288
- `targets` are provided, all targets will be passed to terraform.
289
- * `targets`: and array of resource addresses to target; if both `target` and
290
- `targets` are provided, all targets will be passed to terraform.
291
- * `state`: the path to the state file in which to store state; defaults to
292
- terraform.tfstate in the working directory or the remote state if configured.
293
- * `input`: when `false`, will not ask for input for variables not directly set;
294
- defaults to `true`.
295
- * `no_color`: whether or not the output from the command should be in color;
296
- defaults to `false`.
297
-
298
-
299
- ### RubyTerraform::Commands::Import
300
-
301
- The import command imports existing infrastructure into your terraform state.
302
- It can be called in the following ways:
105
+ See the [API docs](https://infrablocks.github.io/ruby_terraform/index.html) for
106
+ the
107
+ [`RubyTerraform` module](https://infrablocks.github.io/ruby_terraform/RubyTerraform.html)
108
+ or the
109
+ [`RubyTerraform::Commands` module](https://infrablocks.github.io/ruby_terraform/RubyTerraform/Commands.html)
110
+ more details on the supported commands.
111
+
112
+ ### Parameters
113
+
114
+ The parameter hash passed to each command, whether via the class methods or the
115
+ `#execute` method, supports all the options available on the corresponding
116
+ Terraform command. There are a few different types of options depending on what
117
+ Terraform expects to receive:
118
+
119
+ * `Boolean` options, accepting `true` or `false`, such as `:input` or `:lock`;
120
+ * `String` options, accepting a single string value, such as `:state` or
121
+ `:target`;
122
+ * `Array<String>` options, accepting an array of strings, such as `:var_files`
123
+ `:targets`; and
124
+ * `Hash<String,Object>` options, accepting a hash of key value pairs, where the
125
+ value might be complex, such as `:vars` and `:backend_config`.
126
+
127
+ For all options that allow multiple values, both a singular and a plural option
128
+ key are supported. For example, to specify multiple var files during a plan:
303
129
 
304
130
  ```ruby
305
- RubyTerraform.import(
306
- directory: 'infra/networking',
307
- address: 'a.resource.address',
308
- id: 'a-resource-id',
309
- vars: {
310
- region: 'eu-central'
311
- })
312
- RubyTerraform::Commands::Import.new.execute(
313
- directory: 'infra/networking',
314
- address: 'a.resource.address',
315
- id: 'a-resource-id',
316
- vars: {
317
- region: 'eu-central'
318
- })
131
+ RubyTerraform.plan(
132
+ chdir: 'infra/network',
133
+ out: 'network.tfplan',
134
+ var_file: 'defaults.tfvars',
135
+ var_files: %w[environment.tfvars secrets.tfvars]
136
+ )
319
137
  ```
320
138
 
321
- The import command supports the following options passed as keyword arguments:
322
- * `directory`: the directory containing terraform configuration; required.
323
- * `address`: a valid resource address; required.
324
- * `id`: id of resource being imported; required.
325
- * `vars`: a map of vars to be passed in to the terraform configuration.
326
- * `var_file`: the path to a terraform var file; if both `var_file` and
327
- `var_files` are provided, all var files will be passed to terraform.
328
- * `var_files`: an array of paths to terraform var files; if both `var_file` and
329
- `var_files` are provided, all var files will be passed to terraform.
330
- * `input`: when `false`, will not ask for input for variables not directly set;
331
- defaults to `true`.
332
- * `state`: the path to the state file containing the current state; defaults to
333
- terraform.tfstate in the working directory or the remote state if configured.
334
- * `no_backup`: when `true`, no backup file will be written; defaults to `false`.
335
- * `backup`: the path to the backup file in which to store the state backup.
336
- * `no_color`: whether or not the output from the command should be in color;
337
- defaults to `false`.
338
-
339
-
340
- ### RubyTerraform::Commands::RemoteConfig
341
-
342
- The remote config command configures storage of state using a remote backend. It
343
- has been deprecated and since removed from terraform but is retained in this
344
- library for backwards compatibility. It can be called in the following ways:
345
-
346
- ```ruby
347
- RubyTerraform.remote_config(
348
- backend: 's3',
349
- backend_config: {
350
- bucket: 'example-state-bucket',
351
- key: 'infra/terraform.tfstate',
352
- region: 'eu-west-2'
353
- })
354
- RubyTerraform::Commands::RemoteConfig.new.execute(
355
- backend: 's3',
356
- backend_config: {
357
- bucket: 'example-state-bucket',
358
- key: 'infra/terraform.tfstate',
359
- region: 'eu-west-2'
360
- })
361
- ```
139
+ In this case, all three var files are passed to Terraform.
362
140
 
363
- The remote config command supports the following options passed as keyword
364
- arguments:
365
- * `backend`: the type of backend to use; required.
366
- * `backend_config`: a map of backend specific configuration parameters;
367
- required.
368
- * `no_color`: whether or not the output from the command should be in color;
369
- defaults to `false`.
141
+ Some options have aliases. For example, the `:out` option can also be provided
142
+ as `:plan` for symmetry with other terraform commands. However, in such
143
+ situations only one of the aliases should be used in the provided parameters
144
+ hash.
370
145
 
371
- ### RubyTerraform::Commands::Format
146
+ See the [API docs](https://infrablocks.github.io/ruby_terraform/index.html) for
147
+ a more complete listing of available parameter options.
372
148
 
373
- The format command formats the terraform directory specified. It can be called in the following ways:
149
+ ### Configuration
374
150
 
375
- ```ruby
376
- RubyTerraform.format(
377
- directory: 'infra/networking',
378
- vars: {
379
- region: 'eu-central'
380
- })
381
- RubyTerraform::Commands::Format.new.execute(
382
- directory: 'infra/networking',
383
- vars: {
384
- region: 'eu-central'
385
- })
386
- ```
151
+ `RubyTerraform` uses sensible defaults for all configuration options. However,
152
+ there are a couple of ways to override the defaults when they are sufficient.
387
153
 
388
- The format command supports the following options passed as keyword arguments:
389
- * `directory`: the directory containing terraform configuration to be formatted; required.
390
- * `recursive`: Processes files in subdirectories;
391
- defaults to `false`.
392
- * `list`: Don't list files whose formatting differs;
393
- defaults to `false`.
394
- * `write`: Don't write to source files;
395
- defaults to `false`.
396
- * `check`: Checks if the input is formatted, exit status will be 0 if all input is properly formatted and non zero otherwise;
397
- defaults to `false`.
398
- * `diff`: Displays a diff of the formatting changes;
399
- defaults to `false`.
400
- * `no_color`: whether or not the output from the command should be in color;
401
- defaults to `false`.
402
-
403
- ### RubyTerraform::Commands::Validate
154
+ #### Binary
404
155
 
405
- The validate command validates terraform configuration in the provided terraform
406
- configuration directory. It can be called in the following ways:
156
+ By default, `RubyTerraform` looks for the Terraform binary on the system path.
157
+ To globally configure a specific binary location:
407
158
 
408
159
  ```ruby
409
- RubyTerraform.validate(
410
- directory: 'infra/networking',
411
- vars: {
412
- region: 'eu-central'
413
- })
414
- RubyTerraform::Commands::Validate.new.execute(
415
- directory: 'infra/networking',
416
- vars: {
417
- region: 'eu-central'
418
- })
160
+ RubyTerraform.configure do |config|
161
+ config.binary = 'vendor/terraform/bin/terraform'
162
+ end
419
163
  ```
420
164
 
421
- The validate command supports the following options passed as keyword arguments:
422
- * `directory`: the directory containing terraform configuration; required.
423
- * `vars`: a map of vars to be passed in to the terraform configuration.
424
- * `var_file`: the path to a terraform var file; if both `var_file` and
425
- `var_files` are provided, all var files will be passed to terraform.
426
- * `var_files`: an array of paths to terraform var files; if both `var_file` and
427
- `var_files` are provided, all var files will be passed to terraform.
428
- * `no_color`: whether or not the output from the command should be in color;
429
- defaults to `false`.
430
- * `check_variables`: if `true`, the command checks whether all variables have
431
- been provided; defaults to `true`.
432
- * `json`: whether or not the output from the command should be in json format;
433
- defaults to `false`.
434
-
435
- ### RubyTerraform::Commands::Workspace
436
-
437
- The `workspace` command configures
438
- [Terraform Workspaces](https://www.terraform.io/docs/state/workspaces.html#using-workspaces).
439
- It can be used as follows:
165
+ To configure the Terraform binary on a command by command basis, for example for
166
+ the `Plan` command:
440
167
 
441
168
  ```ruby
442
- RubyTerraform.workspace(operation: 'list')
443
- RubyTerraform.workspace(operation: 'new', workspace: 'staging')
444
- RubyTerraform.workspace(operation: 'select', workspace: 'staging')
445
- RubyTerraform.workspace(operation: 'list')
446
- RubyTerraform.workspace(operation: 'select', workspace: 'default')
447
- RubyTerraform.workspace(operation: 'delete', workspace: 'staging')
169
+ command = RubyTerraform::Commands::Plan.new(
170
+ binary: 'vendor/terraform/bin/terraform'
171
+ )
172
+ command.execute(
173
+ # ...
174
+ )
448
175
  ```
449
176
 
450
- arguments:
451
- * `directory`: the directory containing terraform configuration, the default is
452
- the current path.
453
- * `operation`: `list`, `select`, `new` or `delete`. default `list`.
454
- * `workspace`: Workspace name.
177
+ #### Logging
455
178
 
179
+ By default, `RubyTerraform` 's own log statements are logged to `$stdout` with
180
+ level `info`.
456
181
 
457
- ## Configuration
182
+ To globally configure a custom logger:
458
183
 
459
- In addition to configuring the location of the terraform binary, RubyTerraform
460
- offers configuration of logging and standard streams. By default standard
461
- streams map to `$stdin`, `$stdout` and `$stderr` and all logging goes to
462
- `$stdout`.
463
-
464
- ### Logging
465
-
466
- By default, RubyTerraform logs to `$stdout` with level `info`.
467
-
468
- To configure a custom logger:
469
-
470
- ``` ruby
184
+ ```ruby
471
185
  require 'logger'
472
186
 
473
187
  logger = Logger.new($stdout)
@@ -478,13 +192,13 @@ RubyTerraform.configure do |config|
478
192
  end
479
193
  ```
480
194
 
481
- RubyTerraform supports logging to multiple different outputs at once,
195
+ `RubyTerraform` supports logging to multiple different outputs at once,
482
196
  for example:
483
197
 
484
- ``` ruby
198
+ ```ruby
485
199
  require 'logger'
486
200
 
487
- log_file = Logger::LogDevice.new('/foo/bar.log') # results in a file with sync true in the background
201
+ log_file = Logger::LogDevice.new('/foo/bar.log')
488
202
  logger = Logger.new(RubyTerraform::MultiIO.new(STDOUT, log_file), level: :debug)
489
203
 
490
204
  RubyTerraform.configure do |config|
@@ -494,18 +208,37 @@ RubyTerraform.configure do |config|
494
208
  config.stderr = logger
495
209
  end
496
210
  ```
497
- > Creating the Logger with a file this way (using `Logger::LogDevice`), guarantees that the buffer content will be saved/written, as it sets **implicit flushing**.
211
+ > Creating the Logger with a file this way (using `Logger::LogDevice`),
212
+ > guarantees that the buffer content will be saved/written, as it sets
213
+ > **implicit flushing**.
214
+
215
+ Configured in this way, any logging performed by `RubyTerraform` will log to
216
+ both `STDOUT` and the provided `log_file`.
498
217
 
499
- Configured in this way, any logging performed by RubyTerraform will log to both
500
- `STDOUT` and the provided `log_file`.
218
+ To configure the logger on a command by command basis, for example for the
219
+ `Show` command:
501
220
 
502
- ### Standard Streams
221
+ ```ruby
222
+ require 'logger'
503
223
 
504
- By default, RubyTerraform uses streams `$stdin`, `$stdout` and `$stderr`.
224
+ logger = Logger.new($stdout)
225
+ logger.level = Logger::DEBUG
226
+
227
+ command = RubyTerraform::Commands::Show.new(
228
+ logger: logger
229
+ )
230
+ command.execute(
231
+ # ...
232
+ )
233
+ ```
234
+
235
+ #### Standard streams
236
+
237
+ By default, `RubyTerraform` uses streams `$stdin`, `$stdout` and `$stderr`.
505
238
 
506
239
  To configure custom output and error streams:
507
240
 
508
- ``` ruby
241
+ ```ruby
509
242
  log_file = File.open('path/to/some/ruby_terraform.log', 'a')
510
243
 
511
244
  RubyTerraform.configure do |config|
@@ -518,7 +251,7 @@ In this way, both outputs will be redirected to `log_file`.
518
251
 
519
252
  Similarly, a custom input stream can be configured:
520
253
 
521
- ``` ruby
254
+ ```ruby
522
255
  require 'stringio'
523
256
 
524
257
  input = StringIO.new("user\ninput\n")
@@ -531,6 +264,28 @@ end
531
264
  In this way, terraform can be driven by input from somewhere other than
532
265
  interactive input from the terminal.
533
266
 
267
+ To configure the standard streams on a command by command basis, for example for
268
+ the `Init` command:
269
+
270
+ ```ruby
271
+ require 'logger'
272
+
273
+ input = StringIO.new("user\ninput\n")
274
+ log_file = File.open('path/to/some/ruby_terraform.log', 'a')
275
+
276
+ command = RubyTerraform::Commands::Init.new(
277
+ stdin: input,
278
+ stdout: log_file,
279
+ stderr: log_file
280
+ )
281
+ command.execute(
282
+ # ...
283
+ )
284
+ ```
285
+
286
+ ## Documentation
287
+
288
+ * [API docs](https://infrablocks.github.io/ruby_terraform/index.html)
534
289
 
535
290
  ## Development
536
291