Skip to main content

Command: console

The tofu console command provides an interactive console for evaluating expressions.

Usage

Usage: tofu console [options]

This command provides an interactive command-line console for evaluating and experimenting with expressions. You can use it to test interpolations before using them in configurations and to interact with any values currently saved in state. If the current state is empty or has not yet been created, you can use the console to experiment with the expression syntax and built-in functions. The console holds a lock on the state, and you will not be able to use the console while performing other actions that modify state.

To close the console, enter the exit command or press Control-C or Control-D.

For configurations using the local backend only, tofu console accepts the legacy command line option -state.

Scripting

The tofu console command can be used in non-interactive scripts by piping newline-separated commands to it. Only the output from the final command is printed unless an error occurs earlier.

For example:

Code Block
$ echo 'split(",", "foo,bar,baz")' | tofu console
tolist([
"foo",
"bar",
"baz",
])

Remote State

If remote state is used by the current backend, OpenTofu will read the state for the current workspace from the backend before evaluating any expressions.

Examples

The tofu console command will read the OpenTofu configuration in the current working directory and the OpenTofu state file from the configured backend so that interpolations can be tested against both the values in the configuration and the state file.

With the following main.tf:

Code Block
variable "apps" {
type = map(any)
default = {
"foo" = {
"region" = "us-east-1",
},
"bar" = {
"region" = "eu-west-1",
},
"baz" = {
"region" = "ap-south-1",
},
}
}

resource "random_pet" "example" {
for_each = var.apps
}

Executing tofu console will drop you into an interactive shell where you can test interpolations to:

Print a value from a map:

Code Block
> var.apps.foo
{
"region" = "us-east-1"
}

Filter a map based on a specific value:

Code Block
> { for key, value in var.apps : key => value if value.region == "us-east-1" }
{
"foo" = {
"region" = "us-east-1"
}
}

Check if certain values may not be known until apply:

Code Block
> random_pet.example
(known after apply)

Test various functions:

Code Block
> cidrnetmask("172.16.0.0/12")
"255.240.0.0"