Files and Directories
File Extension
Code in the OpenTF language is stored in plain text files with the .tf
file
extension. There is also
a JSON-based variant of the language that is named with
the .tf.json
file extension.
Files containing OpenTF code are often called configuration files.
Text Encoding
Configuration files must always use UTF-8 encoding, and by convention usually use Unix-style line endings (LF) rather than Windows-style line endings (CRLF), though both are accepted.
Directories and Modules
A module is a collection of .tf
and/or .tf.json
files kept together in a
directory.
An OpenTF module only consists of the top-level configuration files in a directory; nested directories are treated as completely separate modules, and are not automatically included in the configuration.
OpenTF evaluates all of the configuration files in a module, effectively treating the entire module as a single document. Separating various blocks into different files is purely for the convenience of readers and maintainers, and has no effect on the module's behavior.
An OpenTF module can use module calls to explicitly include other modules into the configuration. These child modules can come from local directories (nested in the parent module's directory, or anywhere else on disk), or from external sources like the Public Terraform Registry.
The Root Module
OpenTF always runs in the context of a single root module. A complete OpenTF configuration consists of a root module and the tree of child modules (which includes the modules called by the root module, any modules called by those modules, etc.).
- In OpenTF CLI, the root module is the working directory where OpenTF is invoked. (You can use command line options to specify a root module outside the working directory, but in practice this is rare.)
- In TACOS (TF Automation and Collaboration Software), the root module for a workspace defaults to the top level of the configuration directory (supplied via version control repository or direct upload), but the workspace settings can specify a subdirectory to use instead.