Руководство по Hetzner DNS
Коллекция community.dns предлагает несколько модулей для работы с службой Hetzner DNS. Модули используют API на основе JSON REST.
Коллекция предоставляет шесть модулей для работы с Hetzner DNS:
- community.dns.hetzner_dns_record: создание, обновление и удаление отдельных DNS-записей
- community.dns.hetzner_dns_record_info: получение сведений о DNS-записях
- community.dns.hetzner_dns_record_set: создание, обновление и удаление наборов DNS-записей
- community.dns.hetzner_dns_record_set_info: получение сведений о наборах DNS-записей
- community.dns.hetzner_dns_record_sets: массовая синхронизация наборов DNS-записей
- community.dns.hetzner_dns_zone_info: получение сведений о зоне
Если вы хотите выполнить миграцию с коллекции markuman.hetzner_dns, см. раздел Миграция с markuman.hetzner_dns.
Коллекция также предоставляет плагин инвентаризации:
- community.dns.hetzner_dns_records: создание инвентаризации из DNS-записей
Чтобы узнать, какие типы записей поддерживаются и как их использовать, см. раздел Поддерживаемые DNS-записи.
Аутентификация
Для использования API Hetzner необходимо создать токен API. Управлять токенами API можно в пункте меню «API tokens» в меню пользователя в консоли DNS. Необходимо передать токен параметру hetzner_token модулей, его псевдониму api_token либо указать его в переменной среды HETZNER_DNS_TOKEN:
- community.dns.hetzner_dns_record:
hetzner_token: '{{ token }}'
# ...
В примерах этого руководства параметры аутентификации опущены. Обратите внимание, что их можно задать глобально с помощью module_defaults (см. раздел Настройки модулей по умолчанию) или с помощью переменной среды для пользователя и компьютера, на которых запускаются модули.
Использование группы настроек модулей community.dns.hetzner
Чтобы не указывать общие параметры для всех модулей Hetzner DNS в каждой задаче, можно использовать группу настроек модулей community.dns.hetzner:
---
- name: Hetzner DNS
hosts: localhost
gather_facts: false
module_defaults:
group/community.dns.hetzner:
hetzner_token: '{{ token }}'
tasks:
- name: Query zone information
community.dns.hetzner_dns_zone_info:
zone_name: example.com
register: result
- name: Set A records for www.example.com
community.dns.hetzner_dns_record_set:
state: present
zone_name: example.com
type: A
prefix: www
value:
- 192.168.0.1
В этом примере обе задачи используют параметры, заданные для группы настроек модулей.
Работа с DNS-зонами
Модуль community.dns.hetzner_dns_zone_info позволяет запрашивать сведения о зоне. Зону можно идентифицировать как по имени, так и по идентификатору (целому числу):
- name: Query zone information by name
community.dns.hetzner_dns_zone_info:
zone_name: example.com
register: result
- name: Query zone information by ID
community.dns.hetzner_dns_zone_info:
zone_id: aBcDeFgHiJlMnOpQrStUvW
register: result
Модуль возвращает и имя зоны, и ее идентификатор, поэтому с его помощью можно преобразовать идентификатор зоны в имя и наоборот:
- ansible.builtin.debug:
msg: |
The zone ID: {{ result.zone_id }}
The zone name: {{ result.zone_name }}
Работа с DNS-записями
Примечание
По умолчанию значения записей TXT, возвращаемые и принимаемые модулями и плагинами этой коллекции, не заключены в кавычки. Это означает, что не нужно добавлять двойные кавычки ("), экранировать двойные кавычки (как \") и обратную косую черту (как \\). Все модули и плагины, работающие с DNS-записями, поддерживают параметр txt_transformation, который позволяет настроить такое поведение.
Запрос DNS-записей и наборов записей
Модуль community.dns.hetzner_dns_record_set_info позволяет запрашивать наборы DNS-записей через API. Его можно использовать для запроса одного набора записей:
- name: Query single record
community.dns.hetzner_dns_record_set_info:
zone_name: example.com
type: A # IPv4 addresses
what: single_record # default value
# Either specify a record name:
record: www.example.com
# Or a record prefix ('' is the zone itself):
prefix: www
register: result
- name: Show IPv4 addresses if record exists
ansible.builtin.debug:
msg: >
IPv4s are {{ result.set.value | join(', ') }},
TTL is {{ result.set.ttl }}
when: result.set is truthy
- name: Show that record is not set
ansible.builtin.debug:
msg: There is no A record for www.example.com
when: result.set is falsy
Во всех примерах этого раздела вместо zone_name=example.com можно указать zone_id=aBcDeFgHiJlMnOpQrStUvW с текстовым значением идентификатора зоны.
Также можно запросить список всех наборов записей для имени записи или префикса:
- name: Query all records for www.example.com
community.dns.hetzner_dns_record_set_info:
zone_name: example.com
what: all_types_for_record
# Either specify a record name:
record: www.example.com
# Or a record prefix ('' is the zone itself):
prefix: www
register: result
- name: Show all records for www.example.com
ansible.builtin.debug:
msg: >
{{ item.type }} record with TTL {{ item.ttl }} has
values {{ item.value | join(', ') }}
loop: result.sets
Наконец, можно запросить все наборы записей для зоны:
- name: Query all records for a zone
community.dns.hetzner_dns_record_set_info:
zone_name: example.com
what: all_records
register: result
- name: Show all records for the example.com zone
ansible.builtin.debug:
msg: >
{{ item.type }} record for {{ item.record }} with
TTL {{ item.ttl }} has values {{ item.value | join(', ') }}
loop: result.sets
Если вас интересуют отдельные DNS-записи, а не наборы записей, используйте модуль community.dns.hetzner_dns_record_info. Он поддерживает те же параметры ограничения, что и модуль community.dns.hetzner_dns_record_set_info.
Создание и обновление отдельных DNS-записей
Если вы хотите не добавлять или удалять значения, а заменять их, следует изменить набор записей, а не отдельную запись. Это особенно важно при работе с записями CNAME и SOA.
Модуль community.dns.hetzner_dns_record позволяет задавать, обновлять и удалять отдельные DNS-записи. Задание и обновление выполняются следующим образом. Записи сопоставляются по имени и типу, а значение TTL при необходимости обновляется:
- name: Add an A record with value 1.1.1.1 for www.example.com, resp. make sure the TTL is 300
community.dns.hetzner_dns_record:
state: present
zone_name: example.com
type: A # IPv4 addresses
# Either specify a record name:
record: www.example.com
# Or a record prefix ('' is the zone itself):
prefix: www
value: 1.1.1.1
ttl: 300
Чтобы удалить записи, просто используйте state=absent. Записи сопоставляются по имени и типу, а TTL игнорируется:
- name: Remove A values for www.example.com
community.dns.hetzner_dns_record:
state: absent
zone_name: example.com
type: A # IPv4 addresses
record: www.example.com
value: 1.1.1.1
Записи того же типа с тем же именем, но другими значениями игнорируются.
Создание и обновление наборов DNS-записей
Модуль community.dns.hetzner_dns_record_set позволяет задавать, обновлять и удалять наборы DNS-записей. Задание и обновление выполняются следующим образом:
- name: Make sure record is set to the given value
community.dns.hetzner_dns_record_set:
state: present
zone_name: example.com
type: A # IPv4 addresses
# Either specify a record name:
record: www.example.com
# Or a record prefix ('' is the zone itself):
prefix: www
value:
- 1.1.1.1
- 8.8.8.8
Если необходимо проверить, что запись имеет определенное значение, задайте on_existing=keep. Использование keep_and_warn вместо этого приведет к предупреждению в такой ситуации, а keep_and_fail вызовет сбой модуля.
Чтобы удалить значения, можно либо перезаписать их значением [], либо использовать state=absent:
- name: Remove A values for www.example.com
community.dns.hetzner_dns_record_set:
state: present
zone_name: example.com
type: A # IPv4 addresses
record: www.example.com
value: []
- name: Remove TXT values for www.example.com
community.dns.hetzner_dns_record_set:
zone_name: example.com
type: TXT
prefix: www
state: absent
- name: Remove specific AAAA values for www.example.com
community.dns.hetzner_dns_record_set:
zone_name: example.com
type: AAAA # IPv6 addresses
prefix: www
state: absent
on_existing: keep_and_fail
ttl: 300
value:
- '::1'
В третьем примере задан on_existing=keep_and_fail, а также явно указаны значение и TTL. Модуль удалит текущее значение, только если для www.example.com существует запись AAAA, текущее значение которой — ::1, а TTL равен 300. Если задано другое значение, модуль ничего не изменит, но завершится с ошибкой. Это может быть полезно, чтобы случайно не удалять значения, которые вы не хотите менять. Чтобы вместо сбоя выдать предупреждение, используйте on_existing=keep_and_warn, а чтобы просто ничего не менять и не сообщать об этом, используйте on_existing=keep.
Массовая синхронизация наборов DNS-записей
Если необходимо задать или обновить сразу несколько записей либо убедиться, что присутствует точный набор указанных вами записей и ничего больше, используйте модуль community.dns.hetzner_dns_record_sets.
В следующем примере показано, как задать или обновить сразу несколько записей:
- name: Make sure that multiple records are present
community.dns.hetzner_dns_record_sets:
zone_name: example.com
record_sets:
- prefix: www
type: A
value:
- 1.1.1.1
- 8.8.8.8
- prefix: www
type: AAAA
value:
- '::1'
В следующем примере показано, как убедиться, что доступны только указанные записи, а все остальные удалены. Обратите внимание: для записи record_sets[].type=NS мы использовали record_sets[].ignore=true, что позволяет не указывать значение. Это указывает модулю не изменять запись NS для example.com.
- name: Make sure that multiple records are present
community.dns.hetzner_dns_record_sets:
zone_name: example.com
prune: true
record_sets:
- prefix: www
type: A
value:
- 1.1.1.1
- 8.8.8.8
- prefix: www
type: AAAA
value:
- '::1'
- prefix: ''
type: NS
ignore: true
Миграция с markuman.hetzner_dns
В этом разделе описано, как перенести плейбуки и роли с коллекции markuman.hetzner_dns на модули и плагины Hetzner из коллекции community.dns.
Миграция состоит из трех шагов. Два из них нужно выполнить при миграции, а третий можно выполнить позже:
- Заменить используемые модули и плагины новыми.
- При необходимости скорректировать параметры модулей и плагинов.
- Избегать устаревших псевдонимов, упрощающих переход.
Коллекция markuman.hetzner_dns предоставляет три модуля и один плагин инвентаризации.
Примечание
При работе с записями TXT обратите внимание на параметр txt_transformation. По умолчанию модули и плагины этой коллекции используют значения без кавычек (не нужно добавлять двойные кавычки и экранировать двойные кавычки и обратную косую черту), тогда как модули и плагины в markuman.hetzner_dns используют значения, частично заключенные в кавычки. Поведение модулей community.dns можно изменить, передав txt_transformation=api или txt_transformation=quoted.
Модуль markuman.hetzner_dns.record
Модуль markuman.hetzner_dns.zone_info можно заменить на модуль community.dns.hetzner_dns_record или модуль community.dns.hetzner_dns_record_set в зависимости от его назначения.
При создании, обновлении или удалении отдельных записей следует использовать модуль community.dns.hetzner_dns_record. Это относится к случаям, когда задан purge=false (значение по умолчанию). Обратите внимание, что replace, overwrite и solo являются псевдонимами purge.
# Creating and updating DNS records
- name: Creating or updating a single DNS record with markuman.hetzner_dns
markuman.hetzner_dns.record:
zone_name: example.com
name: localhost
type: A
value: 127.0.0.1
ttl: 60
# This means the module operates on single DNS entries. If not specified,
# this is the default value:
purge: false
- name: Creating or updating a single DNS record with community.dns
community.dns.hetzner_dns_record:
zone_name: example.com
# 'state' must always be specified:
state: present
# 'name' is a deprecated alias of 'prefix', so it can be
# kept during a first migration step:
name: localhost
# 'type', 'value' and 'ttl' do not change:
type: A
value: 127.0.0.1
ttl: 60
# If type is TXT, you either have to adjust the value you pass,
# or keep the following option:
txt_transformation: api
Если модуль markuman.hetzner_dns.record работает в режиме замены, его следует заменить на модуль community.dns.hetzner_dns_record_set, поскольку в этом случае он работает с набором записей, а не с отдельной записью:
# Creating and updating DNS record sets
- name: Creating or updating a record set with markuman.hetzner_dns
markuman.hetzner_dns.record:
zone_name: example.com
name: localhost
type: A
value: 127.0.0.1
ttl: 60
# This means the module operates on the record set:
purge: true
- name: Creating or updating a record set with community.dns
community.dns.hetzner_dns_record_set:
zone_name: example.com
# 'state' must always be specified:
state: present
# 'name' is a deprecated alias of 'prefix', so it can be
# kept during a first migration step:
name: localhost
# 'type' and 'ttl' do not change:
type: A
ttl: 60
# 'value' is now a list:
value:
- 127.0.0.1
# Ansible allows to specify lists as a comma-separated string.
# So for records which do not contain a comma, you can also
# keep the old syntax, in this case:
#
# value: 127.0.0.1
#
# If type is TXT, you either have to adjust the value you pass,
# or keep the following option:
txt_transformation: api
При удалении записи необходимо учитывать, задан ли value. Если задан value, модуль удаляет отдельную DNS-запись, и следует использовать модуль community.dns.hetzner_dns_record:
# Deleting single DNS records
- name: Deleting a single DNS record with markuman.hetzner_dns
markuman.hetzner_dns.record:
zone_name: example.com
state: absent
name: localhost
type: A
value: 127.0.0.1
ttl: 60
- name: Deleting a single DNS record with community.dns
community.dns.hetzner_dns_record:
zone_name: example.com
state: absent
# 'name' is a deprecated alias of 'prefix', so it can be
# kept during a first migration step:
name: localhost
# 'type', 'value' and 'ttl' do not change:
type: A
value: 127.0.0.1
ttl: 60
# If type is TXT, you either have to adjust the value you pass,
# or keep the following option:
txt_transformation: api
Если value не задан, модуль markuman.hetzner_dns.record удалит все записи с этим префиксом и типом. В этом случае он работает с набором записей, поэтому следует использовать модуль community.dns.hetzner_dns_record_set:
# Deleting multiple DNS records
- name: Deleting multiple DNS records with markuman.hetzner_dns
markuman.hetzner_dns.record:
zone_name: example.com
state: absent
name: localhost
type: A
- name: Deleting a single DNS record with community.dns
community.dns.hetzner_dns_record_set:
zone_name: example.com
state: absent
# 'name' is a deprecated alias of 'prefix', so it can be
# kept during a first migration step:
name: localhost
# 'type' does not change:
type: A
Последний шаг — заменить удаленный псевдоним name для prefix на prefix.
Модуль markuman.hetzner_dns.record_info
Модуль markuman.hetzner_dns.record_info можно заменить на модуль community.dns.hetzner_dns_record_info. Главное отличие состоит в том, что вывод управляется не параметром filters, а параметром what (допустимые значения: single_record, all_types_for_record и all_records), параметром type (необходим, если what=single_record), а также параметрами record и prefix (необходимы, если what не равно all_records).
Модуль markuman.hetzner_dns.zone_info
Модуль markuman.hetzner_dns.zone_info можно заменить на модуль community.dns.hetzner_dns_zone_info. Основные отличия:
Плагин инвентаризации markuman.hetzner_dns.inventory
Плагин инвентаризации markuman.hetzner_dns.inventory можно заменить на плагин инвентаризации community.dns.hetzner_dns_records. Помимо имени плагина, никаких изменений не требуется.
Поддерживаемые DNS-записи
Здесь приведен список поддерживаемых DNS-записей и синтаксис для поля value:
-
Записи A: IPv4-адрес.
Просто укажите IPv4-адрес в качестве
value, например127.0.0.1. -
Записи AAAA: IPv6-адрес.
Просто укажите IPv6-адрес в качестве
value, например3fff::1:2. -
Записи CAA: авторизация центра сертификации
Значение
valueзаписи имеет вид<flags> <tag> <value>, где<flags>— беззнаковое целое число от 0 до 255;<tag>— строка ASCII, напримерissue,issuewildилиiodef; а<value>— значение, заключенное в двойные кавычки. Пример записи:0 issue "letsencrypt.org". Точный синтаксис описан в разделе L(4.1.1 RFC 8659, https://datatracker.ietf.org/doc/html/rfc8659#name-syntax). - Записи CNAME: каноническое имя.
- Записи DANE: аутентификация именованных сущностей на основе DNS.
- Записи DS: подписант делегирования.
- Записи HINFO: сведения о хосте.
-
Записи MX: почтовый обмен.
Значение
valueзаписи имеет вид<priority> <hostname>, где<priority>— беззнаковое целое число, а<hostname>— имя хоста DNS. -
Записи NS: запись сервера имен.
Значение
valueзаписи — это список DNS-имен авторитетных серверов имен для этой зоны. - Записи RP: ответственное лицо.
- Записи SOA: запись начала полномочий.
-
Записи SRV: указатель службы.
Значение
valueзаписи имеет вид<priority> <weight> <port> <target>. -
Записи TLSA: связь сертификата TLSA.
Эта запись используется для DANE.
-
Записи TXT: текстовая запись.
Значение представляет собой произвольный текст. Его назначение зависит от контекста.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/community/dns/docsite/hetzner_guide.html