Consul-Terraform-Sync Configuration

This topic contains configuration reference information for Consul-Terraform-Sync (CTS). Pass configuration settings in an HCL or JSON configuration file to configure the CTS daemon. Refer to the HashiCorp Configuration Language to learn the HCL syntax.

Global configurations

Top level options are reserved for configuring CTS.

  1. log_level = "INFO"
  2. working_dir = "sync-tasks"
  3. port = 8558
  4. id = "cts-01"
  5. syslog {
  6. facility = "local2"
  7. }
  8. buffer_period {
  9. enabled = true
  10. min = "5s"
  11. max = "20s"
  12. }
  13. tls {
  14. enabled = true
  15. cert = "/path/to/cert.pem"
  16. key = "/path/to/key.pem"
  17. verify_incoming = true
  18. ca_cert = "/path/to/ca.pem"
  19. }
  • buffer_period - Configures the default buffer period for all dynamic tasks to dampen the effects of flapping services to downstream network devices. It defines the minimum and maximum amount of time to wait for the cluster to reach a consistent state and accumulate changes before triggering task executions. The default is enabled to reduce the number of times downstream infrastructure is updated within a short period of time. This is useful to enable in systems that have a lot of flapping. Buffer periods do not apply to scheduled tasks.
    • enabled - (bool: true) Enable or disable buffer periods globally. Specifying min will also enable it.
    • min - (string: “5s”) The minimum period of time to wait after changes are detected before triggering related tasks.
    • max - (string: “20s”) The maximum period of time to wait after changes are detected before triggering related tasks. If min is set, the default period for max is 4 times the value of min.
  • log_level - (string: “INFO”) The log level to use for CTS logging. This defaults to “INFO”. The available log levels are “TRACE”, “DEBUG”, “INFO”, “WARN”, and “ERR”.
  • port - (int: 8558) The port for CTS to use to serve API requests.
  • id (string: Generated ID with the format cts-<hostname>) The ID of the CTS instance. CTS uses the ID as the service ID for CTS if service registration is enabled. CTS also uses the ID to identify the instance in a high availability cluster.
  • syslog - Specifies the syslog server for logging.
    • enabled - (bool) Enable syslog logging. Specifying other option also enables syslog logging.
    • facility - (string: “local0”) Name of the syslog facility to log to.
    • name - (string: “consul-terraform-sync”) Name to use for the daemon process when logging to syslog.
  • working_dir - (string: “sync-tasks”) Specifies the base working directory for managing the artifacts generated by CTS for each task, including Terraform configuration files. CTS will also generate a subdirectory for each task, e.g., ./sync-tasks/task-name. The subdirectory is the working directory for the task. Use the task.working_dir option to override task-level working directories.
  • tls - Configure TLS on the CTS API.
    • enabled - (bool: false) Enable TLS. Providing a value for any of the TLS options will enable this parameter implicitly.
    • cert - (string) The path to a PEM-encoded certificate file used for TLS connections to the CTS API.
    • key - (string) The path to the PEM-encoded private key file used with the certificate configured by cert.
    • verify_incoming - (bool: false) Enable mutual TLS. Requires all incoming connections to the CTS API to use a TLS connection and provide a certificate signed by a Certificate Authority specified by the ca_cert or ca_path.
    • ca_cert - (string) The path to a PEM-encoded certificate authority file used to verify the authenticity of the incoming client connections to the CTS API when verify_incoming is set to true. Takes precedence over ca_path if both are configured.
    • ca_path - (string) The path to a directory of PEM-encoded certificate authority files used to verify the authenticity of the incoming client connections to the CTS API when verify_incoming is set to true.
  • license_path EnterpriseConfiguration - 图1Enterprise - (string) Deprecated in CTS 0.6.0 and will be removed in a future release. Use license block instead. Configures the path to the file that contains the license. You must specify a license in order to use enterprise features. You can also set the license by defining the CONSUL_LICENSE and CONSUL_LICENSE_PATH environment variables. For more information, refer to Setting the License.

License EnterpriseConfiguration - 图2Enterprise

The license block configures how CTS loads its license with options to:

  • Configure CTS to automatically retrieve a license from Consul.
  • Provide a path to a license file.

When a license block is not configured, CTS uses automatic license retrieval.

  1. license {
  2. path = "path/to/license.lic"
  3. auto_retrieval {
  4. enabled = true
  5. }
  6. }
ParameterRequiredTypeDescriptionDefault
pathOptionalstringConfigures the path to the file containing a license. If a path to a license is configured, this license is used until you enable automatic license retrieval. You can also set the license by defining the CONSUL_LICENSE and CONSUL_LICENSE_PATH environment variables. To learn more, review Setting the License.none
auto_retrievalOptionalobjectConfigures the license auto-retrieval used by CTS. To learn more, review Auto-Retrieval for detailsReview Auto-Retrieval for defaults.

Auto-retrieval

You can use the auto_retrieval block to configure the the automatic license retrieval in CTS. When enabled, CTS attempts to retrieve a new license from its configured Consul Enterprise backend once a day. If CTS cannot retrieve a license and the current license is reaching its expiration date, CTS attempts to retrieve a license with increased frequency, as defined by the License Expiration Date Handling.

Enabling auto_retrieval is recommended when using HCP Consul, as HCP Consul licenses expire more frequently than Consul Enterprise licenses. Without auto-retrieval enabled, you have to restart CTS every time you load a new license.

ParameterRequiredTypeDescriptionDefault
enabledOptionalstringIf set to true, enables license auto-retrievaltrue

Consul connection

The consul block configures the CTS connection with a Consul agent so that CTS can perform queries for task execution. It also configures the automatic registration of CTS as a service with Consul.

Note: Use HTTP/2 to improve Consul-Terraform-Sync performance when communicating with the local Consul process. TLS/HTTPS must be configured for the local Consul with the cert_file and key_file parameters set. For the Consul-Terraform-Sync configuration, set tls.enabled = true and set the address parameter to the HTTPS URL, e.g., address = example.consul.com:8501. If using self-signed certificates for Consul, you will also need to set tls.verify = false or add the certificate to ca_cert or ca_path.

