# Ansible Tower

> Create the Ansible Tower Resource in Terraform to run Ansible Tower Job Templates

---

Site [llms.txt](/llms.txt)

---

To learn more about this OneFuse module, refer to [Ansible Tower](/docs/onefuse/configure/modules/ansible-tower/).

## Prerequisites

1. [Configure the OneFuse Provider](/docs/onefuse/consume/hashicorp-terraform/getting-started/#configure-the-onefuse-provider)
1. Review an overview on [OneFuse Modules](/docs/onefuse/consume/hashicorp-terraform/modules/) with Terraform

## Steps

1. Create `variables.tf` file
1. Create `main.tf` file
1. Run terraform commands to deploy a OneFuse Ansible Tower Deployment and run Provision Job Template(s):
   1. `terraform init`
   1. `terraform plan`
   1. `terraform apply`
1. Run terraform command to destroy OneFuse Ansible Tower Deployment and run Deprovision Job Template(s), if any:
   - `terraform destroy`

---

### Create variables.tf

Add the following in the `variables.tf` file. Update the values as needed.

<div class="alert alert-info" role="alert">


It is a best practice to separate configurations into identifiable files, refer to [Best practices for OneFuse modules](/docs/onefuse/consume/hashicorp-terraform/modules/#best-practices-for-onefuse-modules).

The sample below shows all configurations in one `variables.tf` file for simplicity.
</div>


```hcl
// SAMPLE VARIABLES.TF FILE CONFIGURATIONS

variable "onefuse_scheme" {
  type    = string
  default = "https"
}

variable "onefuse_address" {
  type = string
}

variable "onefuse_port" {
  type    = string
  default = "443"
}

variable "onefuse_user" {
  type    = string
  default = "admin"
}

variable "onefuse_password" {
  type    = string
  default = "admin"
}

variable "onefuse_verify_ssl" {
  type    = bool
  default = false
}

variable "workspace_url" {
  type    = string
  default = ""              // Default
}

variable "template_properties" {
  type    = map
  default = {
    "Environment" = "d"     //p for production or d for development
    "Location"    = "w"     //e for East or w for West
    "Application" = "wp"    //wp for wordpress or iis for IIS
    "OS"          = "l"     //l for Linux or w for Windows
  }
}
```

---

### Create main.tf for Ansible Tower resource

Add the following in the `main.tf` file. Update the values as needed.

#### Parameter references

The following defines the function of each Ansible Tower specific parameter.

| Parameter Name | Required? | Notes |
| --- | --- | --- |
| `policy_id` | Required | OneFuse Module Policy ID (integer). |
| `workspace_url` | *Optional* | OneFuse Workspace URL path. Use `""` for the default workspace. |
| `template_properties` | *Optional* | Additional properties that are referenced within the Policy. |

**Ansible Tower specific parameters:**

| Parameter Name | Required? | Notes |
| --- | --- | --- |
| `limit` | *Optional* | Ansible Tower Policy Limit. Pattern matches hosts. For example, `dev-*` will match all hosts that start with "dev-". |
| `hosts` | *Optional* | List of specific hosts to execute against. Similar to `limit`, but will match against exact hostnames. |
| `timeouts` | *Optional* | Timeout (in minutes) for create and/or delete operations. *(See timeouts block example below.)* |

Timeouts block example:

```hcl
timeouts {
  create = "20m"
  delete = "20m"
}
```

#### Sample main.tf

```hcl
// Terraform OneFuse Provider
terraform {
  required_providers {
    onefuse = {
      source  = "CloudBoltSoftware/onefuse"
      version = ">= 1.50.2"
   }
  }
  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 Ansible Tower Policy - lookup Policy ID by Policy Name
data "onefuse_ansible_tower_policy" "ansible_tower_policy" {
  name = "my_policy_name"  // Replace with Policy Name
}

// Resource for Ansible Tower
resource "onefuse_ansible_tower_deployment" "my_ansible_tower_deployment" {
  policy_id           = data.onefuse_ansible_tower_policy.ansible_tower_policy.id // Refers to Data Source to get Policy ID
  workspace_url       = ""
  template_properties = var.template_properties
  limit               = "..."
  hosts               = ["host1", "host2"]
  timeouts {
    create    = "20m"
    delete    = "20m"
  }
}

// Outputs for Resource
locals {
  fqdn = "localhost" //fqdn = format("%s.%s", var.hostname, var.dns_suffix)
}

output "ansible_output" {
  value = jsondecode(onefuse_ansible_tower_deployment.my_ansible_tower_deployment.provisioning_job_results)
}

output "ansible_hosts" {
  value = onefuse_ansible_tower_deployment.my_ansible_tower_deployment.hosts
}

output "ansible_inventory" {
  value = onefuse_ansible_tower_deployment.my_ansible_tower_deployment.inventory_name
}
```

---

### OneFuse module: Ansible Tower import

#### Create main.tf for Ansible resource import

Add the following in the `main.tf` file.

The following parameter is required to import an Ansible object.

**Ansible Tower specific parameters:**

| Parameter Name | Required? | Notes |
| --- | --- | --- |
| `policy_id` | *Required* | OneFuse Module Policy ID (integer). |

#### Sample main.tf

```hcl
// Terraform OneFuse Provider
terraform {
  required_providers {
    onefuse = {
      source  = "CloudBoltSoftware/onefuse"
      version = ">= 1.50.2"
   }
  }
  required_version = ">= 0.13"
}


// Inititalize OneFuse Provider
// Create the separate variables.tf file or hard code the values.
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
}

resource "onefuse_ansible_tower_deployment" "my_ansible_tower_deployment" {
  policy_id       = 1
}
```

Run the following command to import the OneFuse Ansible resource.

```bash
terraform import <resource_type>.<resource_name> <resource_id>
terraform import onefuse_ansible_tower_deployment.my_ansible_tower_deployment 2
```
