From 7d0e1f92f4261a30e16ec9cbd0febb43eaf68fc9 Mon Sep 17 00:00:00 2001 From: Mikhail Naletov <36846182+okgolove@users.noreply.github.com> Date: Mon, 5 Mar 2018 18:01:53 +0200 Subject: [PATCH] [terraform] Support initializing modules and providers at runtime (#36996) * Fixes #36994 Added function for force initializing modules and providers Added type for force_init parameter --- lib/ansible/modules/cloud/misc/terraform.py | 15 ++++++++++++++- test/sanity/validate-modules/ignore.txt | 1 - 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/ansible/modules/cloud/misc/terraform.py b/lib/ansible/modules/cloud/misc/terraform.py index dd0fcdd33e..802f7f2a8b 100644 --- a/lib/ansible/modules/cloud/misc/terraform.py +++ b/lib/ansible/modules/cloud/misc/terraform.py @@ -79,8 +79,9 @@ options: - To avoid duplicating infra, if a state file can't be found this will force a `terraform init`. Generally, this should be turned off unless you intend to provision an entirely new Terraform deployment. - required: false default: false + required: false + type: bool notes: - To just run a `terraform plan`, use check mode. requirements: [ "terraform" ] @@ -155,6 +156,13 @@ def _state_args(state_file): return [] +def init_plugins(bin_path, project_path): + command = [bin_path, 'init'] + rc, out, err = module.run_command(command, cwd=project_path) + if rc != 0: + module.fail_json(msg="Failed to initialize Terraform modules:\r\n{0}".format(err)) + + def build_plan(bin_path, project_path, variables_args, state_file, plan_path=None): if plan_path is None: f, plan_path = tempfile.mkstemp(suffix='.tfplan') @@ -191,6 +199,7 @@ def main(): targets=dict(type='list', default=[]), lock=dict(type='bool', default=True), lock_timeout=dict(type='int',), + force_init=dict(type='bool', default=False) ), required_if=[('state', 'planned', ['plan_file'])], supports_check_mode=True, @@ -203,12 +212,16 @@ def main(): variables_file = module.params.get('variables_file') plan_file = module.params.get('plan_file') state_file = module.params.get('state_file') + force_init = module.params.get('force_init') if bin_path is not None: command = [bin_path] else: command = [module.get_bin_path('terraform')] + if force_init: + init_plugins(command[0], project_path) + variables_args = [] for k, v in variables.items(): variables_args.extend([ diff --git a/test/sanity/validate-modules/ignore.txt b/test/sanity/validate-modules/ignore.txt index 09116cbc2e..cfeef89ece 100644 --- a/test/sanity/validate-modules/ignore.txt +++ b/test/sanity/validate-modules/ignore.txt @@ -573,7 +573,6 @@ lib/ansible/modules/cloud/misc/rhevm.py E324 lib/ansible/modules/cloud/misc/rhevm.py E325 lib/ansible/modules/cloud/misc/serverless.py E324 lib/ansible/modules/cloud/misc/serverless.py E325 -lib/ansible/modules/cloud/misc/terraform.py E323 lib/ansible/modules/cloud/misc/terraform.py E324 lib/ansible/modules/cloud/misc/terraform.py E325 lib/ansible/modules/cloud/misc/virt.py E322