Terraform v0.11.11 + provider.external v1.0.0
```data "external" "script" {
program = ["python", "${path.module}/secret.py", "-id", "SFTP-Key", "-keyname", "private-key"]
}
output "Private Key" {
value = "${data.external.script}"
}
```
I am hoping for the script to output the variable as it would be if the python script was run (stdout).
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}`
terraform initterraform plan or terraform applyYou 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.
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
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 😉
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
@bennycornelissen I can confirm this has been set...
echo %TF_LOG%
DEBUG
Cheers, Jason
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.
This issue has been automatically migrated to terraform-providers/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 terraform-providers/terraform-provider-external#37.
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.
Most helpful comment
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.