Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

data variables must be four parts: data.TYPE.NAME.ATTR in: ${data.external.script} #20586

Closed
JasonOliverEmaze opened this issue Mar 6, 2019 · 8 comments

Comments

@JasonOliverEmaze
Copy link

JasonOliverEmaze commented Mar 6, 2019

Terraform Version

Terraform v0.11.11 + provider.external v1.0.0

Terraform Configuration Files

  program = ["python", "${path.module}/secret.py", "-id", "SFTP-Key", "-keyname", "private-key"]
}

output "Private Key" {
  value = "${data.external.script}"
}

Expected Behavior

I am hoping for the script to output the variable as it would be if the python script was run (stdout).

Actual Behavior

I believe I need to include an attribute such as ${data.external.script.*}, ${data.external.script.all}, etc.?

`Error: Error loading C:\Users\oliverj\Documents\Code\github\test\test.tf: Error reading config for output Private Key: data.external.script: data variables must be four parts: data.TYPE.NAME.ATTR in:

${data.external.script}`

Steps to Reproduce

  1. terraform init
  2. terraform plan or terraform apply

References

@bennycornelissen
Copy link

You can only reference exposed attributes of a resource or data source. In this case, the External data source only exposes a 'result` attribute, which is a map of strings. See https://www.terraform.io/docs/providers/external/data_source.html#result

So you should probably change the type of your output to map, and use ${data.external.script.result} as the value.

@JasonOliverEmaze
Copy link
Author

Many thanks, @bennycornelissen. I now receive the following error, I am expecting to see a long string...

data.external.script: Refreshing state...

Error: Error refreshing state: 1 error(s) occurred:

* data.external.script: 1 error(s) occurred:

* data.external.script: data.external.script: command "python" produced invalid JSON: invalid character '-' in numeric literal

@bennycornelissen
Copy link

could you set the TF_LOG environment variable to DEBUG and run Terraform again? There seems to be something wrong with the output of the python command, but without seeing the output I'm afraid I won't be of much help 😉

@JasonOliverEmaze
Copy link
Author

Hi @bennycornelissen . Many thanks. I have enabled debugging , however am not sur eit offeres much else. I am hoping you can gather more from this than me... :)

2019/03/07 09:52:57 [INFO] terraform: building graph: GraphTypeRefresh
2019/03/07 09:52:57 [TRACE] No managed resources in state during refresh, skipping managed resource transformer
2019/03/07 09:52:57 [TRACE] ConfigTransformer: Starting for path: []
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ConfigTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.OrphanResourceTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
2019/03/07 09:52:57 [DEBUG] Resource state not found for "data.external.script": data.external.script
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.AttachStateTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
2019/03/07 09:52:57 [TRACE] AttachResourceConfigTransformer: Beginning...
2019/03/07 09:52:57 [TRACE] AttachResourceConfigTransformer: Attach resource config request: data.external.script
2019/03/07 09:52:57 [TRACE] Attaching resource config: &config.Resource{Mode:1, Name:"script", Type:"external", RawCount:(*config.RawConfig)(0xc0003e2540), RawConfig:(*config.RawConfig)(0xc0003e24d0), Provisioners:[]*config.Provisioner{}, Provider:"", DependsOn:[]string(nil), Lifecycle:config.ResourceLifecycle{CreateBeforeDestroy:false, PreventDestroy:false, IgnoreChanges:[]string(nil)}}
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.AttachResourceConfigTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.RootVariableTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
2019/03/07 09:52:57 [TRACE] ProviderConfigTransformer: Starting for path: []
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ProviderConfigTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
2019/03/07 09:52:57 [DEBUG] adding missing provider: external
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.MissingProviderTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [DEBUG] resource data.external.script using provider provider.external
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ProviderTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.PruneProviderTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ParentProviderTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.graphTransformerMulti:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.LocalTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.OutputTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ModuleVariableTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [DEBUG] ReferenceTransformer: "output.Script" references: [data.external.script]
2019/03/07 09:52:57 [DEBUG] ReferenceTransformer: "data.external.script" references: []
2019/03/07 09:52:57 [DEBUG] ReferenceTransformer: "provider.external" references: []
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ReferenceTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
  data.external.script - *terraform.NodeRefreshableDataResource
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.TargetsTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
  data.external.script - *terraform.NodeRefreshableDataResource
provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.CloseProviderTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
  data.external.script - *terraform.NodeRefreshableDataResource
provider.external - *terraform.NodeApplyableProvider
provider.external (close) - *terraform.graphNodeCloseProvider
  data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.RootTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
  data.external.script - *terraform.NodeRefreshableDataResource
provider.external - *terraform.NodeApplyableProvider
provider.external (close) - *terraform.graphNodeCloseProvider
  data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
root - terraform.graphNodeRoot
  output.Script - *terraform.NodeApplyableOutput
  provider.external (close) - *terraform.graphNodeCloseProvider
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.TransitiveReductionTransformer:

data.external.script - *terraform.NodeRefreshableDataResource
  provider.external - *terraform.NodeApplyableProvider
output.Script - *terraform.NodeApplyableOutput
  data.external.script - *terraform.NodeRefreshableDataResource
provider.external - *terraform.NodeApplyableProvider
provider.external (close) - *terraform.graphNodeCloseProvider
  data.external.script - *terraform.NodeRefreshableDataResource
root - terraform.graphNodeRoot
  output.Script - *terraform.NodeApplyableOutput
  provider.external (close) - *terraform.graphNodeCloseProvider
2019/03/07 09:52:57 [DEBUG] Starting graph walk: walkRefresh
2019/03/07 09:52:57 [TRACE] dag/walk: added new vertex: "output.Script"
2019/03/07 09:52:57 [TRACE] dag/walk: added new vertex: "provider.external (close)"
2019/03/07 09:52:57 [TRACE] dag/walk: added new vertex: "root"
2019/03/07 09:52:57 [TRACE] dag/walk: added new vertex: "data.external.script"
2019/03/07 09:52:57 [TRACE] dag/walk: added new vertex: "provider.external"
2019/03/07 09:52:57 [TRACE] dag/walk: added edge: "provider.external (close)" waiting on "data.external.script"
2019/03/07 09:52:57 [TRACE] dag/walk: added edge: "root" waiting on "output.Script"
2019/03/07 09:52:57 [TRACE] dag/walk: added edge: "root" waiting on "provider.external (close)"
2019/03/07 09:52:57 [TRACE] dag/walk: added edge: "data.external.script" waiting on "provider.external"
2019/03/07 09:52:57 [TRACE] dag/walk: added edge: "output.Script" waiting on "data.external.script"
2019/03/07 09:52:57 [TRACE] dag/walk: dependencies changed for "provider.external (close)", sending new deps
2019/03/07 09:52:57 [TRACE] dag/walk: dependencies changed for "root", sending new deps
2019/03/07 09:52:57 [TRACE] dag/walk: dependencies changed for "data.external.script", sending new deps
2019/03/07 09:52:57 [TRACE] dag/walk: dependencies changed for "output.Script", sending new deps
2019/03/07 09:52:57 [TRACE] dag/walk: walking "provider.external"
2019/03/07 09:52:57 [TRACE] vertex 'root.provider.external': walking
2019/03/07 09:52:57 [TRACE] vertex 'root.provider.external': evaluating
2019/03/07 09:52:57 [TRACE] [walkRefresh] Entering eval tree: provider.external
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalSequence
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalInitProvider
2019/03/07 09:52:57 [TRACE] root: eval: terraform.EvalNoop
2019/03/07 09:52:57 [TRACE] root: eval: terraform.EvalNoop
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalOpFilter
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalSequence
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalGetProvider
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalInterpolateProvider
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalBuildProviderConfig
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalOpFilter
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalSequence
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalConfigProvider
2019/03/07 09:52:57 [TRACE] [walkRefresh] Exiting eval tree: provider.external
2019/03/07 09:52:57 [TRACE] dag/walk: walking "data.external.script"
2019/03/07 09:52:57 [TRACE] vertex 'root.data.external.script': walking
2019/03/07 09:52:57 [TRACE] vertex 'root.data.external.script': evaluating
2019/03/07 09:52:57 [TRACE] [walkRefresh] Entering eval tree: data.external.script
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalSequence
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalInterpolate
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalCountCheckComputed
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalIf
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalCountFixZeroOneBoundary
2019/03/07 09:52:57 [TRACE] [walkRefresh] Exiting eval tree: data.external.script
2019/03/07 09:52:57 [TRACE] vertex 'root.data.external.script': expanding/walking dynamic subgraph
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ResourceCountTransformer:

