Ubuntu DHCP 自动化部署实践
一 方案总览
二 手动步骤速览(用于理解自动化要封装的动作)
三 自动化方案一 Bash 脚本一键部署
#!/usr/bin/env bash set -Eeuo pipefail read -rp "服务器静态IP(如 192.168.1.10/24): " SERVER_IP read -rp "网关(如 192.168.1.1): " GW read -rp "网卡名(如 eth0/ens33): " NIC read -rp "DNS(逗号分隔,如 8.8.8.8,1.1.1.1): " DNS read -rp "地址池起止(如 192.168.1.100 192.168.1.200): " RANGE_START RANGE_END
apt update -y && apt install -y isc-dhcp-server
mkdir -p /etc/netplan cat >/etc/netplan/01-dhcp-server.yaml <<EOF network: version: 2 ethernets: $NIC: dhcp4: no addresses: [$SERVER_IP] gateway4: $GW nameservers: addresses: [${DNS//,/ }] EOF netplan apply
cp -a /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak.$(date +%F_%T) 2>/dev/null || true PREFIX=$(echo “$SERVER_IP” | cut -d. -f1-3) cat >/etc/dhcp/dhcpd.conf <<EOF option domain-name “local”; option domain-name-servers ${DNS//,/ }; default-lease-time 600; max-lease-time 7200; ddns-update-style none;
subnet $PREFIX.0 netmask 255.255.255.0 { range $RANGE_START $RANGE_END; option routers $GW; option subnet-mask 255.255.255.0; option broadcast-address $PREFIX.255; } EOF
echo “INTERFACESv4="$NIC"” >/etc/default/isc-dhcp-server
ufw allow 67/udp || true ufw allow 68/udp || true
systemctl restart isc-dhcp-server || { journalctl -xeu isc-dhcp-server; exit 1; } systemctl enable isc-dhcp-server
echo -e “\n[OK] DHCP 已部署完成” echo “验证:” echo " systemctl status isc-dhcp-server" echo " 租约:cat /var/lib/dhcp/dhcpd.leases" echo " 客户端获取:在客户端执行 sudo dhclient $NIC 后 ip a"
使用提示
四 自动化方案二 Ansible 角色示例
name: Install ISC DHCP Server apt: name=isc-dhcp-server state=present update_cache=yes
name: Configure netplan static IP copy: dest: /etc/netplan/01-dhcp-server.yaml content: | network: version: 2 ethernets: {{ dhcp_iface }}: dhcp4: no addresses: [{{ server_ip }}] gateway4: {{ gateway }} nameservers: addresses: [{{ dns_servers | replace(‘,’, ’ ') }}] notify: apply netplan
name: Configure DHCP server copy: dest: /etc/dhcp/dhcpd.conf content: | option domain-name “local”; option domain-name-servers {{ dns_servers }}; default-lease-time 600; max-lease-time 7200; ddns-update-style none;
subnet {{ server_ip | regex_replace('/.*','') | regex_replace('\\.\\d+$','.0') }} netmask 255.255.255.0 {
range {{ range_start }} {{ range_end }};
option routers {{ gateway }};
option subnet-mask 255.255.255.0;
option broadcast-address {{ server_ip | regex_replace('/.*','') | regex_replace('\\.\\d+$','.255') }};
}
notify: restart isc-dhcp-server
name: Set listening interface lineinfile: path: /etc/default/isc-dhcp-server regexp: ‘^INTERFACESv4=’ line: ‘INTERFACESv4=“{{ dhcp_iface }}”’
name: Allow DHCP ports in UFW ufw: rule=allow port=67 proto=udp
name: Allow DHCP ports in UFW ufw: rule=allow port=68 proto=udp
handlers:
五 客户端自动化与验证