diff --git a/group_vars/dhcp.yml b/group_vars/dhcp.yml new file mode 100644 index 0000000000000000000000000000000000000000..314f2b0d778a33ca3606b394e22d9fd3d6e677cf --- /dev/null +++ b/group_vars/dhcp.yml @@ -0,0 +1,98 @@ +--- + +dhcp: + authoritative: True + global_options: + - { key: "interface-mtu", value: "1496" } + global_parameters: [] + subnets: + - { + network: "10.51.0.0/16", + deny_unknown: False, + interface: "eth4", + default_lease_time: "600", + max_lease_time: "7200", + routers: "10.51.0.10", + dns: ["10.51.0.152", "10.51.0.4"], + domain_name: "accueil.crans.org", + domain_search: "accueil.crans.org", + options: + [ + { key: "time-servers", value: "10.51.0.10" }, + { key: "ntp-servers", value: "10.51.0.10" }, + { key: "ip-forwarding", value: "off" }, + ], + range: ["10.51.1.0", "10.51.255.255"], + } + - { + network: "10.231.148.0/24", + deny_unknown: False, + interface: "eth2", + default_lease_time: "8600", + routers: "10.231.148.254", + dns: ["10.231.148.152", "10.231.148.4"], + domain_name: "borne.crans.org", + domain_search: "borne.crans.org", + options: + [ + { key: "time-servers", value: "10.231.148.98" }, + { key: "ntp-servers", value: "10.231.148.98" }, + { key: "ip-forwarding", value: "off" }, + ], + lease_file: "/var/local/re2o-services/dhcp/generated/dhcp.borne.crans.org.list", + } + - { + network: "185.230.78.0/24", + deny_unknown: True, + interface: "enp1s3", + default_lease_time: "86400", + routers: "185.230.78.254", + dns: ["185.230.78.152", "185.230.78.4"], + domain_name: "adh.crans.org", + domain_search: "adh.crans.org", + options: + [ + { key: "time-servers", value: "185.230.79.98" }, + { key: "ntp-servers", value: "185.230.79.98" }, + { key: "ip-forwarding", value: "off" }, + { key: "smtp-server", value: "185.230.79.39" }, + ], + lease_file: "/var/local/re2o-services/dhcp/generated/dhcp.adh.crans.org.list", + } + - { + network: "10.54.0.0/19", + deny_unknown: True, + interface: "eth6", + default_lease_time: "86400", + routers: "10.54.0.254", + dns: ["10.54.0.152", "10.54.0.4"], + domain_name: "fil.crans.org", + domain_search: "fil.crans.org", + options: + [ + { key: "time-servers", value: "185.230.79.98" }, + { key: "ntp-servers", value: "185.230.79.98" }, + { key: "ip-forwarding", value: "off" }, + { key: "smtp-server", value: "185.230.79.39" }, + ], + lease_file: "/var/local/re2o-services/dhcp/generated/dhcp.fil.crans.org.list", + } + - { + network: "10.53.0.0/19", + deny_unknown: False, # For Federez + interface: "ens2", + default_lease_time: "86400", + routers: "10.53.0.254", + dns: ["10.53.0.152", "10.53.0.4"], + domain_name: "wifi.crans.org", + domain_search: "wifi.crans.org", + options: + [ + { key: "time-servers", value: "185.230.79.98" }, + { key: "ntp-servers", value: "185.230.79.98" }, + { key: "ip-forwarding", value: "off" }, + { key: "smtp-server", value: "185.230.79.39" }, + ], + lease_file: "/var/local/re2o-services/dhcp/generated/dhcp.wifi.crans.org.list", + range: ["10.53.21.0", "10.53.25.254"] + } diff --git a/hosts b/hosts index 5bf049cfd729ed358dc11706d3bf85ac12bc82c1..1c974fcbd17508587d494b72cbf99c08c8f01bd7 100644 --- a/hosts +++ b/hosts @@ -4,6 +4,11 @@ # > We name servers according to location, then type. # > Then we regroup everything in global geographic and type groups. + +[dhcp] +dhcp.adm.crans.org + + [router] odlyd.adm.crans.org eap.adm.crans.org diff --git a/plays/dhcp.yml b/plays/dhcp.yml index 07cd132b3a6a8d9ad78eebe30a7e03cd8ee0aa00..4bf5865948253c7b8c2cc856ff121426c0a2ab1f 100755 --- a/plays/dhcp.yml +++ b/plays/dhcp.yml @@ -2,7 +2,5 @@ --- # Deploy DHCP server - hosts: dhcp.adm.crans.org - vars: - dhcp: - authoritative: true - roles: ["isc-dhcp-server"] + roles: + - isc-dhcp-server diff --git a/roles/isc-dhcp-server/templates/dhcp/dhcpd.conf.j2 b/roles/isc-dhcp-server/templates/dhcp/dhcpd.conf.j2 index 8be15508f963b474656ead4319279a681e9beaaa..70b5f5e0b27b980f96d6edf96d8da8d347149536 100644 --- a/roles/isc-dhcp-server/templates/dhcp/dhcpd.conf.j2 +++ b/roles/isc-dhcp-server/templates/dhcp/dhcpd.conf.j2 @@ -1,15 +1,14 @@ # dhcpd.conf -{{ ansible_header | comment }} -# option definitions common to all supported networks... -#option domain-name "example.org"; -#option domain-name-servers ns1.example.org, ns2.example.org; +{{ ansible_header | comment }} -# We have tagged network so use last 4 bytes for tag (1500 max) -option interface-mtu 1496; +{% for option in dhcp.global_options %} +option {{ option.key }} {{ option.value }}; +{% endfor %} -default-lease-time 600; -max-lease-time 7200; +{% for parameter in dhcp.global_parameters %} +{{ parameter.key }} {{ parameter.value }}; +{% endfor %} # The ddns-updates-style parameter controls whether or not the server will # attempt to do a DNS update when a lease is confirmed. We default to the @@ -27,6 +26,48 @@ authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection). -#log-facility local7; +log-facility local7; + + +{% if dhcp.failover is defined %} +include "./dhcp-failover.conf"; +{% endif %} + -# TODO +{% for subnet in dhcp.subnets %} +subnet {{ subnet.network | ipaddr('network') }} netmask {{ subnet.network | ipaddr('netmask') }} { + interface "{{ subnet.interface }}"; +{% if subnet.default_lease_time is defined %} + default-lease-time {{ subnet.default_lease_time }}; +{% endif %} +{% if subnet.max_lease_time is defined %} + max-lease-time {{ subnet.max_lease_time }}; +{% endif %} + option subnet-mask {{ subnet.network | ipaddr('netmask') }}; + option broadcast-address {{ subnet.network | ipaddr('broadcast') }}; + option routers {{ subnet.routers }}; + option domain-name-servers {{ subnet.dns | join(", ") }}; + option domain-name "{{ subnet.domain_name }}"; + option domain-search "{{ subnet.domain_search }}"; +{% for option in subnet.options %} + option {{ option.key }} {{ option.value }}; +{% endfor %} +{% if subnet.lease_file is defined %} + include "{{ subnet.lease_file }}"; +{% endif %} +{% if subnet.range is defined %} + pool { + {% if dhcp.failover is defined %} + failover peer {{ dhcp.failover.name }} + {% endif %} + range {{ subnet.range | join(" ")}}; + } + {% endif %} + +{% if subnet.deny_unknown %} + deny unknown-clients; +{% else %} + allow unknown-clients; +{% endif %} +} +{% endfor %}