To read more on suggestions for configuring the Consul agent, see run an agent.

  1. consul {
  2. address = "localhost:8500"
  3. auth {}
  4. tls {}
  5. token = null
  6. transport {}
  7. service_registration {
  8. service_name = "cts"
  9. address = "172.22.0.2"
  10. default_check {
  11. address = "http://172.22.0.2:8558"
  12. }
  13. }
  14. }
ParameterRequiredTypeDescriptionDefault
addressOptionalstringThe address of the Consul agent. It may be an IP or FQDN.localhost:8500
tokenOptionalstringThe ACL token to use for client communication with the local Consul agent. See ACL Requirements for required privileges.

The token can also be provided through the CONSUL_TOKEN or CONSUL_HTTP_TOKEN environment variables.
none
authOptionalauthHTTP basic authentication for communicating with Consul
tlsOptionaltlsSecure client connection with Consul
transportOptionaltransportLow-level network connection details
service_registrationOptionalservice_registrationOptions for how CTS will register itself as a service with a health check to Consul.

ACL requirements

The following table describes the ACL policies required by CTS. For more information, refer to the Secure Consul-Terraform-Sync for Production tutorial.

PolicyResources
service:readAny services monitored by tasks
node:readAny nodes hosting services monitored by tasks
keys:readAny Consul KV pairs monitored by tasks
namespace:readEnterprise Any namespaces for resources monitored by tasks
service:writeThe CTS service when service registration is enabled
keys:writeconsul-terraform-sync/ Only required when using Consul as the Terraform backend.

Auth

Configures HTTP basic authentication for communicating with Consul.

ParameterRequiredTypeDescriptionDefault
enabledOptionalbooleanEnables using HTTP basic authenticationfalse
usernameOptionalstringUsername for authenticationnone
passwordOptionalstringPassword for authenticationnone

TLS

Configure TLS to use a secure client connection with Consul. Using HTTP/2 can solve issues related to hitting Consul’s maximum connection limits, as well as improve efficiency when processing many blocking queries. This option is required for Consul-Terraform-Sync when connecting to a Consul agent with TLS verification enabled for HTTPS connections.

If Consul is using a self-signed certificate that you have not added to the global CA chain, you can set this certificate with ca_cert or ca_path. Alternatively, you can disable SSL verification by setting verify to false. However, disabling verification is a potential security vulnerability.

ParameterRequiredTypeDescriptionDefault
enabledOptionalbooleanEnable TLS. Providing a value for any of the TLS options enables this parameter implicitly.false
verifyOptionalbooleanEnables TLS peer verification, which checks the global certificate authority (CA) chain to make sure the certificates returned by Consul are valid.true
ca_certOptionalstringThe path to a PEM-encoded certificate authority file used to verify the authenticity of the connection to Consul over TLS.

Can also be provided through the CONSUL_CACERT environment variable.
none
ca_pathOptionalstringThe path to a directory of PEM-encoded certificate authority files used to verify the authenticity of the connection to Consul over TLS.

Can also be provided through the CONSUL_CAPATH environment variable.
none
certOptionalstringThe path to a PEM-encoded client certificate file provided to Consul over TLS in order for Consul to verify the authenticity of the connection from CTS. Required if Consul has verify_incoming set to true.

Can also be provided through the CONSUL_CLIENT_CERT environment variable.
none
keyOptionalstringThe path to the PEM-encoded private key file used with the client certificate configured by cert. Required if Consul has verify_incoming set to true.

Can also be provided through the CONSUL_CLIENT_KEY environment variable.
none
server_nameOptionalstringThe server name to use as the Server Name Indication (SNI) for Consul when connecting via TLS.

Can also be provided through the CONSUL_TLS_SERVER_NAME environment variable.
none

Transport

Configures the low-level network connection details to Consul.

To achieve the shortest latency between a Consul service update to a task execution, configure max_idle_conns_per_host equal to or greater than the number of services in automation across all tasks. This value should be lower than the configured http_max_conns_per_client for the Consul agent.

If max_idle_conns_per_host and the number of services in automation is greater than the Consul agent limit, CTS may error due to connection limits (status code 429). You may increase the agent limit with caution. Note: requests to the Consul agent made by Terraform subprocesses or any other process on the same host as CTS will contribute to the Consul agent connection limit.

ParameterRequiredTypeDescriptionDefault
dial_keep_aliveOptionalstringThe amount of time for keep-alives.30s
dial_timeoutOptionalstringThe amount of time to wait to establish a connection.30s
disable_keep_alivesOptionalbooleanDetermines if keep-alives should be used. Disabling this significantly decreases performance.false
idle_conn_timeoutOptionalstringThe timeout for idle connections.5s
max_idle_connsOptionalintegerThe maximum number of total idle connections across all hosts. The limit is disabled by default.0
max_idle_conns_per_hostOptionalintegerThe maximum number of idle connections per remote host. The majority of connections are established with one host, the Consul agent.100
tls_handshake_timeoutOptionalstringThe amount of time to wait to complete the TLS handshake.10s

Service registration

CTS automatically registers itself with Consul as a service with a health check, using the id configuration as the service ID. CTS deregisters itself with Consul when CTS stops gracefully. If CTS is unable to register with Consul, then it will log the error and continue without exiting.

Service registration requires that the Consul token has an ACL policy of service:write for the CTS service.

ParameterRequiredTypeDescriptionDefault
enabledOptionalbooleanEnables CTS to register itself as a service with Consul. When service registration is enabled for a CTS instance configured for high availability, the instance also registers itself with a new tag using the cts-cluster:<cluster-name> format.true
service_nameOptionalstringThe service name for CTS. We recommended specifying the same name used for high_availability.cluster.name value if CTS is configured for high availability.consul-terraform-sync
addressOptionalstringThe IP address or hostname for CTS.IP address of the Consul agent node
namespaceOptionalstringEnterprise The namespace to register CTS in.In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.
default_check.enabledOptionalbooleanEnables CTS to create the default health check.true
default_check.addressOptionalstringThe address to use for the default HTTP health check. Needs to include the scheme (http/https) and the port, if applicable.http://localhost:<port&gt; or https://localhost:<port&gt;. Determined from the port configuration and whether TLS is enabled on the CTS API.

The default health check is an HTTP check that calls the Health API. The following table describes the values CTS sets for this default check, corresponding to the Consul register check API. If an option is not listed in this table, then CTS is using the default value.

