ruby-terraform 0.65.0.pre.15 → 1.0.0.pre.1

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 +148 -397
  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 +9 -12
  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: f8868436d132ce01fabbee0b125f9752f4a0528287cfd4313153092fa2f2dc64
4
+ data.tar.gz: 5f67d580429c869a9c74346582877385708ce84dce5d80ccb0ecc1f0ad76f143
5
5
  SHA512:
6
- metadata.gz: 1aa00badf71f9f0db717c7a06a4806e7225b6b6005f61601043af3975ebbacb6e82826d24f792a3b602365178711f3a0b4a010b642dbb5c3be300e0f8955a202
7
- data.tar.gz: faf27462271fc0c7a04b38e0221590c33e2fb25679816317509744c3ddfd6024200587cb0c92cc3eeb7e12290a48bb105c05ddc16e3deb30144cd033889bda6e
6
+ metadata.gz: 8d53024bb998f356b8d11f005a1b28f50c18bb75a82b1feee29a85933f08d94fa66dea767aadb100a65ef7a83b201888b734454e21ddcdcf50daaacd78a0f2b9
7
+ data.tar.gz: 782938870f9111dd2b1607b4260b78d01f8328a96760888d3b4745344c7cdcc5e9bdc54942ac0464df24e636010e6dd3268ff2325ae2917b2ff4c6b0eb36f1ff
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.0.0.pre.1)
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,161 @@ 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
+ more details on the supported commands.
303
107
 
304
- ```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
- })
319
- ```
108
+ ### Parameters
109
+
110
+ The parameter hash passed to each command, whether via the class methods or the
111
+ `#execute` method, supports all the options available on the corresponding
112
+ Terraform command. There are a few different types of options depending on what
113
+ Terraform expects to receive:
320
114
 
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:
115
+ * `Boolean` options, accepting `true` or `false`, such as `:input` or `:lock`;
116
+ * `String` options, accepting a single string value, such as `:state` or
117
+ `:target`;
118
+ * `Array<String>` options, accepting an array of strings, such as `:var_files`
119
+ `:targets`; and
120
+ * `Hash<String,Object>` options, accepting a hash of key value pairs, where the
121
+ value might be complex, such as `:vars` and `:backend_config`.
122
+
123
+ For all options that allow multiple values, both a singular and a plural option
124
+ key are supported. For example, to specify multiple var files during a plan:
345
125
 
346
126
  ```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
- })
127
+ RubyTerraform.plan(
128
+ chdir: 'infra/network',
129
+ out: 'network.tfplan',
130
+ var_file: 'defaults.tfvars',
131
+ var_files: %w[environment.tfvars secrets.tfvars]
132
+ )
361
133
  ```
362
134
 
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`.
135
+ In this case, all three var files are passed to Terraform.
370
136
 
371
- ### RubyTerraform::Commands::Format
137
+ Some options have aliases. For example, the `:out` option can also be provided
138
+ as `:plan` for symmetry with other terraform commands. However, in such
139
+ situations only one of the aliases should be used in the provided parameters
140
+ hash.
372
141
 
373
- The format command formats the terraform directory specified. It can be called in the following ways:
142
+ See the [API docs](https://infrablocks.github.io/ruby_terraform/index.html) for
143
+ a more complete listing of available parameter options.
374
144
 
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
- ```
145
+ ### Configuration
387
146
 
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
147
+ `RubyTerraform` uses sensible defaults for all configuration options. However,
148
+ there are a couple of ways to override the defaults when they are sufficient.
149
+
150
+ #### Binary
404
151
 
405
- The validate command validates terraform configuration in the provided terraform
406
- configuration directory. It can be called in the following ways:
152
+ By default, `RubyTerraform` looks for the Terraform binary on the system path.
153
+ To globally configure a specific binary location:
407
154
 
408
155
  ```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
- })
156
+ RubyTerraform.configure do |config|
157
+ config.binary = 'vendor/terraform/bin/terraform'
158
+ end
419
159
  ```
420
160
 
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:
161
+ To configure the Terraform binary on a command by command basis, for example for
162
+ the `Plan` command:
440
163
 
441
164
  ```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')
165
+ command = RubyTerraform::Commands::Plan.new(
166
+ binary: 'vendor/terraform/bin/terraform'
167
+ )
168
+ command.execute(
169
+ # ...
170
+ )
448
171
  ```
