YAML !include Directive
|
|
=======================
|
|
|
|
The ``!include`` directive is a powerful feature in octoDNS that allows you to
|
|
reuse YAML content across multiple configuration files and zone files. This
|
|
helps reduce duplication and makes your DNS configuration more maintainable.
|
|
|
|
Overview
|
|
--------
|
|
|
|
The ``!include`` directive can be used anywhere in your YAML files to include
|
|
content from other files. Files are resolved relative to the directory
|
|
containing the file with the ``!include`` directive.
|
|
|
|
Basic Usage
|
|
-----------
|
|
|
|
Single File Include
|
|
...................
|
|
|
|
The simplest form includes the entire contents of a single file::
|
|
|
|
---
|
|
# main.yaml
|
|
common-config: !include common.yaml
|
|
|
|
If ``common.yaml`` contains::
|
|
|
|
---
|
|
key: value
|
|
setting: 42
|
|
|
|
Then ``common-config`` will be set to ``{'key': 'value', 'setting': 42}``.
|
|
|
|
The included file can contain any valid YAML type: dictionaries, lists, strings,
|
|
numbers, or even ``null`` values.
|
|
|
|
Merge Syntax
|
|
............
|
|
|
|
The ``!include`` directive can also be used with the merge operator, ``<<:``.
|
|
This is useful for composing configurations from multiple sources.
|
|
|
|
Merging Dictionaries
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
When including multiple files that contain dictionaries, the dictionaries are
|
|
merged together. Later files override keys from earlier files::
|
|
|
|
---
|
|
# main.yaml
|
|
merged-config:
|
|
<<: !include base-config.yaml
|
|
<<: !include overrides.yaml
|
|
key: value
|
|
|
|
If ``base-config.yaml`` contains::
|
|
|
|
---
|
|
timeout: 30
|
|
retries: 3
|
|
debug: false
|
|
|
|
And ``overrides.yaml`` contains::
|
|
|
|
---
|
|
timeout: 60
|
|
debug: true
|
|
added: hi
|
|
|
|
Then ``merged-config`` will be::
|
|
|
|
{
|
|
'timeout': 60, # overridden
|
|
'retries': 3, # from base
|
|
'debug': true, # overridden
|
|
'added': 'hi', # added by overrides
|
|
'key': 'value', # from main
|
|
}
|
|
|
|
Use Cases
|
|
---------
|
|
|
|
Configuration Files
|
|
...................
|
|
|
|
The ``!include`` directive is useful in octoDNS configuration files for sharing
|
|
common provider settings, processor configurations, or zone settings.
|
|
|
|
Shared Provider Configuration::
|
|
|
|
---
|
|
# production.yaml
|
|
providers:
|
|
# contents will be merged with what's defined here
|
|
<<: !include providers/common.yaml
|
|
|
|
route53:
|
|
class: octodns_route53.Route53Provider
|
|
access_key_id: env/AWS_ACCESS_KEY_ID
|
|
secret_access_key: env/AWS_SECRET_ACCESS_KEY
|
|
# Include common retry/timeout settings
|
|
settings: !include providers/aws-settings.yaml
|
|
|
|
---
|
|
# providers/common.yaml
|
|
config:
|
|
class: octodns.providers.yaml.YamlProvider
|
|
directory: ./config/
|
|
|
|
internal:
|
|
class: octodns_powerdns.PdnsProvider
|
|
...
|
|
|
|
Shared Zone Configuration::
|
|
|
|
---
|
|
# config.yaml
|
|
zones:
|
|
# contents will become the value for example.com.
|
|
example.com.: &standard-setup !include zones/standard-setup.yaml
|
|
example.net.: *standard-setup
|
|
example.org.: *standard-setup
|
|
|
|
---
|
|
# zones/standard-ssetup.yaml
|
|
sources:
|
|
- config
|
|
targets:
|
|
- internal
|
|
- route53
|
|
|
|
Zone Files
|
|
..........
|
|
|
|
The ``!include`` directive is particularly powerful in zone files for reducing
|
|
duplication of common record configurations.
|
|
|
|
Shared APEX Records
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
When you have multiple zones with shared APEX records but differing records
|
|
otherwise, you can share the APEX configuration::
|
|
|
|
---
|
|
# example.com.yaml
|
|
'': !include common/apex.yaml
|
|
api:
|
|
type: A
|
|
value: 1.2.3.4
|
|
web:
|
|
type: A
|
|
value: 1.2.3.5
|
|
|
|
|
|
---
|
|
# common/apex.yaml
|
|
- type: A
|
|
value: 1.2.3.4
|
|
- type: MX
|
|
values:
|
|
- exchange: mail1.example.com.
|
|
preference: 10
|
|
- exchange: mail2.example.com.
|
|
preference: 20
|
|
- type: NS
|
|
values:
|
|
- 6.2.3.4.
|
|
- 7.2.3.4.
|
|
- type: TXT
|
|
values:
|
|
- some-domain-claiming-value=gimme
|
|
- v=spf1 -all
|
|
|
|
Subdirectories
|
|
..............
|
|
|
|
Files in subdirectories can be included using relative paths::
|
|
|
|
---
|
|
# main.yaml
|
|
nested-config: !include subdir/nested.yaml
|
|
deeper: !include subdir/another/deep.yaml
|
|
parent: !include ../sibling/config.yaml
|
|
|
|
Type Requirements
|
|
-----------------
|
|
|
|
Any valid YAML datatype can be used in the basic **!include** stile.
|
|
|
|
When using the merge syntax all files must contain **dictionaries**.
|
|
|
|
network: !include providers/retry-settings.yaml
|
|
|
|
Best Practices
|
|
--------------
|
|
|
|
1. **Organize shared files**: Create a dedicated directory structure for shared
|
|
configurations (e.g., ``shared/``, ``common/``)
|
|
|
|
2. **Use descriptive filenames**: Name included files clearly to indicate their
|
|
purpose (e.g., ``spf-record.yaml``, ``geo-routing-rules.yaml``)
|
|
|
|
3. **Keep includes shallow**: Avoid deeply nested includes as they can make
|
|
the configuration harder to understand and debug
|
|
|
|
4. **Document shared files**: Add comments in shared files explaining their
|
|
purpose and where they're used
|