ParameterValue
NameCTS Health Status
ID<id>-health
Namespaceservice_registration.namespace
NotesCheck created by Consul-Terraform-Sync
DeregisterCriticalServiceAfter30m
ServiceIDid
Statuscritical
HTTP<default_check.address>/v1/health
MethodGET
Interval10s
Timeout2s
TLSSkipVerifyfalse

High availability

Add a high_availability block to your configuration to enable CTS to run in high availability mode. Refer to Run Consul-Terraform-Sync with High Availability for additional information. The high_availability block contains the following configuration items.

High availability cluster

The cluster parameter contains configurations for the cluster you want to operate with high availability enabled. You can configure the following options:

ParameterDescriptionRequiredType
nameSpecifies the name of the cluster operating with high availability enabled.RequiredString
storageConfigures how CTS stores state information. Refer to State storage and persistence for additional information. You can define storage for the “consul” resource. Refer to High availability cluster storage for additional information.OptionalObject

High availability cluster storage

The high_availability.cluster.storage object contains the following configurations.

ParameterDescriptionRequiredType
parent_pathDefines a parent path in the Consul KV for CTS to store state information. Default is consul-terraform-sync/. CTS automatically appends the cluster name to the parent path, so the effective default directory for state information is consul-terraform-sync/<cluster-name>.OptionalString
namespaceSpecifies the namespace to use when storing state in the Consul KV. Default is inferred from the CTS ACL token. The fallback default is default.OptionalString
session_ttlSpecifies the session time-to-live for leader elections. You must specify a value greater than the session_ttl_min configured for Consul. A longer session_ttl results in a longer leader election after a failover. Default is 15s.OptionalString

High availability instance

The instance parameter is an object that contains configurations unique to the CTS instance. You specify the following configurations:

  • address: (Optional) String value that specifies the IP address of the CTS instance to advertise to other instances. This parameter does not have a default value.

Service

Note: Deprecated in CTS 0.5.0 and will be removed in a future major release. service blocks are used to define the task block’s services fields, which were also deprecated and replaced with Services Condition and Services Module Input. service block configuration can be replaced by configuring the equivalent fields of the corresponding Services Condition and Services Module Input. Refer to 0.5.0 release notes for examples.

A service block is an optional block to explicitly define the services configured in the task block’s services field (deprecated). service blocks do not define services configured in the task block’s condition "services" or module_input "services blocks.

A service block is only necessary for services that have non-default values e.g. custom datacenter. Services that do not have a service block configured will assume default values. To configure multiple services, specify multiple service blocks. If a service block is configured, the service can be referred in task.services by service name or ID. If a service block is not configured, it can only be referred to by service name.

  1. service {
  2. name = "web"
  3. datacenter = "dc1"
  4. description = "all instances of the service web in datacenter dc1"
  5. }
ParameterRequiredTypeDescriptionDefault
nameRequiredstringConsul logical name of the service.none
idOptionalstringService ID for CTS. This is used to explicitly identify the service config for a task to use. If no ID is provided, the service is identified by the service name within a task definition.none
descriptionOptionalstringHuman-readable text to describe the servicenone
datacenterOptionalstringName of a datacenter to query for the task.Datacenter of the agent that CTS queries.
namespaceOptionalstringEnterprise
Namespace of the services to query for the task.
In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.
filterOptionalstringExpression used to additionally filter the services to monitor.

Refer to the services filtering documentation and section about how to write filter expressions for additional information.
none
cts_user_defined_metaOptionalmap[string]User-defined metadata that is appended to the service input variable for compatible Terraform modules.

Some modules do not use the configured metadata. Refer to the module configured for the task for information about metadata usage and expected keys and format.

If multiple tasks depend on the same service but require different metadata, you can declare different sets of metadata for the same service. Define multiple service blocks for the service with unique IDs (and identical names) for those blocks. The metadata can then be separated per task based on the service IDs.
none

Task

