8
votes

I am having trouble in variable interpolation in terraform. Here is what my terraform configuration looks like. i.e variable inside builtin function

variable "key" {}

    ssh_keys {
        path     = "/home/${var.provider["user"]}/.ssh/authorized_keys"
        key_data = "${file(${var.key})}" 
    }

Command: terraform apply -var 'key=~/.ssh/id_rsa.pub'

It's not reading the value of "key" from command line argument or from env variable. However when i hardcore the value in .tf file, it works. Like below.

key_data = "${file("~/.ssh/id_rsa.pub")}"
3
Are you overriding the command line and/or env input of the variable by hardcoding it to be empty in the code?Matt Schuchard

3 Answers

11
votes

The ${ ... } syntax is only used when embedding an expression into a quoted string. In this case, where your var.key variable is just being passed as an argument to a function already within a ${ ... } sequence, you can just reference the variable name directly like this:

key_data = "${file(var.key)}" 

Nested ${ ... } sequences are sometimes used to pass an interpolated string to a function. In that case there would first be a nested set of quotes to return to string context. For example:

key_data = "${file("${path.module}/${var.key_filename}")}" 

In this more complicated case, the innermost string expression is first evaluated to join together the two variables with a /, then that whole string is passed to the file function, with the result finally returned as the value of key_data.

1
votes

It doesn't work because you were using the wrong flag for the scenario you described above.

If you want to specify a path to a file use the "-var-file" flag as follow:

 terraform apply -var-file=~/.ssh/id_rsa.pub

If you must use the "-var" flag then you must specify the content of the file as follow:

terraform apply -var 'key=contenctOFPublicKey'
0
votes

ssh_keys - (Optional) Specifies a collection of path and key_data to be placed on the virtual machine.

Note: Please note that the only allowed path is /home/<username>/.ssh/authorized_keys due to a limitation of Azure.

refer: AZURERM_VIRTUAL_MACHINE