tf.ps1

<#PSScriptInfo
.VERSION 1.10
.GUID fde96073-cd23-48f2-b85a-1b39d52777e8
.AUTHOR Dave Farinelli
.LICENSEURI https://www.gnu.org/licenses/gpl-3.0.en.html
.PROJECTURI https://github.com/dfar-io/terraform-helper
#>


<#
.DESCRIPTION
 This Terraform helper allows for quickly using Terraform with different backend
 configurations for different projects.
#>


param (
  [Parameter(Mandatory = $True)]
  [string]$command,

  [Parameter(Mandatory = $True)]
  [string]$env
)

$availableCommands = @(
  "apply", "destroy", "create"
)

function IsValidCommand {
  param (
    [Parameter(Mandatory = $True)]
    [string]$command
  )

  return $availableCommands.Contains($command)
}

function DoesTFDirExist {
  return Test-Path "./tf/"
}

function DoesEnvExist {
  return ((Test-Path "./tf/$env.beconf.tfvars") -and
    (Test-Path "./tf/$env.tfvars") -and
    (Test-Path "./tf/$env.secrets.tfvars"))
}

function CreateEnv {
  function CreateIfNotExists {
    param (
      [Parameter(Mandatory = $True)]
      [string]$path,

      [Parameter(Mandatory = $True)]
      [string]$name,

      [string]$value
    )

    if ($false -eq (Test-Path "$path$name")) {
      New-Item -Path $path -Name $name -ItemType "file" -Value $value | Out-Null
      Write-Output "$path$name created."
    }
  }

  CreateIfNotExists "./tf/" "$env.beconf.tfvars"
  CreateIfNotExists -path "./tf/" -name "$env.tfvars" -value "env = `"$env`""
  CreateIfNotExists "./tf/" "$env.secrets.tfvars"
}

function CreateTfFolder {
  WaitForPrompt("tf/ does not exist, create?")
  New-Item -Path ./tf/ -ItemType "directory" | Out-Null
  Write-Output "$path$name created."
}

function WaitForPrompt($prompt) {
  do {
    $value = Read-Host "$prompt ('y' to continue, Ctrl-C to quit)"
  }
  while ($value -notmatch 'y')
}

################################################################################

if ($false -eq (IsValidCommand $command)) {
  Write-Error "Invalid command - currently supported commands are: `
  ${availableCommands}"

  exit 1
}

if ($command -eq "create") {
  if ($false -eq (DoesTFDirExist)) {
    CreateTfFolder
  }

  CreateEnv
  Write-Output "$env environment created, please configure .tfvars files and `
    run the 'apply' command."

  exit 0
}

if ($false -eq (DoesTFDirExist)) {
  Write-Error "tf/ directory does not exist, ensure you are in the correct `
    project and the project has a tf/ directory."

  exit 1
}

if ($false -eq (DoesEnvExist)) {
  Write-Error "Environment configuration doesn't exist (.beconf.tfvars, `
    .tfvars, and .secrets.tfvars). Ensure the environment is entered correctly."

  exit 1
}

terraform init -backend-config="tf/$env.beconf.tfvars" .\tf
terraform $command -var-file="tf\$env.tfvars" -var-file="tf\$env.secrets.tfvars" .\tf