A task block configures which task to execute in automation. Use the condition block to specify when the task executes. You can specify the task block multiple times to configure multiple tasks, or you can omit it entirely. If task blocks are not specified in your initial configuration, you can add them to a running CTS instance by using the /tasks API endpoint or the CLI’s task command.

  1. task {
  2. name = "taskA"
  3. description = ""
  4. enabled = true,
  5. providers = []
  6. module = "org/example/module"
  7. version = "1.0.0"
  8. variable_files = []
  9. condition "services" {
  10. names = ["web", "api"]
  11. }
  12. }
  • description - (string) The human readable text to describe the task.

  • name - (string: required) Name is the unique name of the task (required). A task name must start with a letter or underscore and may contain only letters, digits, underscores, and dashes.

  • enabled - (bool: true) Enable or disable a task from running and managing resources.

  • providers - (list[string]) Providers is the list of provider names the task is dependent on. This is used to map Terraform provider configuration to the task.

  • services - (list[string]) Deprecated in CTS 0.5.0 and will be removed in a future major release. Use Services Condition or Services Module Input instead. See 0.5.0 release notes for examples. Specifies an optional list of logical service names or service IDs that the task monitors for changes in the Consul catalog. The services can act in different ways depending on the configuration of the task’s condition block:

    • no condition block configured: services will act as the task’s condition and provide the services information as module input
    • the condition block configured for type services: services is incompatible with this type of condition because both configure the services module input. CTS will return an error.
    • the condition block configured for all other types: services will act only to provide services module input.

    Service values that are not explicitly defined by a service block that have a matching ID are assumed to be logical service names in the default namespace.

  • source - (string: required) Deprecated in CTS 0.5.0 and will be removed in a future major release. See the module field instead.

  • module - (string: required) Module is the location the driver uses to discover the Terraform module used for automation. The module’s source can be local or remote on the Terraform Registry or private module registry. Read more on Terraform module source and other supported types here.

    • To use a private module with the terraform driver, run the command terraform login [hostname] to authenticate the local Terraform CLI prior to starting CTS.

    • To use a private module with the terraform_cloud driver, no extra steps are needed.

      1. // local module example: "./terraform-cts-hello"
      2. module = "<PATH>"
      3. // public module example: "mkam/hello/cts"
      4. module = "<NAMESPACE>/<MODULE NAME>/<PROVIDER>"
      5. // private module example: "my.tfe.hostname.io/my-org/hello/cts"
      6. module = "<HOSTNAME>/<ORGANIZATION>/<MODULE NAME>/<PROVIDER>"
  • variable_files - (list[string]) Specifies list of paths to Terraform variable definition files (.tfvars). The content of these files should consist of only variable name assignments. The variable assignments must match the corresponding variable declarations made available by the Terraform module for the task.

    • Variables are loaded in the order they appear in the files. Duplicate variables are overwritten with the later value. Unless specified by the module, configure arguments for Terraform providers using terraform_provider blocks.

      Configuration - 图6

      example.tfvars

      1. address_group = "consul-services"
      2. tags = [
      3. "consul-terraform-sync",
      4. "terraform"
      5. ]
  • version - (string) The version of the provided module the task will use. The latest version will be used as the default if omitted.

  • working_dir - (string) The working directory to manage generated artifacts by CTS for this task, including Terraform configuration files. By default, a working directory is created for each task as a subdirectory in the base working_dir, e.g. sync-tasks/task-name.

  • buffer_period - Configures the buffer period for a dynamic task to dampen the effects of flapping services to downstream network devices. It defines the minimum and maximum amount of time to wait for the cluster to reach a consistent state and accumulate changes before triggering task execution. The default is inherited from the top level buffer_period block. If configured, these values will take precedence over the global buffer period. This is useful to enable for a task that is dependent on services that have a lot of flapping. Buffer periods do not apply to scheduled tasks.

    • enabled - (bool) Enable or disable buffer periods for this task. Specifying min will also enable it.
    • min - (string: “5s”) The minimum period of time to wait after changes are detected before triggering related tasks.
    • max - (string: “20s”) The maximum period of time to wait after changes are detected before triggering related tasks. If min is set, the default period for max is 4 times the value of min.
  • condition - (obj: required) The requirement that, when met, triggers CTS to execute the task. Only one condition may be configured per task. CTS supports different types of conditions, which each have their own configuration options. See Task Condition configuration for full details on configuration options for each condition type.

  • source_input - (obj) Deprecated in CTS 0.5.0 and will be removed in 0.8.0. See the module_input block instead.

  • module_input - (obj) Specifies a Consul object containing values or metadata to be provided to the Terraform Module. The module_input block defines any extra module inputs needed for task execution. This is in addition to any module input provided by the condition block or services field (deprecated). Multiple module_input blocks can be configured per task. Task Module Input configuration for full details on usage and restrictions.

  • terraform_version - (string) EnterpriseConfiguration - 图7Enterprise Deprecated in CTS 0.6.0 and will be removed in 0.8.0. Review terraform_cloud_workspace.terraform_version instead. The version of Terraform to use for the Terraform Cloud workspace associated with the task. Defaults to the latest compatible version supported by the organization. This option is only available when used with the Terraform Cloud driver; otherwise, set the version within the Terraform driver.

  • terraform_cloud_workspace - (obj) EnterpriseConfiguration - 图8Enterprise Configures attributes of the Terraform Cloud workspace associated with the task. This option is only available when used with the Terraform Cloud driver. For global configurations of all workspaces, review driver.workspaces.

    • execution_mode - (string: “remote”) The execution mode that determines whether to use Terraform Cloud as the Terraform execution platform. Only supports “remote” or “agent”.
    • agent_pool_id - (string) Only supported if execution_mode is set to “agent”. The ID of the agent pool that should run the Terraform workloads. Either agent_pool_id or agent_pool_name are required if execution_mode is set to “agent”. agent_pool_id takes precedence over agent_pool_name if both are provided.
    • agent_pool_name - (string) Only supported if execution_mode is set to “agent”. The name of the agent pool that should run the Terraform workloads. Only supported if execution_mode is set to “agent”. Either agent_pool_id or agent_pool_name are required. agent_pool_id takes precedence over agent_pool_name if both are provided.
    • terraform_version - (string) The version of Terraform to use for the Terraform Cloud workspace associated with the task. Defaults to the latest compatible version supported by the organization.

Task Condition

A task block is configured with a condition block to set the conditions that should be met in order to execute that particular task. Below are the different types of conditions that CTS supports.

Services Condition

This condition will trigger the task on services that match the regular expression configured in regexp or services listed by name in names. Either regexp or names must be configured, but not both.

When a condition "services" block is configured for a task, then the following restrictions become applicable:

  • the task cannot be configured with the services field (deprecated)
  • the task cannot be configure with a module_input "services" or source_input "services" (deprecated) block

These restrictions are due to the fact that the monitored services information for a task can only be set through one configuration option. Any services module input that the task needs should be configured solely through the condition block.

See Task Execution: Services Condition for more details on how tasks are triggered with a services condition.

  1. task {
  2. name = "services_condition_regexp_task"
  3. description = "execute on changes to services with names starting with web"
  4. providers = ["my-provider"]
  5. module = "path/to/services-condition-module"
  6. condition "services" {
  7. regexp = "^web.*"
  8. datacenter = "dc1"
  9. namespace = "default"
  10. filter = "Service.Tags not contains \"prod\""
  11. cts_user_defined_meta {
  12. key = "value"
  13. }
  14. }
  15. }
  1. task {
  2. name = "services_condition_names_task"
  3. description = "execute on changes to services with names api or web"
  4. module = "path/to/services-condition-module"
  5. condition "services" {
  6. names = ["api", "web"]
  7. datacenter = "dc1"
  8. namespace = "default"
  9. filter = "Service.Tags not contains \"prod\""
  10. cts_user_defined_meta {
  11. key = "value"
  12. }
  13. }
  14. }
ParameterRequiredTypeDescriptionDefault
regexpRequired if names is not configuredstringRegular expression used to match the names of Consul services to monitor. Only services that have a name matching the regular expression are used by the task.

If both a list and a regex are needed, consider including the list as part of the regex or creating separate tasks.
none
namesRequired if regexp is not configuredlist[string]Names of Consul services to monitor. Only services that have their name listed in names are used by the task.none
datacenterOptionalstringName of a datacenter to query for the task.Datacenter of the agent that CTS queries.
namespaceOptionalstringEnterprise
Namespace of the services to query for the task.
In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.
filterOptionalstringExpression used to additionally filter the services to monitor.

Refer to the services filtering documentation and section about how to write filter expressions for additional information.
none
cts_user_defined_metaOptionalmap[string]User-defined metadata that is appended to the service input variable for compatible Terraform modules.

Some modules do not use the configured metadata. Refer to the module configured for the task for information about metadata usage and expected keys and format.
none
source_includes_varOptionalbooleanDeprecated in CTS 0.5.0 and will be removed in 0.8.0. See the use_as_module_input field instead.true
use_as_module_inputOptionalbooleanWhether or not the values of the condition object should also be used as input for the services variable for the Terraform module

Please refer to the selected module’s documentation for guidance on how to configure this field. If configured inconsistently with the module, CTS will error and exit.
true

Catalog-Services Condition

A catalog-services condition block configures a task to only execute on service registration and deregistration, more specifically on first service instance registration and last service instance deregistration respectively. The catalog-services condition has additional configuration options to specify the services that can trigger the task on registration and deregistration.

See Task Execution: Catalog Services Condition for more information on how tasks are triggered with a catalog-services condition.

  1. task {
  2. name = "catalog_service_condition_task"
  3. description = "execute on service de/registrations with name matching 'web.*'"
  4. module = "path/to/catalog-services-module"
  5. providers = ["my-provider"]
  6. condition "catalog-services" {
  7. datacenter = "dc1"
  8. namespace = "default"
  9. regexp = "web.*"
  10. use_as_module_input = true
  11. node_meta {
  12. key = "value"
  13. }
  14. }
  15. }
ParameterRequiredTypeDescriptionDefault
regexpRequiredstringRegular expression used to match the names of Consul service to monitor for registration and deregistration. Only services that have a name matching the regular expression are used by the task.

Refer to regular expression syntax documentation and try out regular expression string matching for additional information.
none
datacenterOptionalstringName of a datacenter to query for the task.Datacenter of the agent that CTS queries.
namespaceOptionalstringEnterprise
Namespace of the services to query for the task.
In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.
node_metaOptionalmap[string]Node metadata key/value pairs to use to filter services. Only services registered at a node with the specified key/value pairs are used by the task.none
source_includes_varOptionalbooleanDeprecated in CTS 0.5.0 and will be removed in 0.8.0. See the use_as_module_input field instead.true
use_as_module_inputOptionalbooleanWhether or not the values of the condition object should also be used as input for the catalog_services variable for the Terraform module

Please refer to the selected module’s documentation for guidance on how to configure this field. If configured inconsistently with the module, CTS will error and exit.
true

Consul KV Condition

A condition "consul-kv" block configures a task to only execute on changes to a Consul KV entry. The condition can be configured for a single Consul KV entry or for any Consul KV entries that are prefixed with a given path.

When a condition "consul-kv" block is configured for a task, the task cannot be configured with a module_input "consul-kv" or source_input "consul-kv" (deprecated) block. The monitored consul-kv information for a task can only be set through one configuration option. Any consul-kv module input that the task needs should be configured solely through the condition block.

See Task Execution: Consul KV Condition for more information on how tasks are triggered with a consul-kv condition.

  1. task {
  2. name = "consul_kv_condition_task"
  3. description = "execute on changes to Consul KV entry"
  4. module = "path/to/consul-kv-module"
  5. providers = ["my-provider"]
  6. condition "consul-kv" {
  7. path = "my-key"
  8. recurse = false
  9. datacenter = "dc1"
  10. namespace = "default"
  11. use_as_module_input = true
  12. }
  13. }
ParameterRequiredTypeDescriptionDefault
pathRequiredstringPath of the key used by the task. The path can point to a single Consul KV entry or several entries within the path.none
recurseOptionalbooleanEnables CTS to treat the path as a prefix. If set to false, the path will be treated as a literal match.false
datacenterOptionalstringName of a datacenter to query for the task.Datacenter of the agent that CTS queries.
namespaceOptionalstringEnterprise
Namespace of the services to query for the task.
In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.
source_includes_varOptionalbooleanDeprecated in CTS 0.5.0 and will be removed in 0.8.0. See the use_as_module_input field instead.true
use_as_module_inputOptionalbooleanWhether or not the values of the condition object should also be used as input for the consul_kv variable for the Terraform module

Please refer to the selected module’s documentation for guidance on how to configure this field. If configured inconsistently with the module, CTS will error and exit.
true

Schedule Condition

A scheduled task has a schedule condition block, which defines the schedule for executing the task. Unlike a dynamic task, a scheduled task does not dynamically trigger on changes in Consul.

Schedule tasks also rely on additional task configuration, separate from the condition block to determine the module input information to provide to the task module. See module_input block configuration for details on how to configure module input.

See Task Execution: Schedule Condition for more information on how tasks are triggered with schedule conditions.

See Terraform Module: Module Input for more information on module input options for a scheduled task.

  1. task {
  2. name = "scheduled_task"
  3. description = "execute every Monday using service information from web and db"
  4. module = "path/to/module"
  5. condition "schedule" {
  6. cron = "* * * * Mon"
  7. }
  8. module_input "services" {
  9. names = ["web", "db"]
  10. }
  11. }
ParameterRequiredTypeDescriptionDefault
cronRequiredstringThe CRON expression that dictates the schedule to trigger the task. For more information on CRON expressions, see the cronexpr parsing library.none

Task Module Input

module_input was renamed from source_input in CTS 0.5.0. Documentation for the module_input block also applies to the source_input block.

You can optionally add one or more module_input blocks to the task block. A module_input block specifies a Consul object containing values or metadata to be provided to the Terraform Module. Both scheduled and dynamic tasks can be configured with module_input blocks.

The example below shows an outline of module_input within a task configuration:

  1. task {
  2. name = "task_a"
  3. module = "path/to/module"
  4. services = ["api"] // (deprecated)
  5. condition "<condition-type>" {
  6. // ...
  7. }
  8. module_input "<input-type>" {
  9. // ...
  10. }
  11. }

The type of the module_input block that can be configured depends on the condition block type and the services field (deprecated). See Task Module Input Restrictions for more details.

The following sections describe the module input types that CTS supports.

Services Module Input

This services module input object defines services registered to Consul whose metadata will be used as services module input to the Terraform Module. The following parameters are supported:

