20

I am learning terraform. I want to print values of variables in "plan" stage. So I found how to do it. seems I am doing something wrong here....

in variables.tf:....

variable "VMCount" {
    description = "How many VMs do you want to start with (number)? default=1 max=5"
    type = number
}

in main.tf

output "VMCount" {
  value = "${var.VMCount > 2 && var.VMCount < 6 ? var.VMCount : 2}"
}

after that i run terraform plan and the condition seem to be working fine (it creates right num of VMs)

but the variable output is not coming. why?

$ terraform output
VMC = 56

that VMC is might be from some previous attempts ( I tried several things).

How to print the value of user entry (variable)?

Thank you.

Krzysztof Madej
  • 32,704
  • 10
  • 78
  • 107
rajeev
  • 1,275
  • 7
  • 27
  • 45
  • Your code doesn't match the output shown. Specifically if you set `VMCount` to 56 it will currently return 2. Can you please edit your question to show your actual code (ideally as a [mcve]) with the actual output you get when you run `terraform apply` and `terraform output`? – ydaetskcoR Jun 17 '21 at 11:04
  • In simple cases, you can use `terraform init` and followed by `terraform console`. Then use console expressions to run & evaluate them. – Rajesh Swarnkar Aug 25 '23 at 07:57

3 Answers3

14

I tested with this:

variable "VMCount" {
    description = "How many VMs do you want to start with (number)? default=1 max=5"
    type = number
}

output "VMCount" {
  value = "${var.VMCount > 2 && var.VMCount < 6 ? var.VMCount : 2}"
}

and it works well.

Terraform will perform the following actions:

Plan: 0 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + VMCount = 4

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes


Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

VMCount = 4
PS C:\d\m\terraform\output-and-variable> terraform output
VMCount = 4
PS C:\d\m\terraform\output-and-variable> terraform apply
var.VMCount
  How many VMs do you want to start with (number)? default=1 max=5

  Enter a value: 8


Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:

Terraform will perform the following actions:

Plan: 0 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  ~ VMCount = 4 -> 2

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes


Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

VMCount = 2
PS C:\d\m\terraform\output-and-variable> terraform output
VMCount = 2
PS C:\d\m\terraform\output-and-variable>

Could you check what outouts doyou have in state? VMC or VMCount?

Krzysztof Madej
  • 32,704
  • 10
  • 78
  • 107
5

As stated here in the terraform documentation:

Outputs are only rendered when Terraform applies your plan. Running terraform plan will not render outputs.

Ben
  • 444
  • 5
  • 7
  • I don't believe this is true, I have seen outputs rendered to the terminal after running terraform plan – Damo Jan 13 '23 at 21:03
  • @Damo Correct, terraform plan does print a `Changes to Outputs:` at least in v1.3.4. I don't know if it still prints the outputs when there is no change. – Dommondke Apr 03 '23 at 19:04
1

I tested with Terraform v1.3.4. When outputs are defined, terraform plan appears to print them as a final section after the resource changeset. It starts with Changes to Outputs:.

I don't know if it will still work when the outputs haven't changed. The easy solution is to simply add some dummy string to them to artificially create a change.

In your question, the value expression is quite complex. There may be bugs in that which are causing the value to not be printed. I think that's something for a separate question, because many people who come to this question looking for a way to print outputs will not have the same complex expression. You should see the outputs printed when you use:

output "example" {
  value = "this should show up in plan, at least until you apply it"
}
Dommondke
  • 307
  • 1
  • 8