DNS Management
The lab environment has a few DNS zones available for use.
This allows you to create DNS records pointing to floating IP addresses, to be able to use a hostname in your browser instead of an IP address.
Unfortunately the UI elements for it are unstable and don’t show up properly, so you can only configure them through CLI/Terraform.
There are a few zones available in the environment, you can list them with openstack zone list CLI command:
$ openstack zone list
+--------------------------------------+----------------------+---------+------------+--------+--------+
| id | name | type | serial | status | action |
+--------------------------------------+----------------------+---------+------------+--------+--------+
| c422c757-bdb6-457a-9a6d-7db256bf91c3 | iths.dsnw.dev. | PRIMARY | 1770909070 | ACTIVE | NONE |
| bb520124-cd96-4278-8bea-4f9aa626be90 | iths.darkclouds.xyz. | PRIMARY | 1771276799 | ACTIVE | NONE |
+--------------------------------------+----------------------+---------+------------+--------+--------+
iths.dsnw.devis an SSL-only DNS zone, meaning to use it in the browser for your webapp, it must be over HTTPSiths.darkclouds.xyzwill support both HTTP and HTTPS use, so this one is recommended
Below, will be examples of how to create DNS records with the CLI and Terraform:
CLI
In this example, we want to point the domain jonas.iths.darkclouds.xyz to my floating IP 198.18.1.151
We need to create a record set, with a record type A, TTL 30 seconds, the ID is used from the earlier openstack zone list command:
openstack recordset create --record 198.18.1.151 --type A --ttl 30 bb520124-cd96-4278-8bea-4f9aa626be90
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| action | CREATE |
| created_at | 2026-02-16T23:23:22.000000 |
| description | None |
| id | 51d52599-15f8-45b6-bd41-e78f3aff7556 |
| name | jonas.iths.darkclouds.xyz. |
| project_id | 8dab02a02b1644d3a46431bbe5a71346 |
| records | 198.18.1.151 |
| status | PENDING |
| ttl | 30 |
| type | A |
| updated_at | None |
| version | 1 |
| zone_id | bb520124-cd96-4278-8bea-4f9aa626be90 |
| zone_name | iths.darkclouds.xyz. |
+-------------+--------------------------------------+
Make sure to replace the name and the floating IP to your own!
We can verify whether the record exists with the following command:
openstack recordset list bb520124-cd96-4278-8bea-4f9aa626be90
+--------------------------------------+----------------------------+------+----------------------------------------------------------------+--------+--------+
| id | name | type | records | status | action |
+--------------------------------------+----------------------------+------+----------------------------------------------------------------+--------+--------+
| 7972213c-e7e0-4191-89ed-edd96a7586c2 | iths.darkclouds.xyz. | SOA | ns.lab.dsnw.dev. admin.0x00.lt. 1771284206 3555 600 86400 3600 | ACTIVE | NONE |
| f334ca6a-866b-4507-b96d-c86b4abb787f | iths.darkclouds.xyz. | NS | ns.lab.dsnw.dev. | ACTIVE | NONE |
| 51d52599-15f8-45b6-bd41-e78f3aff7556 | jonas.iths.darkclouds.xyz. | A | 198.18.1.151 | ACTIVE | NONE |
+--------------------------------------+----------------------------+------+----------------------------------------------------------------+--------+--------+
Keep in mind, this list will include records created by other students! Look for yours in the list and the status should be active.
You can also verify from your host by trying to ping the domain like so:
ping jonas.iths.darkclouds.xyz
PING jonas.iths.darkclouds.xyz (198.18.1.151) 56(84) bytes of data.
^C
--- jonas.iths.darkclouds.xyz ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
We can see our domain has been successfully resolved to our floating IP address! Once your application is running, you can access it over your domain name, instead of the IP like so: http://jonas.iths.darkclouds.xyz
Again, make sure to replace it with your own DNS name of choice!
Finally if you’d like to remove it, you need to use the Zone ID and your Record ID as argument, like so:
openstack recordset delete bb520124-cd96-4278-8bea-4f9aa626be90 51d52599-15f8-45b6-bd41-e78f3aff7556
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| action | DELETE |
| created_at | 2026-02-16T23:23:22.000000 |
| description | None |
| id | 51d52599-15f8-45b6-bd41-e78f3aff7556 |
| name | jonas.iths.darkclouds.xyz. |
| project_id | 8dab02a02b1644d3a46431bbe5a71346 |
| records | 198.18.1.151 |
| status | PENDING |
| ttl | 30 |
| type | A |
| updated_at | 2026-02-16T23:31:15.000000 |
| version | 2 |
| zone_id | bb520124-cd96-4278-8bea-4f9aa626be90 |
| zone_name | iths.darkclouds.xyz. |
+-------------+--------------------------------------+
Terraform
Terraform works similarly, here’s an example code:
data "openstack_dns_zone_v2" "iths-darkclouds-xyz" {
name = "iths.darkclouds.xyz."
}
resource "openstack_dns_recordset_v2" "jonas-iths-darkclouds-xyz" {
zone_id = data.openstack_dns_zone_v2.iths-darkclouds-xyz.id
name = "jonas.iths.darkclouds.xyz."
ttl = 30
type = "A"
records = ["198.18.1.151"]
}
Note the dots at the end of values for name in both resources!
You can also reference floating IP resources in records value directly:
data "openstack_dns_zone_v2" "iths-darkclouds-xyz" {
name = "iths.darkclouds.xyz."
}
resource "openstack_dns_recordset_v2" "jonas-iths-darkclouds-xyz" {
zone_id = data.openstack_dns_zone_v2.iths-darkclouds-xyz.id
name = "jonas.iths.darkclouds.xyz."
ttl = 30
type = "A"
records = [openstack_networking_floatingip_v2.tf-vm-1-fip.address]
}
Terraform verifies the record by itself, but you can still use ping or openstack recordset list command to verify it’s existence!