Octopus.Script exported 2015-11-27 by timhunt303 belongs to ‘Dyn’ category.
Creates an A record in the specified zone with the specified details.
NOTE: The API User MUST have the follow permissions: - UserLogin - UserChangepw - RecordAdd - RecordUpdate - RecordGet - ZoneGet - ZoneAddNode - ZonePublish - ZoneChangeset
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Dyn Customer Name
dynCustomerName
The Dyn customer name, usually the company name
Dyn User Name
dynUserName
User Name of the user that will perform this step
NOTE: The API User MUST have the follow permissions: - UserLogin - UserChangepw - RecordAdd - RecordUpdate - RecordGet - ZoneGet - ZoneAddNode - ZonePublish - ZoneChangeset
Password
dynPassword
Password of the user to access Dyn
Dyn Zone
dynZone
The name of the Zone, where you want the A record to be created
For example: myzone.com
Fully Qualified Domain Name
dynFQDN
The name of the A record that is being created in Fully Qualified Domain Name format
For example: newrecord.myzone.com
Time to Live
dynCorrectTTL = 0
Limits the lifespan or lifetime of data in a computer network
IPv4 Address
dynCorrectIPAddress
The IPv4 address of the new A record
Script body
Steps based on this template will execute the following PowerShell script.
#--------------------------------------------------------------------
#Log In Variables
$dynLogInURI = "https://api.dynect.net/REST/Session/"
$dynCustomerName = $OctopusParameters["dynCustomerName"]
$dynUserName = $OctopusParameters["dynUserName"]
$dynPassword = $OctopusParameters["dynPassword"]
#--------------------------------------------------------------------
#Get A Record Variables
$dynARecordURI = "https://api.dynect.net/REST/ARecord"
$dynZone = $OctopusParameters["dynZone"]
$dynFQDN = $OctopusParameters["dynFQDN"]
#--------------------------------------------------------------------
#A Record information to check
$createNewARecord = $FALSE
$UpdateARecord = $FALSE
$dynCorrectTTL = $OctopusParameters["dynCorrectTTL"]
$dynCorrectIPAddress = $OctopusParameters["dynCorrectIPAddress"]
#--------------------------------------------------------------------
#Publish Zone Variables
$dynPublishURI = "https://api.dynect.net/REST/Zone"
$publishZone = $FALSE
Write-Output "`n-------------------------`n"
#--------------------------------------------------------------------
#Log In and Retrieve Token for this session
Write-Output "Logging into Dyn and retrieving session Authentication Token."
$dynCredentials = @{}
$dynCredentials.Add("customer_name", $dynCustomerName)
$dynCredentials.Add("user_name", $dynUserName)
$dynCredentials.Add("password", $dynPassword)
$dynCredentialsJSON = ConvertTo-Json -InputObject $dynCredentials
$dynLoginResults = Invoke-RestMethod -Uri $dynLogInURI -Body $dynCredentialsJSON -ContentType 'application/json' -Method Post
if($dynLoginResults.status -ne "success")
{
Write-Error "Invalid Log In Details. Please try again." -ErrorId E4
}
else
{
Write-Output "`nLog in was successful."
}
$dynSessionToken = @{}
$dynSessionToken.Add("Auth-Token", $dynLoginResults.data.token)
Write-Output "`n-------------------------`n"
#--------------------------------------------------------------------
#Get A Record
Write-Output "Retrieving specified A record information.`n"
#get and search all records to get the correct record ID (not a unique id) for existing A Records
#this is done to check if a A Record does not exist already. This is the only way to do it without getting an error.
$dynAllRecordsURI = "https://api.dynect.net/REST/AllRecord/$dynZone"
$dynAllRecordResults = Invoke-RestMethod -Uri $dynAllRecordsURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get
for($i = 0; $i -lt $dynAllRecordResults.data.Length; $i++)
{
$a = $dynAllRecordResults.data.Get($i)
$result = $a.contains($dynFQDN)
if($result -eq $TRUE)
{
$dynARecordString = $dynAllRecordResults.data.Get($i)
$dynARecordExists = $TRUE
$i = $dynAllRecordResults.data.Length
}
else
{
$dynARecordExists = $FALSE
}
}
#checks to see if there is more than one A record with the same name.
if($dynARecordExists -eq $TRUE)
{
$dynARecordURI = "$dynARecordURI/$dynZone/$dynFQDN"
$dynARecordResults = Invoke-RestMethod -Uri $dynARecordURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get
if($dynARecordResults.data.Length -gt 1)
{
Write-Error "`nThere is more than one A record with the Fully Qualified Domain Name (FQDN) of $dynFQDN. `nThis script does not handle more than one A record witht the same FQDN" -ErrorId E1
}
if($dynARecordResults.status -ne "success")
{
Write-Error "Error occurred while trying to retrieve the A Record. Please check the host name and the Fully Qualified Domain Name are correct." -ErrorId E1
}
}
#Checks if the an A record was returned or needs to be created
if(($dynARecordResults.data.Length -eq 0) -or ($dynARecordExists -eq $FALSE))
{
$createNewARecord = $TRUE
Write-Warning "$dynFQDN does not exists. Creating $dynFQDN now."
}
else
{
#get information for the specified record
$dynARecordString = $dynARecordResults.data
$dynARecordURI = "https://api.dynect.net$dynARecordString/"
$dynARecord = Invoke-RestMethod -Uri $dynARecordURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get
$dynARecord = $dynARecord.data
Write-Output "`n$dynFQDN has successfully been retrieved."
Write-Output "`n-------------------------`n"
}
#--------------------------------------------------------------------
#create new A record
if($createNewARecord -eq $TRUE)
{
$dynCreateURI = "https://api.dynect.net/REST/ARecord/$dynZone/$dynFQDN"
$rData = @{}
$rData.Add("address", $dynCorrectIPAddress)
$dynCreateARecord = @{}
$dynCreateARecord.Add("ttl", $dynCorrectTTL)
$dynCreateARecord.Add("rdata", $rData)
$dynCreateARecordJSON = ConvertTo-Json -InputObject $dynCreateARecord
$dynCreateResult = Invoke-RestMethod -Uri $dynCreateURI -ContentType 'application/json' -Headers $dynSessionToken -Body $dynCreateARecordJSON -Method Post
if($dynCreateResult.status -ne "success")
{
Write-Error "An error occurred while creating the new A Record. Please check the details that have been entered are correct and try again." -ErrorId E4
}
else
{
Write-Output "$dynFQDN has successfully been added to the $dynZone zone in Dyn."
$publishZone = $TRUE
}
Write-Output "`n-------------------------`n"
}
#--------------------------------------------------------------------
#checking specified A Record to see if it is correct if it exists
if($createNewARecord -eq $FALSE)
{
Write-Output "Checking to see if $dynFQDN is current and contains the correct information."
if($dynARecord.rdata.address -ne $dynCorrectIPAddress)
{
$UpdateARecord = $TRUE
Write-Warning "`n$dynFQDN is out of date. Updating now"
}
if($UpdateARecord -eq $FALSE)
{
Write-Output "`n$dynFQDN is up-to-date"
}
Write-Output "`n-------------------------`n"
}
#--------------------------------------------------------------------
#Update A record
if($UpdateARecord -eq $TRUE)
{
Write-Output "Updating $dynFQDN so that is matches the current information saved in the system."
$dynUpdateURI = $dynARecordURI
$rData = @{}
$rData.Add("address", $dynCorrectIPAddress)
$dynUpdatedARecord = @{}
$dynUpdatedARecord.Add("ttl", $dynCorrectTTL)
$dynUpdatedARecord.Add("rdata", $rData)
$dynUpdatedARecord = ConvertTo-Json -InputObject $dynUpdatedARecord
$dynUpdateResult = Invoke-RestMethod -Uri $dynUpdateURI -ContentType 'application/json' -Headers $dynSessionToken -Body $dynUpdatedARecord -Method Put
if($dynUpdateResult.status -ne "success")
{
Write-Error "An error occured while trying to update the $dynFQDN record"
}
else
{
Write-Output "`nUpdate was successful. Just needs to be published to make it offical."
$publishZone = $TRUE
}
Write-Output "`n-------------------------`n"
}
#--------------------------------------------------------------------
#publish update or creation of A Record
if($publishZone -eq $TRUE)
{
Write-Output "Publishing changes made to $dynZone"
$publish = @{}
$publish.Add("publish", 'true')
$publish = ConvertTo-Json -InputObject $publish
$dynPublishURI = "$dynPublishURI/$dynZone/"
$dynPublishResults = Invoke-RestMethod -Uri $dynPublishURI -ContentType 'application/json' -Headers $dynSessionToken -Body $publish -Method Put
if($dynPublishResults.status -ne "success")
{
Write-Error "An error occurred during the publication of the $dynZone zone." -ErrorId E4
}
else
{
Write-Output "`n$dynZone has successfully been published."
}
Write-Output "`n-------------------------`n"
}
#--------------------------------------------------------------------
#Log Out of session
Write-Output "Logging out and deleting this session's authentication token"
$dynLogOutResults = Invoke-RestMethod -Uri $dynLogInURI -ContentType 'application/json' -Headers $dynSessionToken -Method Delete
While(($dynLogOutResults.status -ne "success") -and ($tries -lt 10))
{
Write-Output "`nWaiting to log out of Dyn"
$tries++
Start-Sleep -Seconds 1
}
if($dynLogOutResults.status -eq "success")
{
$dynSessionToken.Clear()
Write-Output $dynSessionToken
Write-Output "`nThis session has been ended successfully and the authentication token has been deleted."
}
else
{
Write-Error "`nAn error occurred while logging out." -ErrorId E4
}
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "5e359c05-89a0-4a13-98a4-d54b0415bb45",
"Name": "Dyn - Create an A Record",
"Description": "Creates an A record in the specified zone with the specified details. \n\nNOTE: The API User MUST have the follow permissions:\n\t- UserLogin\n\t- UserChangepw\n\t- RecordAdd\n\t- RecordUpdate\n - RecordGet\n\t- ZoneGet\n\t- ZoneAddNode\n\t- ZonePublish\n\t- ZoneChangeset\n",
"Version": 1,
"ExportedAt": "2015-11-27T06:25:11.275+00:00",
"ActionType": "Octopus.Script",
"Author": "timhunt303",
"Parameters": [
{
"Name": "dynCustomerName",
"Label": "Dyn Customer Name",
"HelpText": "The Dyn customer name, usually the company name",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "dynUserName",
"Label": "Dyn User Name",
"HelpText": "User Name of the user that will perform this step\n\nNOTE: The API User MUST have the follow permissions:\n\t- UserLogin\n\t- UserChangepw\n\t- RecordAdd\n\t- RecordUpdate\n - RecordGet\n\t- ZoneGet\n\t- ZoneAddNode\n\t- ZonePublish\n\t- ZoneChangeset",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "dynPassword",
"Label": "Password",
"HelpText": "Password of the user to access Dyn",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Name": "dynZone",
"Label": "Dyn Zone",
"HelpText": "The name of the Zone, where you want the A record to be created\n\nFor example: myzone.com",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "dynFQDN",
"Label": "Fully Qualified Domain Name",
"HelpText": "The name of the A record that is being created in Fully Qualified Domain Name format\n\nFor example: newrecord.myzone.com",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "dynCorrectTTL",
"Label": "Time to Live",
"HelpText": "Limits the lifespan or lifetime of data in a computer network",
"DefaultValue": "0",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "dynCorrectIPAddress",
"Label": "IPv4 Address",
"HelpText": "The IPv4 address of the new A record",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "#--------------------------------------------------------------------\n#Log In Variables\n\n$dynLogInURI = \"https://api.dynect.net/REST/Session/\"\n\n$dynCustomerName = $OctopusParameters[\"dynCustomerName\"] \n\n$dynUserName = $OctopusParameters[\"dynUserName\"] \n\n$dynPassword = $OctopusParameters[\"dynPassword\"] \n\n#--------------------------------------------------------------------\n#Get A Record Variables\n\n$dynARecordURI = \"https://api.dynect.net/REST/ARecord\"\n\n$dynZone = $OctopusParameters[\"dynZone\"]\n\n$dynFQDN = $OctopusParameters[\"dynFQDN\"] \n\n#--------------------------------------------------------------------\n#A Record information to check\n\n$createNewARecord = $FALSE\n\n$UpdateARecord = $FALSE\n\n$dynCorrectTTL = $OctopusParameters[\"dynCorrectTTL\"]\n\n$dynCorrectIPAddress = $OctopusParameters[\"dynCorrectIPAddress\"] \n\n\n#--------------------------------------------------------------------\n#Publish Zone Variables\n\n$dynPublishURI = \"https://api.dynect.net/REST/Zone\"\n\n$publishZone = $FALSE\n\n\n\n\nWrite-Output \"`n-------------------------`n\"\n\n#--------------------------------------------------------------------\n#Log In and Retrieve Token for this session\n\nWrite-Output \"Logging into Dyn and retrieving session Authentication Token.\"\n\n$dynCredentials = @{}\n\n$dynCredentials.Add(\"customer_name\", $dynCustomerName)\n$dynCredentials.Add(\"user_name\", $dynUserName)\n$dynCredentials.Add(\"password\", $dynPassword)\n\n$dynCredentialsJSON = ConvertTo-Json -InputObject $dynCredentials\n\n$dynLoginResults = Invoke-RestMethod -Uri $dynLogInURI -Body $dynCredentialsJSON -ContentType 'application/json' -Method Post\n\nif($dynLoginResults.status -ne \"success\")\n{\n Write-Error \"Invalid Log In Details. Please try again.\" -ErrorId E4\n}\nelse\n{\n Write-Output \"`nLog in was successful.\"\n}\n\n\n\n$dynSessionToken = @{}\n\n$dynSessionToken.Add(\"Auth-Token\", $dynLoginResults.data.token)\n\n\nWrite-Output \"`n-------------------------`n\"\n\n#--------------------------------------------------------------------\n#Get A Record \n\nWrite-Output \"Retrieving specified A record information.`n\"\n\n#get and search all records to get the correct record ID (not a unique id) for existing A Records\n#this is done to check if a A Record does not exist already. This is the only way to do it without getting an error.\n$dynAllRecordsURI = \"https://api.dynect.net/REST/AllRecord/$dynZone\"\n\n \n$dynAllRecordResults = Invoke-RestMethod -Uri $dynAllRecordsURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get \n\nfor($i = 0; $i -lt $dynAllRecordResults.data.Length; $i++)\n{\n \n $a = $dynAllRecordResults.data.Get($i)\n\n $result = $a.contains($dynFQDN)\n\n if($result -eq $TRUE)\n {\n $dynARecordString = $dynAllRecordResults.data.Get($i)\n\n $dynARecordExists = $TRUE\n\n $i = $dynAllRecordResults.data.Length\n }\n else\n {\n $dynARecordExists = $FALSE\n }\n}\n\n\n\n#checks to see if there is more than one A record with the same name.\nif($dynARecordExists -eq $TRUE)\n{\n $dynARecordURI = \"$dynARecordURI/$dynZone/$dynFQDN\" \n \n $dynARecordResults = Invoke-RestMethod -Uri $dynARecordURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get \n\n if($dynARecordResults.data.Length -gt 1)\n {\n Write-Error \"`nThere is more than one A record with the Fully Qualified Domain Name (FQDN) of $dynFQDN. `nThis script does not handle more than one A record witht the same FQDN\" -ErrorId E1\n }\n\n if($dynARecordResults.status -ne \"success\")\n {\n Write-Error \"Error occurred while trying to retrieve the A Record. Please check the host name and the Fully Qualified Domain Name are correct.\" -ErrorId E1\n }\n}\n\n\n\n#Checks if the an A record was returned or needs to be created\nif(($dynARecordResults.data.Length -eq 0) -or ($dynARecordExists -eq $FALSE))\n{\n $createNewARecord = $TRUE\n\n Write-Warning \"$dynFQDN does not exists. Creating $dynFQDN now.\"\n}\nelse\n{\n #get information for the specified record\n $dynARecordString = $dynARecordResults.data\n\n $dynARecordURI = \"https://api.dynect.net$dynARecordString/\"\n\n $dynARecord = Invoke-RestMethod -Uri $dynARecordURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get \n\n $dynARecord = $dynARecord.data\n\n Write-Output \"`n$dynFQDN has successfully been retrieved.\"\n \n Write-Output \"`n-------------------------`n\"\n\n}\n\n#--------------------------------------------------------------------\n#create new A record\n\nif($createNewARecord -eq $TRUE)\n{\n $dynCreateURI = \"https://api.dynect.net/REST/ARecord/$dynZone/$dynFQDN\" \n\n $rData = @{}\n\n $rData.Add(\"address\", $dynCorrectIPAddress)\n\n $dynCreateARecord = @{}\n\n $dynCreateARecord.Add(\"ttl\", $dynCorrectTTL)\n $dynCreateARecord.Add(\"rdata\", $rData)\n\n $dynCreateARecordJSON = ConvertTo-Json -InputObject $dynCreateARecord\n\n $dynCreateResult = Invoke-RestMethod -Uri $dynCreateURI -ContentType 'application/json' -Headers $dynSessionToken -Body $dynCreateARecordJSON -Method Post\n\n if($dynCreateResult.status -ne \"success\")\n {\n Write-Error \"An error occurred while creating the new A Record. Please check the details that have been entered are correct and try again.\" -ErrorId E4\n\n }\n else\n {\n Write-Output \"$dynFQDN has successfully been added to the $dynZone zone in Dyn.\"\n\n $publishZone = $TRUE\n }\n\n Write-Output \"`n-------------------------`n\"\n\n\n}\n\n\n\n#--------------------------------------------------------------------\n#checking specified A Record to see if it is correct if it exists\nif($createNewARecord -eq $FALSE)\n{\n Write-Output \"Checking to see if $dynFQDN is current and contains the correct information.\"\n\n if($dynARecord.rdata.address -ne $dynCorrectIPAddress)\n {\n $UpdateARecord = $TRUE\n\n Write-Warning \"`n$dynFQDN is out of date. Updating now\"\n\n }\n\n if($UpdateARecord -eq $FALSE)\n {\n Write-Output \"`n$dynFQDN is up-to-date\"\n }\n\n Write-Output \"`n-------------------------`n\"\n}\n#--------------------------------------------------------------------\n#Update A record\n\nif($UpdateARecord -eq $TRUE)\n{\n Write-Output \"Updating $dynFQDN so that is matches the current information saved in the system.\"\n\n $dynUpdateURI = $dynARecordURI\n\n $rData = @{}\n\n $rData.Add(\"address\", $dynCorrectIPAddress)\n\n $dynUpdatedARecord = @{}\n\n \n $dynUpdatedARecord.Add(\"ttl\", $dynCorrectTTL)\n $dynUpdatedARecord.Add(\"rdata\", $rData)\n\n $dynUpdatedARecord = ConvertTo-Json -InputObject $dynUpdatedARecord\n\n $dynUpdateResult = Invoke-RestMethod -Uri $dynUpdateURI -ContentType 'application/json' -Headers $dynSessionToken -Body $dynUpdatedARecord -Method Put\n \n if($dynUpdateResult.status -ne \"success\")\n {\n Write-Error \"An error occured while trying to update the $dynFQDN record\"\n }\n else\n {\n Write-Output \"`nUpdate was successful. Just needs to be published to make it offical.\"\n \n $publishZone = $TRUE\n\n }\n\n\n Write-Output \"`n-------------------------`n\"\n\n}\n\n#--------------------------------------------------------------------\n#publish update or creation of A Record\n\nif($publishZone -eq $TRUE)\n{\n\n Write-Output \"Publishing changes made to $dynZone\"\n\n $publish = @{}\n $publish.Add(\"publish\", 'true')\n\n $publish = ConvertTo-Json -InputObject $publish\n\n $dynPublishURI = \"$dynPublishURI/$dynZone/\"\n\n $dynPublishResults = Invoke-RestMethod -Uri $dynPublishURI -ContentType 'application/json' -Headers $dynSessionToken -Body $publish -Method Put\n\n if($dynPublishResults.status -ne \"success\")\n {\n Write-Error \"An error occurred during the publication of the $dynZone zone.\" -ErrorId E4\n }\n else\n {\n Write-Output \"`n$dynZone has successfully been published.\"\n }\n\n Write-Output \"`n-------------------------`n\"\n\n}\n\n\n\n\n#--------------------------------------------------------------------\n#Log Out of session\n\nWrite-Output \"Logging out and deleting this session's authentication token\"\n\n$dynLogOutResults = Invoke-RestMethod -Uri $dynLogInURI -ContentType 'application/json' -Headers $dynSessionToken -Method Delete\n\nWhile(($dynLogOutResults.status -ne \"success\") -and ($tries -lt 10))\n{\n Write-Output \"`nWaiting to log out of Dyn\"\n $tries++\n Start-Sleep -Seconds 1\n}\n\nif($dynLogOutResults.status -eq \"success\")\n{\n $dynSessionToken.Clear()\n Write-Output $dynSessionToken\n Write-Output \"`nThis session has been ended successfully and the authentication token has been deleted.\"\n \n}\nelse\n{\n Write-Error \"`nAn error occurred while logging out.\" -ErrorId E4\n}\n\n"
},
"Category": "Dyn",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/dyn-create-an-A-record.json",
"Website": "/step-templates/5e359c05-89a0-4a13-98a4-d54b0415bb45",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Friday, November 27, 2015