ParameterRequiredTypeDescriptionDefault
regexpRequired if names is not configuredstringRegular expression used to match the names of Consul services to monitor. Only services that have a name matching the regular expression are used by the task.

If both a list and a regex are needed, consider including the list as part of the regex or creating separate tasks.
none
namesRequired if regexp is not configuredlist[string]Names of Consul services to monitor. Only services that have their name listed in names are used by the task.none
datacenterOptionalstringName of a datacenter to query for the task.Datacenter of the agent that CTS queries.
namespaceOptionalstringEnterprise
String value indicating the namespace of the services to query for the task.
In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.
filterOptionalstringExpression used to additionally filter the services to monitor.

Refer to the services filtering documentation and section about how to write filter expressions for additional information.
none
cts_user_defined_metaOptionalmap[string]User-defined metadata that is appended to the service input variable for compatible Terraform modules.

Some modules do not use the configured metadata. Refer to the module configured for the task for information about metadata usage and expected keys and format.
none

In the following example, the scheduled task queries all Consul services with web as the suffix. The metadata of matching services are provided to the Terraform module.

  1. task {
  2. name = "schedule_condition_task"
  3. description = "execute every Monday using information from service names starting with web"
  4. module = "path/to/module"
  5. condition "schedule" {
  6. cron = "* * * * Mon"
  7. }
  8. module_input services {
  9. regexp = "^web.*"
  10. datacenter = "dc1"
  11. namespace = "default"
  12. filter = "Service.Tags not contains \"prod\""
  13. cts_user_defined_meta {
  14. key = "value"
  15. }
  16. }
  17. }

Consul KV Module Input

A Consul KV module input block defines changes to Consul KV that will be monitored. These changes will then be provided as Consul KV module input to the Terraform Module. The module input can be configured for a single Consul KV entry or for any Consul KV entries that are prefixed with a given path. The following parameters are supported:

ParameterRequiredTypeDescriptionDefault
pathRequiredstringPath of the key used by the task. The path can point to a single Consul KV entry or several entries within the path.none
recurseOptionalbooleanEnables CTS to treat the path as a prefix. If set to false, the path will be treated as a literal match.false
datacenterOptionalstringName of a datacenter to query for the task.Datacenter of the agent that CTS queries.
namespaceOptionalstringEnterprise
Namespace of the services to query for the task.
In order of precedence:
1. Inferred from the CTS ACL token
2. The default namespace.

In the following example, the scheduled task queries datacenter dc1 in the default namespace for changes to the value held by the key my-key.

  1. task {
  2. name = "schedule_condition_task_kv"
  3. description = "execute every Monday using information from Consul KV entry my-key"
  4. module = "path/to/module"
  5. condition "schedule" {
  6. cron = "* * * * Mon"
  7. }
  8. module_input "consul-kv" {
  9. path = "my-key"
  10. recurse = false
  11. datacenter = "dc1"
  12. namespace = "default"
  13. }
  14. }

Task Module Input Restrictions

There are some limitations to the type of module_input blocks that can be configured for a task given the task’s condition block and services field (deprecated). This is because a task cannot have multiple configurations defining the same type of monitored variable:

  • A task cannot be configured with a condition and module_input block of the same type. For example, configuring condition "consul-kv" and module_input "consul-kv" will error because both configure the consul_kv variable.

  • A task cannot be configured with two or more module_input blocks of the same type. For example, configuring two module_input "catalog-services" within a task will return an error because they define multiple configurations for the catalog_services variable.

  • A task that monitors services can only contain one of the following configurations:

    All of the listed configurations define the services variable and including more than one configuration will return an error.

Network Drivers

A driver is required for CTS to propagate network infrastructure change. The driver block configures the subprocess that CTS runs in automation. The default driver is the Terraform driver which automates Terraform as a local installation of the Terraform CLI.

Only one network driver can be configured per deployment of CTS.

Terraform Driver

The Terraform driver block is used to configure CTS for installing and automating Terraform locally. The driver block supports Terraform configuration to specify the backend used for state management and required_providers configuration used for provider discovery.

  1. driver "terraform" {
  2. log = false
  3. persist_log = false
  4. path = ""
  5. backend "consul" {
  6. gzip = true
  7. }
  8. required_providers {
  9. myprovider = {
  10. source = "namespace/myprovider"
  11. version = "1.3.0"
  12. }
  13. }
  14. }
  • backend - (obj) The backend stores Terraform state files for each task. This option is similar to the Terraform backend configuration. CTS supports Terraform backends used as a state store.
    • Supported backend options: azurerm, consul, cos, gcs, kubernetes, local, manta, pg (Terraform v0.14+), s3. Visit the Terraform documentation links for details on backend configuration options.
    • If omitted, CTS will generate default values and use configurations from the consul block to configure Consul as the backend, which stores Terraform statefiles in the Consul KV. The ACL token provided for Consul authentication is used to read and write to the KV store and requires Consul KV privileges. The Consul KV path is the base path to store state files for tasks. The full path of each state file will have the task identifier appended to the end of the path, e.g. consul-terraform-sync/terraform-env:task-name.
    • The remote enhanced backend is not supported with the Terraform driver to run operations in Terraform Cloud. Use the Terraform Cloud driver to integrate CTS with Terraform Cloud for remote workspaces and remote operations.
    • The local backend type is not supported with CTS instances configured for high availability. If high availability is configured and the Terraform backend type is local, CTS logs an error and exits.
  • log - (bool) Enable all Terraform output (stderr and stdout) to be included in the CTS log. This is useful for debugging and development purposes. It may be difficult to work with log aggregators that expect uniform log format.
  • path - (string) The file path to install Terraform or discover an existing Terraform binary. If omitted, Terraform will be installed in the same directory as the CTS daemon. To resolve an incompatible Terraform version or to change versions will require removing the existing binary or change to a different path.
  • persist_log - (bool) Enable trace logging for each Terraform client to disk per task. This is equivalent to setting TF_LOG_PATH=<work_dir>/terraform.log. Trace log level results in verbose logging and may be useful for debugging and development purposes. We do not recommend enabling this for production. There is no log rotation and may quickly result in large files.
  • required_providers - (obj: required) Declare each Terraform provider used across all tasks. This can be configured the same as how you would configure Terraform terraform.required_providers field to specify the source and version for each provider. CTS will process these requirements when preparing each task that uses the provider.
  • version - (string) The Terraform version to install and run in automation for task execution. If omitted, the driver will install the latest compatible release of Terraform. To change versions, remove the existing binary or change the path to install the desired version. Verify that the desired Terraform version is compatible across all Terraform modules used for CTS automation.

