| @ -0,0 +1,181 @@ | |||
| .. _dynamic-zone-config: | |||
| Dynamic Zone Config | |||
| =================== | |||
| Dynamic zone configuration is a powerful tool for reducing the | |||
| configuration required to run octoDNS, specifically the *zones* section. Rather | |||
| than an exhaustive list of every zone and its corresponding sources and targets | |||
| it's possible to define the pattern once with a wildcard. | |||
| This is most commonly done with a `YamlProvider`_ which will result in building | |||
| the list of zones managed at runtime from the yaml zone files in it's | |||
| directory, but any provider that supports the | |||
| :py:meth:`octodns.provider.yaml.YamlProvider.list_zones` method can be used. | |||
| Any zone name configured in the *zones* section with a leading * is considered | |||
| dynamic and the information in this document applies. It is possible to include | |||
| multiple dynamic zone configurations in advanced setups utilizing | |||
| distinct sources and/or carefully crafted matching as described below. | |||
| Matching | |||
| -------- | |||
| There are three types of matching supported: legacy, file-glob, and regular | |||
| expression. This ultimately results in very flexible and powerful options, but | |||
| makes it pretty easy to build a foot-gun. The matching process has thorough | |||
| info and debug logging that can be enabled with **--debug** and should be the | |||
| first step in debugging a dynamic zone configuration. | |||
| Legacy | |||
| ...... | |||
| This is the default mode and the only one supported in versions prior to | |||
| 1.14.0. It is in effect a catch-all in that any zones returned by the sources' | |||
| :py:meth:`octodns.provider.yaml.YamlProvider.list_zones`. | |||
| This generally means that it only makes sense to have multiple legacy matchers | |||
| when they have distinct sources, otherwise the first one configured will claim | |||
| all the zones leaving nothing available. | |||
| .. _file-glob: | |||
| File-glob | |||
| ......... | |||
| This mode uses Unix shell style matching using the `fnmatch`_ module and is | |||
| generally the place to start when trying to apply configs to zones in a single | |||
| source or set of sources as it's relatively easy to understand and predict the | |||
| behavior of it. | |||
| A public and private setup where the public zones are also pushed internally is | |||
| a good starting example. If the following zone YAML files are in the *config* | |||
| provider's directory:: | |||
| company.com. | |||
| foundation.org | |||
| internal.net. | |||
| jobs.company.com. | |||
| other.com | |||
| support.company.com. | |||
| us-east-1.internal.net. | |||
| us-west-2.internal.net. | |||
| The following octoDNS configuration would match them as described in comments:: | |||
| --- | |||
| ... | |||
| zones: | |||
| # the names here do not really matter beyond starting with a *, it is a | |||
| # reccomended best practice to match the glob, but not required. It will be | |||
| # used in logging to aid in debugging. | |||
| # they are applied in the order defined and once claimed a zone is no | |||
| # longer available for matching | |||
| # everytyhing is available for matching | |||
| '*internal.net': | |||
| # we only want the private zones here and they are all under | |||
| # internet.net. so this glob will claim them. | |||
| glob: '*internal.net.' | |||
| sources: | |||
| - config | |||
| targets: | |||
| # only push it to the private provider | |||
| - private | |||
| # legacy style match everything that's left, all our various public zones | |||
| '*': | |||
| # legacy style match everything that's left, all our various public zones | |||
| sources: | |||
| - config | |||
| targets: | |||
| # push it to the public dns | |||
| - public | |||
| # and private | |||
| - private | |||
| This does mean that things are public by default so care would need to be taken | |||
| if a new internal zone naming pattern is added. | |||
| .. _fnmatch: https://docs.python.org/3/library/fnmatch.html | |||
| .. versionadded:: 1.14.0 | |||
| File-glob matching support was added in 1.14.0 | |||
| .. _regular-expression: | |||
| Regular Expression | |||
| .................. | |||
| Regular expression mode works similarly to :ref:`file-glob` with the matching | |||
| performed by the python regular expression engine `re`_. It enables much more | |||
| complex and powerful matching logic with the trade-off of having to work with | |||
| regular expressions. | |||
| Continuing on with the public/private split, adding in the wrinkles of multiple | |||
| internal domain names and the desire to split the regions pushing only to the | |||
| co-located DNS servers. All of our internal zones end in .net., anything else | |||
| is public:: | |||
| company.com. | |||
| foundation.org | |||
| jobs.company.com. | |||
| other.com | |||
| support.company.com. | |||
| us-east-1.hosts.net. | |||
| us-east-1.network.net. | |||
| us-east-1.services.net. | |||
| us-west-2.hosts.net. | |||
| us-west-2.network.net. | |||
| us-west-2.services.net. | |||
| The following octoDNS configuration would match them as described in comments:: | |||
| --- | |||
| ... | |||
| zones: | |||
| # regexes are too ugly to use as names, so these have useful info for | |||
| # logging/debugging | |||
| # everytyhing is available for matching | |||
| '*us-east-1': | |||
| # we only want the private zones here and they are all under | |||
| # internet.net. So this regex will claim them, yes this could be done | |||
| # with a glob, but ... | |||
| regex: '^.*us-east-1.*.net.$' | |||
| sources: | |||
| - config | |||
| targets: | |||
| # only push it to the us-east-1 provider | |||
| - us-east-1 | |||
| # everytyhing with the exception of the us-east-1 .net zones are available | |||
| '*us-west-2': | |||
| regex: '^.*us-west-2.*.net.$' | |||
| sources: | |||
| - config | |||
| targets: | |||
| # only push it to the us-east-1 provider | |||
| - us-west-2 | |||
| # legacy style match everything that's left, all our various public zones | |||
| '*': | |||
| sources: | |||
| - config | |||
| targets: | |||
| # push it to the public dns | |||
| - public | |||
| # and private | |||
| - private | |||
| .. _re: https://docs.python.org/3/library/re.html | |||
| .. versionadded:: 1.14.0 | |||
| Regular expression matching support was added in 1.14.0 | |||
| .. _YamlProvider: /octodns/provider/yaml.py | |||