| @ -0,0 +1,290 @@ | |||||
| 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. | |||||
| Array Syntax | |||||
| ............ | |||||
| The ``!include`` directive also supports an array syntax to merge multiple files | |||||
| together. 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 | |||||
| - overrides.yaml | |||||
| 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 | |||||
| } | |||||
| Merging Arrays | |||||
| ~~~~~~~~~~~~~~ | |||||
| When including multiple files that contain arrays, the arrays are concatenated | |||||
| together:: | |||||
| --- | |||||
| # main.yaml | |||||
| all-values: !include | |||||
| - values-1.yaml | |||||
| - values-2.yaml | |||||
| If ``values-1.yaml`` contains:: | |||||
| --- | |||||
| - item1 | |||||
| - item2 | |||||
| And ``values-2.yaml`` contains:: | |||||
| --- | |||||
| - item3 | |||||
| - item4 | |||||
| Then ``all-values`` will be ``['item1', 'item2', 'item3', 'item4']``. | |||||
| Empty Arrays | |||||
| ~~~~~~~~~~~~ | |||||
| An empty array can be used with ``!include``, which results in ``null``:: | |||||
| --- | |||||
| empty-value: !include [] | |||||
| This sets ``empty-value`` to ``null``. | |||||
| 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: | |||||
| base-config: !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 | |||||
| Shared Zone Configuration:: | |||||
| --- | |||||
| # config.yaml | |||||
| zones: | |||||
| example.com.: &standard-setup !include zones/standard-setup.yaml | |||||
| example.net.: *standard-setup | |||||
| example.org.: *standard-setup | |||||
| 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 | |||||
| Where ``common/apex.yaml`` might contain:: | |||||
| --- | |||||
| - 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 | |||||
| Common Record Values | |||||
| ~~~~~~~~~~~~~~~~~~~~ | |||||
| You can merge multiple files to build up complex record sets:: | |||||
| --- | |||||
| # zone.yaml | |||||
| '': | |||||
| type: TXT | |||||
| values: !include | |||||
| - txt-records/verification.yaml | |||||
| - txt-records/spf.yaml | |||||
| - txt-records/dmarc.yaml | |||||
| This combines TXT records from multiple files into a single record set. | |||||
| 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 | |||||
| ----------------- | |||||
| When using the array syntax to include multiple files, all files must contain | |||||
| compatible types: | |||||
| * All files must contain **dictionaries**, or | |||||
| * All files must contain **arrays** | |||||
| If the first file contains a dictionary and a subsequent file contains an array | |||||
| (or vice versa), octoDNS will raise a ``ConstructorError`` with a clear message | |||||
| indicating which file and position caused the type mismatch. | |||||
| Simple scalar values (strings, numbers, booleans) are not supported with the | |||||
| array syntax. Use single file includes for scalar values. | |||||
| Examples | |||||
| -------- | |||||
| Example 1: Shared Provider Settings | |||||
| .................................... | |||||
| Create reusable provider configurations:: | |||||
| # providers/retry-settings.yaml | |||||
| --- | |||||
| max_retries: 5 | |||||
| retry_delay: 2 | |||||
| timeout: 30 | |||||
| # production.yaml | |||||
| --- | |||||
| providers: | |||||
| dacloud: | |||||
| class: octodns_route53.DaCloudProvider | |||||
| access_key_id: env/DC_ACCESS_KEY_ID | |||||
| secret_access_key: env/DC_SECRET_ACCESS_KEY | |||||
| network: !include providers/retry-settings.yaml | |||||
| Example 2: Composing TXT Records | |||||
| ................................. | |||||
| Build TXT records from multiple sources:: | |||||
| # txt-records/spf.yaml | |||||
| --- | |||||
| - "v=spf1 include:_spf.google.com ~all" | |||||
| # txt-records/verification.yaml | |||||
| --- | |||||
| - "google-site-verification=abc123" | |||||
| - "ms-domain-verification=xyz789" | |||||
| # example.com.yaml | |||||
| --- | |||||
| '': | |||||
| type: TXT | |||||
| values: !include | |||||
| - txt-records/spf.yaml | |||||
| - txt-records/verification.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 | |||||