449
172
 
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.
455
-
456
-
457
- ## Configuration
458
-
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
173
+ #### Logging
465
174
 
466
- By default, RubyTerraform logs to `$stdout` with level `info`.
175
+ By default, `RubyTerraform` 's own log statements are logged to `$stdout` with
176
+ level `info`.
467
177
 
468
- To configure a custom logger:
178
+ To globally configure a custom logger:
469
179
 
470
- ``` ruby
180
+ ```ruby
471
181
  require 'logger'
472
182
 
473
183
  logger = Logger.new($stdout)
@@ -478,13 +188,13 @@ RubyTerraform.configure do |config|
478
188
  end
479
189
  ```
480
190
 
481
- RubyTerraform supports logging to multiple different outputs at once,
191
+ `RubyTerraform` supports logging to multiple different outputs at once,
482
192
  for example:
483
193
 
484
- ``` ruby
194
+ ```ruby
485
195
  require 'logger'
486
196
 
487
- log_file = Logger::LogDevice.new('/foo/bar.log') # results in a file with sync true in the background
197
+ log_file = Logger::LogDevice.new('/foo/bar.log')
488
198
  logger = Logger.new(RubyTerraform::MultiIO.new(STDOUT, log_file), level: :debug)
489
199
 
490
200
  RubyTerraform.configure do |config|
@@ -494,18 +204,37 @@ RubyTerraform.configure do |config|
494
204
  config.stderr = logger
495
205
  end
496
206
  ```
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**.
207
+ > Creating the Logger with a file this way (using `Logger::LogDevice`),
208
+ > guarantees that the buffer content will be saved/written, as it sets
209
+ > **implicit flushing**.
210
+
211
+ Configured in this way, any logging performed by `RubyTerraform` will log to
212
+ both `STDOUT` and the provided `log_file`.
213
+
214
+ To configure the logger on a command by command basis, for example for the
215
+ `Show` command:
216
+
217
+ ```ruby
218
+ require 'logger'
219
+
220
+ logger = Logger.new($stdout)
221
+ logger.level = Logger::DEBUG
498
222
 
499
- Configured in this way, any logging performed by RubyTerraform will log to both
500
- `STDOUT` and the provided `log_file`.
223
+ command = RubyTerraform::Commands::Show.new(
224
+ logger: logger
225
+ )
226
+ command.execute(
227
+ # ...
228
+ )
229
+ ```
501
230
 
502
- ### Standard Streams
231
+ #### Standard streams
503
232
 
504
- By default, RubyTerraform uses streams `$stdin`, `$stdout` and `$stderr`.
233
+ By default, `RubyTerraform` uses streams `$stdin`, `$stdout` and `$stderr`.
505
234
 
506
235
  To configure custom output and error streams:
507
236
 
508
- ``` ruby
237
+ ```ruby
509
238
  log_file = File.open('path/to/some/ruby_terraform.log', 'a')
510
239
 
511
240
  RubyTerraform.configure do |config|
@@ -518,7 +247,7 @@ In this way, both outputs will be redirected to `log_file`.
518
247
 
519
248
  Similarly, a custom input stream can be configured:
520
249
 
521
- ``` ruby
250
+ ```ruby
522
251
  require 'stringio'
523
252
 
524
253
  input = StringIO.new("user\ninput\n")
@@ -531,6 +260,28 @@ end
531
260
  In this way, terraform can be driven by input from somewhere other than
532
261
  interactive input from the terminal.
533
262
 
263
+ To configure the standard streams on a command by command basis, for example for
264
+ the `Init` command:
265
+
266
+ ```ruby
267
+ require 'logger'
268
+
269
+ input = StringIO.new("user\ninput\n")
270
+ log_file = File.open('path/to/some/ruby_terraform.log', 'a')
271
+
272
+ command = RubyTerraform::Commands::Init.new(
273
+ stdin: input,
274
+ stdout: log_file,
275
+ stderr: log_file
276
+ )
277
+ command.execute(
278
+ # ...
279
+ )
280
+ ```
281
+
282
+ ## Documentation
283
+
284
+ * [API docs](https://infrablocks.github.io/ruby_terraform/index.html)
534
285
 
535
286
  ## Development
536
287