Spec-Zone.ru › Ansible

Руководство по HostTech DNS

  • Аутентификация, требования и API

    • JSON REST API
    • WSDL API
    • Использование группы значений по умолчанию модулей community.dns.hosttech
  • Работа с DNS-зонами
  • Работа с DNS-записями

    • Получение DNS-записей и наборов записей
    • Создание и обновление отдельных DNS-записей
    • Создание и обновление наборов DNS-записей
    • Массовая синхронизация наборов DNS-записей
  • Поддерживаемые DNS-записи

Коллекция community.dns содержит несколько модулей для работы с службой HostTech DNS. Модули поддерживают как старый API на основе WSDL, так и новый API на основе JSON REST.

Коллекция предоставляет шесть модулей для работы с HostTech DNS:

  • community.dns.hosttech_dns_record: создание, обновление и удаление отдельных DNS-записей
  • community.dns.hosttech_dns_record_info: получение информации о DNS-записях
  • community.dns.hosttech_dns_record_set: создание, обновление и удаление наборов DNS-записей
  • community.dns.hosttech_dns_record_set_info: получение информации о наборах DNS-записей
  • community.dns.hosttech_dns_record_sets: массовая синхронизация наборов DNS-записей
  • community.dns.hosttech_dns_zone_info: получение информации о зоне

Также предоставляется плагин инвентаризации:

  • community.dns.hosttech_dns_records: создание инвентаризации на основе DNS-записей

Список поддерживаемых типов записей и сведения об их использовании см. в разделе Поддерживаемые DNS-записи.

Аутентификация, требования и API

В настоящее время HostTech предоставляет два API для работы с DNS-записями: старый API на основе WSDL и новый REST API на основе JSON. По возможности мы рекомендуем использовать новый JSON REST API.

JSON REST API

Чтобы использовать JSON REST API, необходимо создать токен API. Токенами API можно управлять в разделе «API» редактора DNS («DNS Editor»). Токен необходимо указать в параметре hosttech_token модулей:

- community.dns.hosttech_dns_record:
    hosttech_token: '{{ token }}'
    # ...

В примерах этого руководства мы не будем указывать параметры аутентификации. Обратите внимание, что их можно задать глобально с помощью module_defaults (см. раздел Значения модулей по умолчанию).

WSDL API

Чтобы использовать WSDL API, необходимо указать учетные данные API. Их можно найти и изменить в разделе «Solutions» центра «Servercenter», в настройках инструмента «DNS Tool». Имя пользователя фиксировано, но пароль можно изменить. Учетные данные необходимо указать в параметрах hosttech_username и hosttech_password модулей.

Для работы с WSDL API также необходимо установить модуль Python lxml. Это можно сделать перед использованием модулей:

- name: Make sure lxml is installed
  pip:
    name: lxml

- community.dns.hosttech_dns_record:
    hosttech_username: '{{ username }}'
    hosttech_password: '{{ password }}'
    # ...

В примерах этого руководства мы не будем указывать параметры аутентификации. Обратите внимание, что их можно задать глобально с помощью module_defaults (см. раздел Значения модулей по умолчанию).

Использование группы значений по умолчанию модулей community.dns.hosttech

Чтобы не указывать общие параметры для всех модулей Hosttech DNS в каждой задаче, можно использовать группу значений по умолчанию модулей community.dns.hosttech:

---
- name: Hosttech DNS
  hosts: localhost
  gather_facts: false
  module_defaults:
    group/community.dns.hosttech:
      hosttech_username: '{{ username }}'
      hosttech_password: '{{ password }}'
  tasks:
    - name: Query zone information
      community.dns.hosttech_dns_zone_info:
        zone_name: example.com
      register: result

    - name: Set A records for www.example.com
      community.dns.hosttech_dns_record_set:
        state: present
        zone_name: example.com
        type: A
        prefix: www
        value:
          - 192.168.0.1

В этом примере обе задачи используют параметры, заданные для группы значений по умолчанию модулей.

Работа с DNS-зонами

Модуль community.dns.hosttech_dns_zone_info позволяет получать информацию о зоне. Зону можно указать как по имени, так и по идентификатору (целому числу):

- name: Query zone information by name
  community.dns.hosttech_dns_zone_info:
    zone_name: example.com
  register: result

- name: Query zone information by ID
  community.dns.hosttech_dns_zone_info:
    zone_id: 42
  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.hosttech_dns_record_set_info позволяет получать наборы DNS-записей из API. Его можно использовать для получения отдельного набора записей:

- name: Query single record
  community.dns.hosttech_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=42 с целочисленным идентификатором зоны.

Также можно получить список всех наборов записей для имени или префикса записи:

- name: Query all records for www.example.com
  community.dns.hosttech_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.hosttech_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.hosttech_dns_record_info. Он поддерживает те же параметры фильтрации, что и модуль community.dns.hosttech_dns_record_set_info.

Создание и обновление отдельных DNS-записей

Если вам нужно не добавлять и удалять значения, а заменять их, следует изменить набор записей, а не отдельную запись. Это особенно важно при работе с записями CNAME и SOA.

Модуль community.dns.hosttech_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.hosttech_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.hosttech_dns_record:
    state: absent
    zone_name: example.com
    type: A  # IPv4 addresses
    record: www.example.com
    value: 1.1.1.1

Записи того же типа и с тем же именем, но с другими значениями игнорируются.

Создание и обновление наборов DNS-записей

Модуль community.dns.hosttech_dns_record_set позволяет создавать, обновлять и удалять наборы DNS-записей. Создание и обновление можно выполнить следующим образом:

- name: Make sure record is set to the given value
  community.dns.hosttech_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.hosttech_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.hosttech_dns_record_set:
    zone_name: example.com
    type: TXT
    prefix: www
    state: absent

- name: Remove specific AAAA values for www.example.com
  community.dns.hosttech_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. Это заставит модуль удалить текущее значение, только если существует запись AAAA для www.example.com, текущее значение которой — ::1, а TTL равен 300. Если задано другое значение, модуль не внесет изменений и завершится с ошибкой. Это может быть полезно, чтобы случайно не удалить значения, которые вы не хотите изменять. Чтобы вместо ошибки выдать предупреждение, используйте on_existing=keep_and_warn, а чтобы просто не вносить изменения без каких-либо сообщений об этой ситуации — on_existing=keep.

Массовая синхронизация наборов DNS-записей

Чтобы задать или обновить сразу несколько записей или убедиться, что присутствует только точный набор указанных записей и ничего больше, используйте модуль community.dns.hosttech_dns_record_sets.

В следующем примере показано, как задать или обновить сразу несколько записей:

- name: Make sure that multiple records are present
  community.dns.hosttech_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.hosttech_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

Поддерживаемые 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-записи: каноническое имя.
  • Записи MX: почтовый обменник.

    Поле value записи имеет вид <priority> <hostname>, где <priority> — беззнаковое целое число, а <hostname> — имя хоста DNS.

  • Записи NS: запись сервера имен.

    Поле value записи — это список имен DNS авторитетных серверов имен для этой зоны.

  • Записи PTR: указатель на каноническое имя.

    Поле value записи имеет вид <origin> <ptr-name>.

  • Записи SPF: Sender Policy Framework.

    Этот тип DNS-записей устарел; для политик SPF следует использовать записи TXT.

  • Записи SRV: указатель службы.

    Поле value записи имеет вид <priority> <weight> <port> <target>.

  • Записи 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/hosttech_guide.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API