feat: add dhcpd server role
This commit is contained in:
parent
5fb027c446
commit
1f758deb82
29
roles/dhcpd/README.md
Normal file
29
roles/dhcpd/README.md
Normal file
@ -0,0 +1,29 @@
|
||||
# dhcpd
|
||||
|
||||
ISC DHCP server role for Arch Linux and Debian/Ubuntu.
|
||||
|
||||
## Requirements
|
||||
|
||||
- `dhcpd_interface` must be defined in inventory
|
||||
|
||||
## Configuration
|
||||
|
||||
See [defaults/main.yml](defaults/main.yml) for all available variables.
|
||||
|
||||
## Example
|
||||
|
||||
```yaml
|
||||
dhcpd_interface: "lan0"
|
||||
dhcpd_subnet: "192.168.1.0"
|
||||
dhcpd_range_start: "192.168.1.20"
|
||||
dhcpd_range_end: "192.168.1.200"
|
||||
dhcpd_gateway: "192.168.1.1"
|
||||
dhcpd_dns_servers:
|
||||
- "192.168.1.2"
|
||||
dhcpd_domain_name: "home.lan"
|
||||
|
||||
dhcpd_reservations:
|
||||
- hostname: printer
|
||||
mac: "aa:bb:cc:dd:ee:ff"
|
||||
ip: "192.168.1.10"
|
||||
```
|
||||
27
roles/dhcpd/defaults/main.yml
Normal file
27
roles/dhcpd/defaults/main.yml
Normal file
@ -0,0 +1,27 @@
|
||||
# Network configuration
|
||||
dhcpd_subnet: "192.168.1.0"
|
||||
dhcpd_netmask: "255.255.255.0"
|
||||
dhcpd_range_start: "192.168.1.20"
|
||||
dhcpd_range_end: "192.168.1.200"
|
||||
dhcpd_gateway: "192.168.1.1"
|
||||
dhcpd_dns_servers:
|
||||
- "1.1.1.1"
|
||||
|
||||
# Lease times (in seconds)
|
||||
dhcpd_default_lease_time: 86400 # 24 hours
|
||||
dhcpd_max_lease_time: 172800 # 48 hours
|
||||
|
||||
# Interface to listen on (required)
|
||||
# dhcpd_interface: "lan0"
|
||||
|
||||
# Domain name (optional)
|
||||
# dhcpd_domain_name: "home.lan"
|
||||
|
||||
# Static reservations
|
||||
# dhcpd_reservations:
|
||||
# - hostname: printer
|
||||
# mac: "aa:bb:cc:dd:ee:ff"
|
||||
# ip: "192.168.1.10"
|
||||
# - hostname: nas
|
||||
# mac: "11:22:33:44:55:66"
|
||||
# ip: "192.168.1.2"
|
||||
5
roles/dhcpd/handlers/main.yml
Normal file
5
roles/dhcpd/handlers/main.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- name: Restart dhcpd
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ dhcpd_service }}"
|
||||
state: restarted
|
||||
46
roles/dhcpd/tasks/main.yml
Normal file
46
roles/dhcpd/tasks/main.yml
Normal file
@ -0,0 +1,46 @@
|
||||
---
|
||||
- name: Validate required variables
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- dhcpd_interface is defined
|
||||
- dhcpd_interface | length > 0
|
||||
fail_msg: |
|
||||
dhcpd_interface is required.
|
||||
See roles/dhcpd/defaults/main.yml for configuration instructions.
|
||||
success_msg: "Variable validation passed"
|
||||
|
||||
- name: Load OS-specific variables
|
||||
ansible.builtin.include_vars: "{{ item }}"
|
||||
with_first_found:
|
||||
- "{{ ansible_facts['os_family'] | lower }}.yml"
|
||||
- "debian.yml"
|
||||
|
||||
- name: Install DHCP server
|
||||
ansible.builtin.package:
|
||||
name: "{{ dhcpd_package }}"
|
||||
state: present
|
||||
|
||||
- name: Deploy DHCP server configuration
|
||||
ansible.builtin.template:
|
||||
src: dhcpd.conf.j2
|
||||
dest: "{{ dhcpd_config_path }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
notify: Restart dhcpd
|
||||
|
||||
- name: Configure interface for DHCP server (Debian)
|
||||
ansible.builtin.template:
|
||||
src: isc-dhcp-server.j2
|
||||
dest: "{{ dhcpd_defaults_path }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
when: ansible_facts['os_family'] | lower == 'debian'
|
||||
notify: Restart dhcpd
|
||||
|
||||
- name: Enable and start DHCP server
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ dhcpd_service }}"
|
||||
enabled: true
|
||||
state: started
|
||||
28
roles/dhcpd/templates/dhcpd.conf.j2
Normal file
28
roles/dhcpd/templates/dhcpd.conf.j2
Normal file
@ -0,0 +1,28 @@
|
||||
# {{ ansible_managed }}
|
||||
|
||||
# Global options
|
||||
default-lease-time {{ dhcpd_default_lease_time }};
|
||||
max-lease-time {{ dhcpd_max_lease_time }};
|
||||
|
||||
authoritative;
|
||||
|
||||
{% if dhcpd_domain_name is defined %}
|
||||
option domain-name "{{ dhcpd_domain_name }}";
|
||||
{% endif %}
|
||||
option domain-name-servers {{ dhcpd_dns_servers | join(', ') }};
|
||||
|
||||
# Subnet configuration
|
||||
subnet {{ dhcpd_subnet }} netmask {{ dhcpd_netmask }} {
|
||||
range {{ dhcpd_range_start }} {{ dhcpd_range_end }};
|
||||
option routers {{ dhcpd_gateway }};
|
||||
}
|
||||
|
||||
# Static reservations
|
||||
{% if dhcpd_reservations is defined %}
|
||||
{% for host in dhcpd_reservations %}
|
||||
host {{ host.hostname }} {
|
||||
hardware ethernet {{ host.mac }};
|
||||
fixed-address {{ host.ip }};
|
||||
}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
5
roles/dhcpd/templates/isc-dhcp-server.j2
Normal file
5
roles/dhcpd/templates/isc-dhcp-server.j2
Normal file
@ -0,0 +1,5 @@
|
||||
# {{ ansible_managed }}
|
||||
# Defaults for isc-dhcp-server
|
||||
|
||||
INTERFACESv4="{{ dhcpd_interface }}"
|
||||
INTERFACESv6=""
|
||||
3
roles/dhcpd/vars/archlinux.yml
Normal file
3
roles/dhcpd/vars/archlinux.yml
Normal file
@ -0,0 +1,3 @@
|
||||
dhcpd_package: dhcp
|
||||
dhcpd_service: dhcpd4
|
||||
dhcpd_config_path: /etc/dhcpd.conf
|
||||
4
roles/dhcpd/vars/debian.yml
Normal file
4
roles/dhcpd/vars/debian.yml
Normal file
@ -0,0 +1,4 @@
|
||||
dhcpd_package: isc-dhcp-server
|
||||
dhcpd_service: isc-dhcp-server
|
||||
dhcpd_config_path: /etc/dhcp/dhcpd.conf
|
||||
dhcpd_defaults_path: /etc/default/isc-dhcp-server
|
||||
Loading…
Reference in New Issue
Block a user