data.external.script - *terraform.NodeRefreshableDataResourceInstance
2019/03/07 09:52:57 [TRACE] OrphanResourceCount: Starting...
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.OrphanResourceCountTransformer:

data.external.script - *terraform.NodeRefreshableDataResourceInstance
2019/03/07 09:52:57 [DEBUG] Resource state not found for "data.external.script": data.external.script
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.AttachStateTransformer:

data.external.script - *terraform.NodeRefreshableDataResourceInstance
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.TargetsTransformer:

data.external.script - *terraform.NodeRefreshableDataResourceInstance
2019/03/07 09:52:57 [DEBUG] ReferenceTransformer: "data.external.script" references: []
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.ReferenceTransformer:

data.external.script - *terraform.NodeRefreshableDataResourceInstance
2019/03/07 09:52:57 [TRACE] Graph after step *terraform.RootTransformer:

data.external.script - *terraform.NodeRefreshableDataResourceInstance
2019/03/07 09:52:57 [TRACE] dag/walk: added new vertex: "data.external.script"
2019/03/07 09:52:57 [TRACE] dag/walk: walking "data.external.script"
2019/03/07 09:52:57 [TRACE] vertex 'root.data.external.script': walking
2019/03/07 09:52:57 [TRACE] vertex 'root.data.external.script': evaluating
2019/03/07 09:52:57 [TRACE] [walkRefresh] Entering eval tree: data.external.script
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalSequence
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalWriteState
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalInterpolate
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalIf
2019/03/07 09:52:57 [TRACE] root: eval: terraform.EvalNoop
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalGetProvider
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalReadDataDiff
2019/03/07 09:52:57 [TRACE] root: eval: *terraform.EvalReadDataApply
data.external.script: Refreshing state...
2019/03/07 09:52:58 [ERROR] root: eval: *terraform.EvalReadDataApply, err: data.external.script: command "python" produced invalid JSON: invalid character '-' in numeric literal
2019/03/07 09:52:58 [ERROR] root: eval: *terraform.EvalSequence, err: data.external.script: command "python" produced invalid JSON: invalid character '-' in numeric literal
2019/03/07 09:52:58 [TRACE] [walkRefresh] Exiting eval tree: data.external.script
2019/03/07 09:52:58 [TRACE] dag/walk: upstream errored, not walking "provider.external (close)"
2019/03/07 09:52:58 [TRACE] dag/walk: upstream errored, not walking "output.Script"
2019/03/07 09:52:58 [TRACE] dag/walk: upstream errored, not walking "root"
2019/03/07 09:52:58 [DEBUG] plugin: waiting for all plugin processes to complete...

Error: Error refreshing state: 1 error(s) occurred:

* data.external.script: 1 error(s) occurred:

*2019-03-07T09:52:58.688Z [WARN ] plugin: error closing client during Kill: err="unexpected EOF"
 data.external.script: data.external.script: command "python" produced invalid JSON: invalid charac2019-03-07T09:52:58.695Z [DEBUG] plugin: plugin process exited: path=C:\Users\oliverj\Documents\Code\github\test\.terraform\plugins\windows_amd64\terraform-provider-external_v1.0.0_x4.exe
ter '-' in numeric literal

@JasonOliverEmaze
Copy link
Author

JasonOliverEmaze commented Mar 8, 2019 via email

@bennycornelissen
Copy link

Hi @JasonOliverEmaze it seems like the issue you're seeing is not related to Terraform itself, but rather with the python program being executed not returning valid JSON. The external data source uses JSON, so the output from your program should be JSON. I would start there.

@ghost
Copy link

ghost commented Jul 16, 2019

This issue has been automatically migrated to hashicorp/terraform-provider-external#37 because it looks like an issue with that provider. If you believe this is not an issue with the provider, please reply to hashicorp/terraform-provider-external#37.

@ghost
Copy link

ghost commented Aug 16, 2019

I'm going to lock this issue because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active issues.

If you have found a problem that seems similar to this, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further.

@ghost ghost locked and limited conversation to collaborators Aug 16, 2019
This issue was closed.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants