Platform Metadata
OpsCtl uses a custom META.yml file, to be located at the root of your Git deployment project codebase to describe all of the project's metadata. It describes multiple things related to platform usage, infrastructure provider and access settings, secrets management, licensing and suport information and application version, domain information and such ...
This further allows OpsCtl to wrap around many third-party tools usage to determine exactly how to interact with your system when it comes to deployment and maintenance options.
A typical project deployment tree structure would be the following:
$ tree -L 1
.
├── META.yml <- the project metadata file
├── ansible <- folder with ansible-specifics platform configuration settings
└── terraform <- folder with terraform-specifics platform configuration settings
Metadata File Generation
The platform metadata file is pure YAML, as described in the following section.
It's generation might be long and complex and that's why OpsCtl comes with an automatic generation utility:
$ opsctl meta -i
will prompt you with an interactive CLI to help you render your first metadata file from template.
Further calls to:
$ opsctl meta
will provide syntax and sanity checks ensuring that whatever you could have edited the file with remains compatible.
Metadata File Format
The following table provides an exhaustive list of all supported YAML fields and parameters:
| Parameter | Type | Required | Default | Description or example |
|---|---|---|---|---|
| customer.name | string | yes | '' | free text, e.g. ACME |
| customer.region | string | yes | '' | US-WEST, US-EAST, CALA, EMEA, APAC |
| customer.country | string | yes | '' | free text, e.g. France, USA |
| infra.cc | string | no | '' | free text, cost center |
| infra.cost.price | float64 | no | '' | numeric value |
| infra.cost.currency | string | yes | '' | free text, e.g. EUR, USD |
| infra.provider | string | yes | '' | ali, aws, azure, gcp, kowabunga, onprem, ovh |
| infra.dch | bool | yes | false | Dalet Cloud Hosted ? |
| infra.remote_access | string | yes | '' | bastion, customer-vpn, netgate, netgate-apac, netgate-emea, netgate-na, rdp |
| infra.remote_details | string | no | '' | URL link with instructions and details regarding remote access |
| infra.satellite | bool | no | false | Does environment has satellite nodes ? (hybrid environment) |
| aws.region | string | no | '' | free text, e.g. us-east-1 |
| aws.role_arn | string | no | '' | free text, e.g. arn:aws:iam::123456789:role/admin |
| azure.resource_group | string | no | '' | free text |
| kowabunga.endpoint | string | no | '' | Kowabunga API endpoint URL |
| kowabunga.owner | string | no | '' | free text, platform owner name |
| kowabunga.email | string | no | '' | free text, platform owner email |
| kowabunga.region | string | no | '' | free text, platform region |
| requirement.ansible.min_version | string | no | '' | free text, minimum Ansible version to deploy with |
| requirement.ansible.version | string | no | '' | free text, default Ansible version to deploy with (e.g. 2.12, 2.13 ...) |
| requirement.terraform.version | string | no | '' | free text, default Terraform version to deploy with |
| product.name | string | yes | '' | amberfin, atlas, brio, control-tower, cubeng, flex, galaxy, iris, kvirt, mediacortex, pyramid |
| product.license | string | yes | '' | perpetual, subscription, demo |
| product.support_level | string | yes | '' | none, starter, plus, ultimate |
| product.monitored.enabled | bool | yes | false | Is platform Dalet-monitored (Managed Services plan) ? |
| product.monitored.control_tower | bool | yes | false | Is platform connected to Dalet Control Tower ? |
| secrets.provider | string | yes | '' | aws, vault, file, input |
| secrets.sm.custom_profile | bool | no | false | Enabled when different from Dalet default one |
| secrets.sm.region | string | yes | '' | AWS region for Secrets Manager |
| secrets.sm.role_arn | string | no | false | AWS role ARN for Secrets Manager |
| secrets.id | string | yes | '' | Secrets key to be used |
| secrets.vault_key_suffix | string | no | ansible_vault | free text, none or environment tag |
| secrets.sops_created_at_suffix | string | no | sops_created_at | free text, can be none or environment tag |
| secrets.sops_public_key_suffix | string | no | sops_public_key | free text, can be none or environment tag |
| secrets.sops_secret_key_suffix | string | no | sops_secret_key | free text, can be none or environment tag |
| environments[].tag | string | yes | '' | free text, e.g. dev, prod ... |
| environments[].name | string | yes | '' | free text, e.g. 'flex-acme-prod' |
| environments[].description | string | yes | '' | free text, e.g. 'ACME Flex Production platform' |
| environments[].active | bool | yes | false | Is the platform active and maintained ? |
| environments[].version | string | yes | '' | Flex version, e.g. 2025.1.0 |
| environments[].fqdn.prefix | string | yes | '' | Platform FQDN prefix, e.g. 'flex' |
| environments[].fqdn.domain | string | yes | '' | Platform FQDN, e.g. 'acme.com |
| environments[].os.name | string | yes | Ubuntu | OS Name: Ubuntu, Devian, RedHat, Centos, AmazonLinux2 |
| environments[].os.version | string | yes | '' | OS version number |
| environments[].inventory.static | bool | yes | false | Do we host static or dynamic inventory file |
| environments[].pagerduty.enabled | bool | yes | false | Is platform connected to PagerDuty for alerting ? |
| environments[].pagerduty.service_id | bool | yes | false | PagerDuty service ID to be used |
| environments[].kubernetes.enabled | bool | no | false | Does the platform uses Kubernetes backend ? |
| environments[].kubernetes.type | string | no | '' | Which Kubernetes flavor are we using ? (auto, eks, gke, ack, aks, okgs, atlas ) |
| environments[].kubernetes.version | string | no | '' | Which Kubernetes version are we using ? |
| environments[].kubernetes.cluster | string | no | '' | Name of the Kubernetes cluster |
| environments[].kubernetes.controller.endpoint | string | no | '' | Public DNS endpoint used to reach out the Kubernetes cluster, if not auto-discovered |
| environments[].kubernetes.controller.master | string | no | '' | IP address of the master controller to pull user kubeconfigs from (Atlas use-case) |
| environments[].flex.urls.core | string | no | '' | Core Flex URL |
| environments[].flex.urls.grafana | string | no | '' | Grafana Flex URL |
| environments[].flex.urls.kibana | string | no | '' | Kibana Flex URL |
| environments[].flex.urls.prometheus | string | no | '' | Prometheus Flex URL |
| environments[].flex.urls.alertmanager | string | no | '' | AlertManager Flex URL |
| environments[].flex.transcode.enabled | bool | no | false | Does Flex platform uses FSP ? |
| environments[].flex.transcode.k8s_fsp | bool | no | false | Does Flex platform uses elastic FSP on Kubernetes ? |
| environments[].flex.dbaas | bool | no | false | Does Flex platform uses database-as-a-service ? |
| environments[].flex.lbaas | bool | no | false | Does Flex platform uses lad-balancer-as-a-service ? |