Terraform Cloud Driver

EnterpriseConfiguration - 图14Enterprise

This feature requires Consul-Terraform-Sync Enterprise which is available with Consul Enterprise.

The Terraform Cloud driver enables CTS Enterprise to integrate with Terraform Cloud, including both the self-hosted distribution and the managed service. With this driver, CTS automates Terraform runs and remote operations for workspaces.

An overview of features enabled with Terraform Cloud can be viewed within the Network Drivers documentation.

Only one network driver can be configured per deployment of CTS.

  1. driver "terraform-cloud" {
  2. hostname = "https://app.terraform.io"
  3. organization = "my-org"
  4. token = "<TEAM_TOKEN>"
  5. // Optionally set the token to be securely queried from Vault instead of
  6. // written directly to the configuration file.
  7. // token = "{{ with secret \"secret/my/path\" }}{{ .Data.data.foo }}{{ end }}"
  8. workspaces {
  9. tags = ["source:cts"]
  10. tags_allowlist = []
  11. tags_denylist = []
  12. }
  13. required_providers {
  14. myprovider = {
  15. source = "namespace/myprovider"
  16. version = "1.3.0"
  17. }
  18. }
  19. }
  • hostname - (string) The Terraform Cloud hostname to connect to. Can be overridden with the TFC_HOSTNAME environment variable.
  • organization - (string) The Terraform Cloud organization that hosts the managed workspaces by CTS. Can be overridden with the TFC_ORGANIZATION environment variable.
  • token - (string) Required Team API token used for authentication with Terraform Cloud and workspace management. Only workspace permissions are needed for CTS. The token can also be provided using the TFC_TOKEN environment variable.
    • We recommend creating a dedicated team and team API token to isolate automation by CTS from other Terraform Cloud operations.
  • workspace_prefix - (string) Deprecated in CTS 0.5.0, use the workspaces.prefix option instead. Specifies a prefix to prepend to the automatically-generated workspace names used for automation. This prefix will be used by all tasks that use this driver. By default, when no prefix is configured, the workspace name will be the task name. When a prefix is configured, the workspace name will be <workspace_prefix value>-<task name>, with the character ‘-‘ between the workspace prefix and task name. For example, if you configure the prefix as “cts”, then a task with the name “task-firewall” will have the workspace name “cts-task-firewall”.
  • workspaces - Configure CTS management of Terraform Cloud workspaces.
    • prefix - (string) Specifies a prefix to prepend to the workspace names used for CTS task automation. This prefix will be used by all tasks that use this driver. By default, when no prefix is configured, the workspace name will be the task name. When a prefix is configured, the workspace name will be <prefix><task name>. For example, if you configure the prefix as “cts_“, then a task with the name “task_firewall” will have the workspace name “cts_task_firewall”.
    • tags - (list[string]) Tags for CTS to add to all automated workspaces when the workspace is first created or discovered. Tags are added to discovered workspaces only if the workspace meets automation requirements and satisfies the allowlist and denylist tag options. This option will not affect existing tags. Tags that were manually removed during runtime will be re-tagged when CTS restarts. Compatible with Terraform Cloud and Terraform Enterprise v202108-1+
    • tags_allowlist - (list[string]) Tag requirement to use as a provision check for CTS automation of workspaces. When configured, Terraform Cloud workspaces must have at least one tag from the allow list for CTS to automate the workspace and runs. Compatible with Terraform Cloud and Terraform Enterprise v202108-1+.
    • tags_denylist - (list[string]) Tag restriction to use as a provision check for CTS automation of workspaces. When configured, Terraform Cloud workspaces must not have any tag from the deny list for CTS to automate the workspace and runs. Denied tags have higher priority than tags set in the tags_allowlist option. Compatible with Terraform Cloud and Terraform Enterprise v202108-1+.
  • required_providers - (obj: required) Declare each Terraform provider used across all tasks. This can be configured the same as how you would configure Terraform terraform.required_providers field to specify the source and version for each provider. CTS will process these requirements when preparing each task that uses the provider.
  • tls - Configure TLS to allow HTTPS connections to Terraform Enterprise.

    • enabled - (bool) Enable TLS. Providing a value for any of the TLS options will enable this parameter implicitly.
    • ca_cert - (string) The path to a PEM-encoded certificate authority file used to verify the authenticity of the connection to Terraform Enterprise over TLS.
    • ca_path - (string) The path to a directory of PEM-encoded certificate authority files used to verify the authenticity of the connection to Terraform Enterprise over TLS.
    • cert - (string) The path to a PEM-encoded client certificate file provided to Terraform Enterprise over TLS in order for Terraform Enterprise to verify the authenticity of the connection from CTS.
    • key - (string) The path to the PEM-encoded private key file used with the client certificate configured by cert for communicating with Terraform Enterprise over TLS.
    • server_name - (string) The server name to use as the Server Name Indication (SNI) for Terraform Enterprise when connecting via TLS.
    • verify - (bool: true) Enables TLS peer verification. The default is enabled, which will check the global certificate authority (CA) chain to make sure the certificates returned by Terraform Enterprise are valid.

      • If Terraform Enterprise is using a self-signed certificate that you have not added to the global CA chain, you can set this certificate with ca_cert or ca_path. Alternatively, you can disable SSL verification by setting verify to false. However, disabling verification is a potential security vulnerability.

        1. tls {
        2. verify = false
        3. }

CTS generates local artifacts to prepare configuration versions used for workspace runs. The location of the files created can be set with the working_dir option or configured per task. When a task is configured with a local module and is run with the Terraform Cloud driver, the local module is copied and uploaded as a part of the configuration version.

The version of Terraform to use for each workspace can also be set within the task configuration.

Terraform Provider

A terraform_provider block configures the options to interface with network infrastructure. Define a block for each provider required by the set of Terraform modules across all tasks. This block resembles provider blocks for Terraform configuration. To find details on how to configure a provider, refer to the corresponding documentation for the Terraform provider. The main directory of publicly available providers are hosted on the Terraform Registry.

