Templating and Property Toolkit
Use Templating and Property Toolkit features in Terraform
7 minute read
Refer to Getting started for prerequisites, resources and more.
After configuring the OneFuse Provider, it is recommended to set up Resource(s), Data Source(s), Variable(s) and Output(s).
When using OneFuse modules within Terraform Modules, it is a best practice to separate configurations into identifiable files.
For example, if you are using OneFuse modules with vSphere in a Terraform Module, the following structure is recommended:
| File name | Description |
|---|---|
main.tf |
The main file where you define providers, etc. |
onefuse.tf |
OneFuse Module configurations. |
[filename].tfvars |
template_properties for OneFuse Modules |
properties.tf |
OneFuse Property Toolkit configurations. |
vsphere.tf |
vSphere configurations. |
variables.tf |
Terraform inputs. |
output.tf |
Terraform outputs. |
Call Data Sources for all OneFuse Modules and fetch OneFuse Property Set(s) that are desired.
// *********************
// SAMPLE
// *********************
// Data Source for OneFuse Property Set, lookup Property Set ID by name
// - Our example OneFuse Property Set: ps01 has the following properties:
// {
// "someKey": "someValue",
// "parent": {
// "someNestedKey": "someNestedValue"
// },
//. "someTemplateKey": "{{ my_template_var }}"
// }
data "onefuse_property_set" "ps01" {
name = "default"
}
// Data Source for rendering OneFuse Templates
data "onefuse_rendered_template" "env" {
template = "{{env}}"
template_properties = {"env": "prod"}
}
// Data Source for rendering OneFuse Template within a Property Set
data "onefuse_rendered_template_ps01" "rendered_ps01_template" {
template = data.onefuse_property_set.ps01.raw
template_properties = {"my_template_var": "Hello World"}
}
// Data Source for OneFuse Ansible Tower Policy, lookup the Policy ID by name
data "onefuse_ansible_tower_policy" "policy" {
name = "default"
}
// Data Source for OneFuse DNS Policy, lookup the Policy ID by name
data "onefuse_dns_policy" "policy" {
name = "default"
}
// Data Source for OneFuse IPAM Policy, lookup the Policy ID by name
data "onefuse_ipam_policy" "policy" {
name = "default"
}
// Data Source for OneFuse Naming Policy, lookup the Policy ID by name
data "onefuse_naming_policy" "policy" {
name = "default"
}
// Data Source for OneFuse Microsoft AD Policy, lookup the Policy ID by name
data "onefuse_ad_policy" "policy" {
name = "default"
}
// Data Source for OneFuse Scripting Policy, lookup the Policy ID by name
data "onefuse_scripting_policy" "policy" {
name = "default"
}
// Data Source for OneFuse ServiceNow CMDB Policy, lookup the Policy ID by name
data "onefuse_servicenow_cmdb_policy" "policy" {
name = "default"
}
Create a Resource for each OneFuse Modules and configure them to work together. The Terraform Resource describes and declares the OneFuse Module’s Policy and its settings.
// *********************
// SAMPLE
// *********************
// Resource for OneFuse Naming Record
resource "onefuse_naming" "name" {
naming_policy_id = data.onefuse_naming_policy.policy.id
template_properties = var.template_properties
}
// Resource for OneFuse Microsoft AD Record
resource "onefuse_microsoft_ad_computer_account" "computer" {
name = onefuse_naming.name.name //Use Name Record
policy_id = data.onefuse_ad_policy.policy.id
template_properties = var.template_properties
}
// Resource for OneFuse IPAM Record
resource "onefuse_ipam_record" "ipam-record" {
hostname = onefuse_naming.name.name //Use Name Record
policy_id = data.onefuse_ipam_policy.policy.id
template_properties = var.template_properties
lifecycle {
ignore_changes = [
hostname,
dns_suffix
]
}
}
// Resource for OneFuse DNS Record
resource "onefuse_dns_record" "dns-record" {
name = onefuse_naming.name.name //Use Name Record
policy_id = data.onefuse_dns_policy.policy.id
zones = [onefuse_naming.name.dns_suffix]
value = onefuse_ipam_record.ipam-record.ip_address //Use IPAM Record
template_properties = var.template_properties
}
// Resource for OneFuse Ansible Tower
resource "onefuse_ansible_tower_deployment" "at-deployment" {
policy_id = data.onefuse_ansible_tower_policy.policy.id
workspace_url = var.workspace_url
limit = "*" // Ansible Tower Policy Limit
hosts = [onefuse_naming.name.name] // Hosts to run the policy against, Use Name Record
template_properties = var.template_properties
timeouts {
create = "12m"
delete = "3m"
}
}
// Resource for OneFuse Scripting
resource "onefuse_scripting_deployment" "scripting-deployment" {
policy_id = data.onefuse_scripting_policy.policy.id
workspace_url = var.workspace_url
template_properties = var.template_properties
}
// Resource for ServiceNow CMDB
resource "onefuse_servicenow_cmdb_deployment" "servicenow-cmdb-deployment" {
policy_id = data.onefuse_servicenow_cmdb_policy.policy.id
workspace_url = var.workspace_url
template_properties = var.template_properties
}
In the Resource samples above, template_properties are referring to a Variable. For best practices, keep all defined variables in a variables.tf file.
// *********************
// SAMPLE
// *********************
variable "template_properties" {
type = map
default = {
"nameEnvironment" = "p"
"nameOS" = "w"
"nameApplication" = "ap"
"nameLocation" = "atl"
"nameCompliance" = "pci"
"ouEnvironment" = "production"
"ouApplication" = "pwordpress"
"ouLocation" = "Atlanta"
"dnsSuffix" = "company.com"
}
}
To see outputs from OneFuse Modules, the following declarations are made to the configuration.
In the sample below, see how specific properties are referenced within a OneFuse Property Set.
// *********************
// SAMPLE
// *********************
// Property Set
// - Simple key:value pairs can be indexed in the `properties` attribute
output "ps01_someKey_value" {
value = data.onefuse_property_set.ps01.properties.someKey
}
// - Complex values (key:object or key:list) need to be JSON decoded in Terraform to access the nested properties
output "ps01_someNestedKey_value" {
value = jsondecode(data.onefuse_property_set.ps01.raw).parent.someNestedKey
}
// Rendered Templates
output "rendered_env" {
value = data.onefuse_rendered_template.env.value
}
// Rendered OneFuse Template within a Property Set
output "rendered_template" {
value = data.onefuse_rendered_template_ps01.rendered_ps01_template.value
}
// Naming
output "hostname" {
value = onefuse_naming.name.name
}
output "fqdn" {
value = onefuse_naming.name.id
}
// IPAM
output "ip_address" {
value = onefuse_ipam_record.ipam-record.ip_address
}
output "netmask" {
value = onefuse_ipam_record.ipam-record.netmask
}
output "gateway" {
value = onefuse_ipam_record.ipam-record.gateway
}
output "network" {
value = onefuse_ipam_record.ipam-record.network
}
output "subnet" {
value = onefuse_ipam_record.ipam-record.subnet
}
// DNS
output "primary_dns" {
value = onefuse_ipam_record.ipam-record.primary_dns
}
output "secondary_dns" {
value = onefuse_ipam_record.ipam-record.secondary_dns
}
// Microsoft Active Directory
output "ad_ou" {
value = onefuse_microsoft_ad_computer_account.computer.final_ou
}
After piecing the plan together, perform the following Terraform commands to invoke OneFuse Modules:
Complete the plan with Data Source(s), Resource(s) and Variable(s) and Output(s)
Sample variables.tf file:
//OneFuse Provider Inputs
variable "onefuse_scheme" {
type = string
default = "https"
}
variable "onefuse_address" {
type = string
}
variable "onefuse_port" {
type = string
default = 443
}
variable "onefuse_user" {
type = string
}
variable "onefuse_password" {
type = string
}
variable "onefuse_verify_ssl" {
type = bool
default = false
}
variable "workspace_url" {
type = string
default = "" // Default
}
// OneFuse template_properties
variable "template_properties" {
type = map
default = {
"nameEnvironment" = "p"
"nameOS" = "w"
"nameApplication" = "ap"
"nameLocation" = "atl"
"nameCompliance" = "pci"
"ouEnvironment" = "production"
"ouApplication" = "pwordpress"
"ouLocation" = "Atlanta"
"dnsSuffix" = "company.com"
}
}
Sample completed plan:
// OneFuse Terraform Provider
terraform {
required_providers {
onefuse = {
source = "CloudBoltSoftware/onefuse"
version = ">= 1.40.0"
}
}
required_version = ">= 0.13"
}
// Inititalize OneFuse Provider
provider "onefuse" {
scheme = var.onefuse_scheme
address = var.onefuse_address
port = var.onefuse_port
user = var.onefuse_user
password = var.onefuse_password
verify_ssl = var.onefuse_verify_ssl
}
// Data Source for OneFuse DNS Policy, lookup the Policy ID by name
data "onefuse_dns_policy" "policy" {
name = "default"
}
// Data Source for OneFuse IPAM Policy, lookup the Policy ID by name
data "onefuse_ipam_policy" "policy" {
name = "default"
}
// Data Source for OneFuse Naming Policy, lookup the Policy ID by name
data "onefuse_naming_policy" "policy" {
name = "default"
}
// Data Source for OneFuse Microsoft AD Policy, lookup the Policy ID by name
data "onefuse_ad_policy" "policy" {
name = "default"
}
// Resource for OneFuse Naming Record
resource "onefuse_naming" "name" {
naming_policy_id = data.onefuse_naming_policy.policy.id
template_properties = var.template_properties
}
// Resource for OneFuse Microsoft AD Record
resource "onefuse_microsoft_ad_computer_account" "computer" {
name = onefuse_naming.name.name //Use Name Record
policy_id = data.onefuse_ad_policy.policy.id
template_properties = var.template_properties
}
// Resource for OneFuse IPAM Record
resource "onefuse_ipam_record" "ipam-record" {
hostname = onefuse_naming.name.name //Use Name Record
policy_id = data.onefuse_ipam_policy.policy.id
template_properties = var.template_properties
lifecycle {
ignore_changes = [
hostname,
dns_suffix
]
}
}
// Resource for OneFuse DNS Record
resource "onefuse_dns_record" "dns-record" {
name = onefuse_naming.name.name //Use Name Record
policy_id = data.onefuse_dns_policy.policy.id
zones = [onefuse_naming.name.dns_suffix]
value = onefuse_ipam_record.ipam-record.ip_address //Use IPAM Record
template_properties = var.template_properties
}
// Naming
output "hostname" {
value = onefuse_naming.name.name
}
output "fqdn" {
value = onefuse_naming.name.id
}
// IPAM
output "ip_address" {
value = onefuse_ipam_record.ipam-record.ip_address
}
output "netmask" {
value = onefuse_ipam_record.ipam-record.netmask
}
output "gateway" {
value = onefuse_ipam_record.ipam-record.gateway
}
output "network" {
value = onefuse_ipam_record.ipam-record.network
}
output "subnet" {
value = onefuse_ipam_record.ipam-record.subnet
}
// DNS
output "primary_dns" {
value = onefuse_ipam_record.ipam-record.primary_dns
}
output "secondary_dns" {
value = onefuse_ipam_record.ipam-record.secondary_dns
}
// Microsoft Active Directory
output "ad_ou" {
value = onefuse_microsoft_ad_computer_account.computer.final_ou
}
Initialize the working directory via Command: init
terraform init
Create the execution plan via Command: plan
terraform plan
Execute the actions proposed in the Terraform plan via Command: apply
terraform apply
Destroy all of the remote objects managed by the Terraform configuration when no longer needed.
Destroy via Command: destroy
terraform destroy
Terraform import is a command used in Terraform to bring existing infrastructure under Terraform’s management. This allows you to manage resources that were created outside of Terraform or manually, without having to recreate them.
Import via Command: import
terraform import <resource_type>.<resource_name> <resource_id>
Use Templating and Property Toolkit features in Terraform
Create the Ansible Tower Resource in Terraform to run Ansible Tower Job Templates
Create the DNS Resource in Terraform to register and release DNS Records
Create the IPAM Resource in Terraform to reserve and release IP Addresses
Create the Microsoft Active Directory Resource in Terraform to create and delete Computer Accounts
Create the Naming Resource in Terraform to generate and destroy Names
Create the Pluggable Module Resource in Terraform to run Pluggable Module Policies
Create the Scripting Resource in Terraform to execute Scripts
Create the ServiceNow CMDB Resource in Terraform to create and consume ServiceNow “CIs-as-a-Service”
Configure and use the OneFuse VMware Aria Automation module with HashiCorp Terraform