dhcp
Ansible роль dhcp
Роль Ansible для настройки ISC DHCPD. Ответственности этой роли заключаются в установке пакетов и управлении конфигурацией (dhcpd.conf(5)). Управление конфигурацией брандмауэра не входит в обязанности этой роли. Вы можете сделать это в вашем локальном плейбуке или использовать другую роль (например, bertvv.rh-base.
Смотрите журнал изменений для заметных изменений в каждом выпуске.
Используете/нравится вам эта роль? Пожалуйста, подумайте о том, чтобы поставить ей звезду. Если вы оцените эту роль на Ansible Galaxy и заметите недочеты, пожалуйста, откройте проблему с конкретными комментариями или запрос на изменение, чтобы мы могли ее улучшить. Спасибо!
Требования
Нет специфических требований
Переменные роли
Эта роль может устанавливать глобальные параметры и указывать объявления подсетей.
Смотрите тестовый плейбук для примера рабочей DHCP-сервер в тестовой среде, основанной на Vagrant и VirtualBox. Этот раздел служит справкой по всем поддерживаемым параметрам.
Глобальные параметры
Следующие переменные, при установке, будут добавлены в глобальный раздел файла конфигурации DHCP. Если заранее не указано значение по умолчанию, соответствующий параметр будет пропущен в dhcpd.conf(5)
.
Смотрите страницу man dhcp-options(5) для получения дополнительной информации о этих параметрах.
Переменная | Комментарии |
---|---|
dhcp_global_authoritative |
Глобальное авторитетное утверждение (authoritative , not authoritative ) |
dhcp_global_booting |
Глобальное разрешение на загрузку (allow , deny , ignore ) |
dhcp_global_bootp |
Глобальное разрешение на bootp (allow , deny , ignore ) |
dhcp_global_broadcast_address |
Глобальный широковещательный адрес |
dhcp_global_classes |
Определения классов с утверждением совпадения(1) |
dhcp_global_default_lease_time |
Время аренды по умолчанию в секундах |
dhcp_global_domain_name_servers |
Список IP-адресов DNS-серверов(2) |
dhcp_global_domain_name |
Имя домена, которое клиент должен использовать для разрешения имен хостов |
dhcp_global_domain_search |
Список доменных имен, используемых клиентом для нахождения non-FQDN (1) |
dhcp_global_failover |
Настройки для резервирования (failover) (3) |
dhcp_global_failover_peer |
Имя резервного сервера (например, foo ) |
dhcp_global_filename |
Имя файла для запроса загрузки |
dhcp_global_includes_missing |
Логическое значение. Продолжить, если файлы includes отсутствуют в файлах роли |
dhcp_global_includes |
Список файлов конфигурации для включения (из dhcp_config_dir ) |
dhcp_global_log_facility |
Глобальное журналирование (например, daemon , syslog , user , ...) |
dhcp_global_max_lease_time |
Максимальное время аренды в секундах |
dhcp_global_next_server |
IP-адрес сервера PXEboot |
dhcp_global_ntp_servers |
Список IP-адресов NTP-серверов |
dhcp_global_omapi_port |
Порт OMAPI |
dhcp_global_omapi_secret |
Секрет OMAPI |
dhcp_global_other_options |
Массив произвольных дополнительных глобальных параметров |
dhcp_global_routers |
IP-адрес маршрутизатора |
dhcp_global_server_name |
Имя сервера, отправляемое клиенту |
dhcp_global_server_state |
Состояние службы (запущена, остановлена) |
dhcp_global_subnet_mask |
Глобальная маска подсети |
dhcp_custom_includes |
Список файлов конфигурации jinja для включения (из dhcp_config_dir ) |
dhcp_custom_includes_modes |
Список режимов для целевого пользовательского конфигурационного файла |
Примечания
(1) Эта роль поддерживает определение классов с утверждением совпадения, например:
# Класс для виртуальных машин VirtualBox
dhcp_global_classes:
- name: vbox
match: 'match if binary-to-ascii(16,8,":",substring(hardware, 1, 3)) = "8:0:27"'
Названия классов могут использоваться в определении пулов адресов (см. ниже).
(2) Переменная роли dhcp_global_domain_name_servers
может быть записана как список (если у вас более одного элемента), или как строка (если только один). Следующий фрагмент демонстрирует пример обоих вариантов:
# Один DNS сервер
dhcp_global_domain_name_servers: 8.8.8.8
# Список DNS серверов
dhcp_global_domain_name_servers:
- 8.8.8.8
- 8.8.4.4
(3) Эта роль также поддерживает определение резервного сервера, например:
# Определение резервного сервера
dhcp_global_failover_peer: failover-group
dhcp_global_failover:
role: primary # | secondary
address: 192.168.222.2
port: 647
peer_address: 192.168.222.3
peer_port: 647
max_response_delay: 15
max_unacked_updates: 10
load_balance_max_seconds: 5
split: 255
mclt: 3600
Переменная dhcp_global_failover_peer
содержит название для настроенного резервного сервера, используемого для каждого пула. Опции декларации резервирования указываются с помощью переменной dhcp_global_failover
, которая является словарем и может содержать следующие опции:
Опция | Обязательна | Комментарий |
---|---|---|
address |
нет | IP-адрес этого сервера |
hba |
нет | список шестнадцатеричных значений, разделенных двоеточием |
load_balance_max_seconds |
нет | Период, после которого балансировка нагрузки отключается (рекомендуется 3-5) |
max-balance |
нет | Утверждение о балансе пула резервирования |
max-lease-misbalance |
нет | Утверждение о балансе пула резервирования |
max-lease-ownership |
нет | Утверждение о балансе пула резервирования |
max_response_delay |
нет | Максимальное количество секунд без контакта перед активацией резервирования |
max_unacked_updates |
нет | Максимальное количество BNDUPD, которое может быть отправлено перед получением BNDACK (рекомендуется 10) |
mclt |
нет | Максимальное время ожидания клиента |
min-balance |
нет | Утверждение о балансе пула резервирования |
peer_address |
нет | IP-адрес резервного сервера |
peer_port |
нет | Порт этого сервера (обычно 519/520 или 647/847) |
port |
нет | Порт этого сервера (обычно 519/520 или 647/847) |
role |
нет | primary, secondary |
split |
нет | Балансировка нагрузки (0-255) |
Директива резервного сервера должна находиться в определении пулов адресов (см. ниже).
Объявления подсетей
Переменная роли dhcp_subnets
содержит список словарей, указывая объявления подсетей, которые будут добавлены в файл конфигурации DHCP. Каждое объявление подсети должно содержать ip
и netmask
, остальные параметры не обязательны. Начнем этот раздел с примера, а полный обзор поддерживаемых параметров следует далее.
dhcp_subnets:
- ip: 192.168.222.0
netmask: 255.255.255.128
domain_name_servers:
- 10.0.2.3
- 10.0.2.4
range_begin: 192.168.222.50
range_end: 192.168.222.127
- ip: 192.168.222.128
default_lease_time: 3600
max_lease_time: 7200
netmask: 255.255.255.128
domain_name_servers: 10.0.2.3
routers: 192.168.222.129
Алфавитный список поддерживаемых параметров в объявлении подсетей:
Параметр | Обязателен | Комментарий |
---|---|---|
booting |
нет | allow,deny,ignore |
bootp |
нет | allow,deny,ignore |
default_lease_time |
нет | Время аренды по умолчанию для этой подсети (в секундах) |
domain_name_servers |
нет | Список доменных имен для этой подсети(1) |
domain_search |
нет | Список доменных имен для разрешения non-FQDN(1) |
filename |
нет | Имя файла, которое потрібно получить из сервера загрузки |
hosts |
нет | Список фиксированных IP-адресов для каждой подсети, похожий на dhcp_hosts |
interface |
нет | Переопределяет интерфейс объявления подсети |
ip |
да | Обязательно. IP-адрес подсети |
max_lease_time |
нет | Максимальное время аренды для этой подсети (в секундах) |
netmask |
да | Обязательно. Маска сети подсети (в десятичной нотации) |
next_server |
нет | IP-адрес сервера загрузки |
ntp_servers |
нет | Список NTP-серверов для этой подсети |
range_begin |
нет | Наименьший адрес в диапазоне динамических IP-адресов |
range_end |
нет | Наибольший адрес в диапазоне динамических IP-адресов |
ranges |
нет | Если нужны несколько диапазонов, их можно указать в списке (2) |
routers |
нет | IP-адрес шлюза для этой подсети |
server_name |
нет | Имя сервера, отправляемое клиенту |
subnet_mask |
нет | Переопределяет mask объявления подсети |
options |
нет | Словарь параметров для добавления в эту подсеть |
Вы можете указать пулы адресов в пределах подсети, установив параметры pools
. Это позволит вам указать пул адресов, который будет обрабатываться иначе, чем другой пул адресов, даже в одном сетевом сегменте или подсети. Это список словарей со следующими ключами, которые все являются необязательными:
Параметр | Комментарий |
---|---|
allow |
Указывает, какие хосты разрешены в этом пуле(1) |
default_lease_time |
Время аренды по умолчанию для этого пула |
deny |
Указывает, какие хосты не разрешены в этом пуле |
domain_name_servers |
DNS-серверы, используемые для этого пула(1) |
failover_peer |
Указывает резервный сервер |
max_lease_time |
Максимальное время аренды для этого пула |
min_lease_time |
Минимальное время аренды для этого пула |
range_begin |
Наименьший адрес в этом пуле |
range_end |
Наибольший адрес в этом пуле |
ranges |
Если нужны несколько диапазонов, их можно указать в списке (2) |
(1) Для полей allow
и deny
параметры перечислены в dhcpd.conf(5), но включают:
booting
bootp
client-updates
known-clients
members of "CLASS"
unknown-clients
(2) Для нескольких диапазонов подсетей их можно указать, например:
ranges:
- { begin: 192.168.222.50, end: 192.168.222.99 }
- { begin: 192.168.222.110, end: 192.168.222.127 }
Объявления хостов
Вы можете указать хосты, которые должны получать фиксированный IP-адрес, основываясь на их MAC-адресах, установив опцию dhcp_hosts
. Это список словарей с тремя ключами, из которых name
и mac
являются обязательными:
Параметр | Комментарий |
---|---|
name |
Имя хоста |
mac |
MAC-адрес хоста |
ip |
IP-адрес, который будет присвоен хосту |
hostname |
Имя хоста, которое будет назначено через DHCP (необязательный) |
dhcp_hosts:
- name: cl1
mac: '00:11:22:33:44:55'
ip: 192.168.222.150
- name: cl2
mac: '00:de:ad:be:ef:00'
ip: 192.168.222.151
Указать сервер PXEBoot
Установка переменной dhcp_pxeboot_server
перенаправит клиентов PXE на указанный сервер PXEBoot для загрузки по сети. Указанный сервер должен иметь образы загрузки в ожидаемых местах. Используйте, например, bertvv.pxeserver для его настройки.
Пользовательские включения
Установка переменной dhcp_custom_includes
на шаблон jinja позволит использовать пользовательские конфигурации, которые затем будут включены в файл dhcpd.conf
. Если имя файла шаблона имеет расширение .j2
, оно будет удалено из имени конечного файла, в противном случае имя файла шаблона будет сохранено в конечном файле.
dhcp_custom_includes:
- custom-dhcp-config.conf[.j2]
Режим по умолчанию для конечного пользовательского конфигурационного файла - 0644. Чтобы изменить это, установите переменную dhcp_custom_includes_modes
. Фильтр zip_longest будет использоваться вместе с переменной dhcp_custom_includes
.
dhcp_custom_includes_modes:
- '0600'
Вы можете создавать свои собственные переменные для использования в шаблоне, что обеспечит абсолютную гибкость. Для избежания конфликтов переменных убедитесь, что используете переменные, которые не упоминаются в этой роли, так как это приведет к дублированию конфигурации в нескольких .conf
файлах.
dhcp_custom_hosts:
- name: Juniper1
mac: 'de:ad:c0:de:ca:fe'
ip: 192.168.35.160
options:
- name: tftp-server-name
value: 192.168.35.152
- name: host-name
value: Juniper1
- name: NEW_OP.transfer-mode
value: "http"
- name: NEW_OP.config-file-name
value: "/configurations/j1-switch.config"
Наконец, шаблон jinja должен содержать допустимую конфигурацию ISC DHCPD (dhcpd.conf(5)). Это пример использования bertvv.dhcp для автоматического развертывания Juniper Zero-Touch-Provisioning.
option space NEW_OP;
option NEW_OP.image-file-name code 0 = text;
option NEW_OP.config-file-name code 1 = text;
option NEW_OP.image-file-type code 2 = text;
option NEW_OP.transfer-mode code 3 = text;
option NEW_OP.alt-image-file-name code 4= text;
option NEW_OP.http-port code 5= text;
option NEW_OP-encapsulation code 43 = encapsulate NEW_OP;
{% if dhcp_custom_hosts is defined %}
#
# Объявления хостов
#
{% for host in dhcp_custom_hosts %}
host {{ host.name | replace (" ","_") | replace ("'","_") | replace (":","_") }} {
hardware ethernet {{ host.mac }};
{% if host.ip is defined %}
fixed-address {{ host.ip }};
{% endif %}
{% if host.options is defined %}
{% for option in host.options %}
{{ option.name }} "{{ option.value }}"
{% endfor %}
{% endif %}
}
{% endfor %}
{% endif %}
Зависимости
Нет зависимостей.
Пример плейбука
Смотрите тестовый плейбук
Тестирование
Чтобы запустить тесты для этого плейбука, вам необходимо установить Molecule, VirtualBox и Vagrant. Выполнение команды molecule converge
создаст виртуальную машину VirtualBox с интерфейсом только для хоста с IP-адресом 192.168.222.2. Для тестирования вы можете, например, использовать скрипт nmap dhcp-discover:
$ sudo nmap --script broadcast-dhcp-discover -e vboxnet7
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-30 11:32 CET
Pre-scan script results:
| broadcast-dhcp-discover:
| Response 1 of 2:
| Interface: vboxnet7
| IP Offered: 192.168.222.50
| DHCP Message Type: DHCPOFFER
| Server Identifier: 192.168.222.2
| IP Address Lease Time: 5m00s
| Subnet Mask: 255.255.255.0
| Domain Name Server: 10.0.2.3, 10.0.2.4
| Domain Name: example.com
| Broadcast Address: 192.168.222.255
| Response 2 of 2:
| Interface: vboxnet7
| IP Offered: 192.168.222.50
| DHCP Message Type: DHCPOFFER
| Server Identifier: 192.168.222.2
| IP Address Lease Time: 5m00s
| Subnet Mask: 255.255.255.0
| Domain Name Server: 10.0.2.3, 10.0.2.4
| Domain Name: example.com
|_ Broadcast Address: 192.168.222.255
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 10.19 seconds
Лицензия
BSD
Участие в разработке
Вопросы, запросы на функции, идеи приветствуются и могут быть опубликованы в разделе Issues. Запросы на изменение также приветствуются. Предпочтительно создавайте отдельную ветку и, при отправке, объединяйте свои коммиты в один (с описательным сообщением).
Участники
ansible-galaxy install bertvv/ansible-role-dhcp