The below configuration captures the general design of defining a provider using the AWS Terraform provider as an example.

  1. driver "terraform" {
  2. required_providers {
  3. aws = {
  4. source = "hashicorp/aws"
  5. version = "3.33.0"
  6. }
  7. }
  8. }
  9. terraform_provider "aws" {
  10. // Configuration options
  11. region = "us-east-1"
  12. }
  13. task {
  14. module = "path/to/module"
  15. providers = ["aws"]
  16. condition "services" {
  17. names = ["web", "api"]
  18. }
  19. }

Note: Provider arguments configured in CTS configuration files are written in plain text to the generated terraform.tfvars file for each Terraform workspace that references the provider. To exclude arguments or dynamic values from rendering to local files in plain text, use task_env in addition to using dynamic configuration.

Securely Configure Terraform Providers

The terraform_provider block supports dynamically loading arguments and the local environment from other sources. This can be used to securely configure your Terraform provider from the shell environment, Consul KV, or Vault. Using the task_env meta-argument and template syntax below, you can avoid exposing sensitive values or credentials in plain text within configuration files for CTS.

task_env and the template syntax for dynamic values are only supported within the terraform_provider block.

Provider Environment Variables

Terraform providers may support shell environment variables as values for some of their arguments. When available, we recommend using environment variables as a way to keep credentials out of plain-text configuration files. Refer to the official provider docs hosted on the Terraform Registry to find supported environment variables for a provider. By default, CTS enables all Terraform workspaces to inherit from its environment.

The task_env block is a meta-argument available for the terraform_provider block that can be used to rename or scope the available environment to a selected set of variables. Passing sensitive values as environment variables will scope the values to only the tasks that require the provider.

  1. terraform_provider "foo" {
  2. // Direct assignment of provider arguments are rendered in plain-text within
  3. // the CTS configuration and the generated terraform.tfvars
  4. // file for the corresponding Terraform workspaces.
  5. // token = "<token value>"
  6. // Instead of configuring the token argument directly for the provider,
  7. // use the provider's supported environment variable for the token argument.
  8. // For example,
  9. // $ export FOO_TOKEN = "<token value>"
  10. // Dynamically assign the task's environment from the shell env, Consul KV,
  11. // Vault.
  12. task_env {
  13. "FOO_TOKEN" = "{{ env \"CTS_FOO_TOKEN\" }}"
  14. }
  15. }

Security note: CTS does not prevent sensitive values from being written to Terraform state files. We recommend securing state files in addition to securely configuring Terraform providers. Options for securing state files can be set within driver.backend based on the backend used. For example, Consul KV is the default backend and can be secured with ACLs for KV path. For other backends, we recommend enabling encryption, if applicable.

Load Dynamic Values

Load dynamic values for Terraform providers with integrated template syntax.

Env

env reads the given environment variable accessible to CTS.

  1. terraform_provider "example" {
  2. address = "{{ env \"EXAMPLE_HOSTNAME\" }}"
  3. }

Consul

key queries the key’s value in the KV store of the Consul server configured in the required consul block.

  1. terraform_provider "example" {
  2. value = "{{ key \"path/example/key\" }}"
  3. }

Vault

with secret queries the Vault KV secrets engine. Vault is an optional source that require operators to configure the Vault client with a vault block. Access the secret using template dot notation Data.data.<secret_key>.

  1. vault {
  2. address = "vault.example.com"
  3. }
  4. terraform_provider "example" {
  5. token = "{{ with secret \"secret/my/path\" }}{{ .Data.data.foo }}{{ end }}"
  6. }
Vault Configuration
  • address - (string) The URI of the Vault server. This can also be set via the VAULT_ADDR environment variable.
  • enabled - (bool) Enabled controls whether the Vault integration is active.
  • namespace - (string) Namespace is the Vault namespace to use for reading secrets. This can also be set via the VAULT_NAMESPACE environment variable.
  • renew_token - (bool) Renews the Vault token. This can also be set via the VAULT_RENEW_TOKEN environment variable.
  • tls - (tls block) TLS indicates the client should use a secure connection while talking to Vault. Supports the environment variables:
  • token - (string) Token is the Vault token to communicate with for requests. It may be a wrapped token or a real token. This can also be set via the VAULT_TOKEN environment variable, or via the VaultAgentTokenFile.
  • vault_agent_token_file - (string) The path of the file that contains a Vault Agent token. If this is specified, CTS will not try to renew the Vault token.
  • transport - (transport block) Transport configures the low-level network connection details.
  • unwrap_token - (bool) Unwraps the provided Vault token as a wrapped token.

Note: Vault credentials are not accessible by tasks and the associated Terraform configurations, including automated Terraform modules. If the task requires Vault, you will need to separately configure the Vault provider and explicitly include it in the task.providers list.

Multiple Provider Configurations

CTS supports the Terraform feature to define multiple configurations for the same provider by utilizing the alias meta-argument. Define multiple provider blocks with the same provider name and set the alias to a unique value across a given provider. Select which provider configuration to use for a task by specifying the configuration with the provider name and alias (<name>.<alias>) within the list of providers in the task.provider parameter. A task can use multiple providers, but only one provider instance of a provider is allowed per task.

The example CTS configuration below defines two similar tasks executing the same module with different instances of the AWS provider.

  1. terraform_provider "aws" {
  2. alias = "a"
  3. profile = "team-a"
  4. task_env {
  5. "AWS_ACCESS_KEY_ID" = "{{ env \"CTS_AWS_ACCESS_KEY_ID_A\" }}"
  6. }
  7. }
  8. terraform_provider "aws" {
  9. alias = "b"
  10. profile = "team-b"
  11. task_env {
  12. "AWS_ACCESS_KEY_ID" = "{{ env \"CTS_AWS_ACCESS_KEY_ID_B\" }}"
  13. }
  14. }
  15. terraform_provider "dns" {
  16. // ...
  17. }
  18. task {
  19. name = "task-a"
  20. module = "org/module"
  21. providers = ["aws.a", "dns"]
  22. // ...
  23. }
  24. task {
  25. name = "task-b"
  26. module = "org/module"
  27. providers = ["aws.b", "dns"]
  28. // ...
  29. }