ๅ่จ
็ถไฝ ้่ฆๅๆ็ถญ้ๅคๅฐ Linux ไธปๆฉๆ,็ถฒ่ทฏ่จญๅฎ(IP、DNS、Gateway、้ๆ ่ทฏ็ฑ)่ฅไป้ ไบบๅทฅ้ๅฐ่ชฟๆด, ไธๅช่ๆ,ไนๅฎนๆๅจ่ฎๆดๆ้ ๆ้ฃ็ทไธญๆท。ๆฌๆไปฅ Ansible ๅฏฆๆฐ่งๅบฆ,็คบ็ฏๅฆไฝ็จ「่ง่ฒๅ + ๆจกๆฟๅ + ๅๆนๅฅ็จ」 ้ไธญ็ฎก็ Netplan ่้ๆ ่ทฏ็ฑ,ไธฆๅ ๅ ฅ้ฉ่ญ่ๅๆปพ็ญ็ฅ,้ไฝๅคง่ฆๆจก็ถฒ่ทฏ่ฎๆด้ขจ้ช。
้ฉ็จ็ฏๅ่ๅ็ฝฎๆขไปถ
- ้ฉ็จ:ไฝฟ็จ Netplan ็ Linux(ๅธธ่ฆๆผ Ubuntu Server / Ubuntu Desktop)。
- ๆงๅถ็ซฏ:ๅทฒๅฎ่ฃ
ansible(ๅปบ่ญฐ 2.14+ ไปฅไธ)。 - ๅๆง็ซฏ:ๅฏ SSH ็ปๅ
ฅ、ๅ
ท
sudoๆฌ้,ไธ/etc/netplan/ๅญๅจ。 - ่ชๅฝๅๅฅฝ:ๆ่กๅ งๅฎนไธญไฝฟ็จ Gateway。
๐งญ ่กๅๆธ ๅฎ
✅ ๅปบ็ซ Ansible ๅฐๆก็ตๆง(roles + templates + group_vars/host_vars)
✅ ็จ Jinja2 ๆจกๆฟ็ตฑไธ่ผธๅบ /etc/netplan/*.yaml(ๅซ IP / DNS / Gateway / ้ๆ
่ทฏ็ฑ)
✅ ๅฅ็จๅๅ
netplan generate ้ฉ่ญ่ชๆณ
✅ ไปฅ serial ๅๆนๅฅ็จ,ๅฅ็จๅพๅ่ทฏ็ฑ่้ฃ้ๆง้ฉ่ญ
✅ ๅคฑๆๅฏๅๆปพ่ณๅไปฝ่จญๅฎ,้ไฝๅคง่ฆๆจกๆท็ท้ขจ้ช
ๅฐๆก็ตๆง(ๅปบ่ญฐ)
ansible-netplan/
├─ inventory/
│ ├─ hosts.ini
├─ group_vars/
│ ├─ netplan_hosts.yml
├─ host_vars/
│ ├─ host01.yml
│ ├─ host02.yml
├─ playbooks/
│ ├─ netplan.yml
├─ roles/
│ ├─ netplan/
│ ├─ tasks/
│ │ └─ main.yml
│ ├─ handlers/
│ │ └─ main.yml
│ ├─ templates/
│ │ └─ 01-netcfg.yaml.j2
│ └─ defaults/
│ └─ main.yml
Inventory(็คบไพ)
[netplan_hosts]
host01 ansible_host=10.10.10.11
host02 ansible_host=10.10.10.12
[netplan_hosts:vars]
ansible_user=ubuntu
ansible_become=true
ansible_become_method=sudo
่ฎๆธ่จญ่จ:ๆ「่จญๅฎ」่ฎๆ่ณๆ
ๆไฝณๅฏฆๅๆฏๆ Netplan ๅ
งๅฎนๆๆ「่ณๆ(vars)」่「่ผธๅบ(template)」,่ฎไฝ ๅช่ชฟๆด่ฎๆธๅฐฑ่ฝๅ
จ็ซไธ่ดไธ็ผ。
ไปฅไธ็คบ็ฏๅจ group_vars/netplan_hosts.yml ๆพๅ
ฑ็จ่จญๅฎ,ๅ็จ host_vars ่ฆๅฏซๅทฎ็ฐ。
group_vars/netplan_hosts.yml(ๅ ฑ็จ)
netplan_filename: "01-netcfg.yaml"
netplan_renderer: "networkd" # ๅฏ้ธ networkd / NetworkManager
netplan_apply: true
netplan_ethernets:
- name: "ens160"
dhcp4: false
addresses: [] # ๆฏๅฐไธปๆฉ็จ host_vars ่ฆๅฏซ
gateway4: "" # ๆฏๅฐไธปๆฉ็จ host_vars ่ฆๅฏซ
nameservers:
addresses: ["1.1.1.1", "8.8.8.8"]
routes:
- to: "10.20.0.0/16"
via: "10.10.10.1"
metric: 100
- to: "172.16.0.0/12"
via: "10.10.10.254"
metric: 110
host_vars/host01.yml(ๅๅฅ่ฆๅฏซ)
netplan_ethernets:
- name: "ens160"
dhcp4: false
addresses: ["10.10.10.11/24"]
gateway4: "10.10.10.1"
nameservers:
addresses: ["1.1.1.1", "8.8.8.8"]
routes:
- to: "10.20.0.0/16"
via: "10.10.10.1"
metric: 100
- to: "172.16.0.0/12"
via: "10.10.10.254"
metric: 110
host_vars/host02.yml(ๅๅฅ่ฆๅฏซ)
netplan_ethernets:
- name: "ens160"
dhcp4: false
addresses: ["10.10.10.12/24"]
gateway4: "10.10.10.1"
nameservers:
addresses: ["1.1.1.1", "8.8.8.8"]
routes:
- to: "10.30.0.0/16"
via: "10.10.10.1"
metric: 100
Netplan ๆจกๆฟ:roles/netplan/templates/01-netcfg.yaml.j2
# This file is managed by Ansible. DO NOT EDIT MANUALLY.
network:
version: 2
renderer: {{ netplan_renderer }}
ethernets:
{% for nic in netplan_ethernets %}
{{ nic.name }}:
dhcp4: {{ nic.dhcp4 | default(false) | bool | lower }}
{% if nic.addresses is defined and (nic.addresses | length) > 0 %}
addresses:
{% for addr in nic.addresses %}
- {{ addr }}
{% endfor %}
{% endif %}
{% if nic.gateway4 is defined and nic.gateway4 %}
gateway4: {{ nic.gateway4 }}
{% endif %}
{% if nic.nameservers is defined and nic.nameservers.addresses is defined and (nic.nameservers.addresses | length) > 0 %}
nameservers:
addresses:
{% for dns in nic.nameservers.addresses %}
- {{ dns }}
{% endfor %}
{% endif %}
{% if nic.routes is defined and (nic.routes | length) > 0 %}
routes:
{% for r in nic.routes %}
- to: {{ r.to }}
via: {{ r.via }}
{% if r.metric is defined %}
metric: {{ r.metric }}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
Role:defaults / handlers / tasks(ๅฅ็จ、้ฉ่ญ、ๅๆปพ)
roles/netplan/defaults/main.yml
netplan_filename: "01-netcfg.yaml"
netplan_renderer: "networkd"
netplan_apply: true
netplan_ethernets: []
roles/netplan/handlers/main.yml
- name: netplan_generate
become: true
ansible.builtin.command: "netplan generate"
- name: netplan_apply
become: true
ansible.builtin.command: "netplan apply"
roles/netplan/tasks/main.yml(ๅซ้ฉ่ญ่ๅๆปพ้ชจๆถ)
- name: Ensure netplan directory exists
become: true
ansible.builtin.file:
path: /etc/netplan
state: directory
mode: "0755"
- name: Set paths
ansible.builtin.set_fact:
netplan_path: "/etc/netplan/{{ netplan_filename }}"
netplan_backup_path: "/etc/netplan/{{ netplan_filename }}.bak.ansible"
- name: Backup current netplan file if exists
become: true
ansible.builtin.copy:
src: "{{ netplan_path }}"
dest: "{{ netplan_backup_path }}"
remote_src: true
mode: "0644"
ignore_errors: true
- name: Deploy netplan config from template
become: true
ansible.builtin.template:
src: "{{ netplan_filename }}.j2"
dest: "{{ netplan_path }}"
mode: "0644"
- name: Validate netplan syntax (generate)
become: true
ansible.builtin.command: "netplan generate"
register: netplan_generate_result
changed_when: false
- name: Apply netplan
become: true
ansible.builtin.command: "netplan apply"
when: netplan_apply | bool
register: netplan_apply_result
changed_when: false
- name: Show routes (post)
become: true
ansible.builtin.command: "ip route show"
register: ip_route_post
changed_when: false
Playbook:playbooks/netplan.yml(ๅๆนๅฅ็จ)
- name: Batch manage netplan and static routes
hosts: netplan_hosts
become: true
serial: "10%"
any_errors_fatal: true
roles:
- role: netplan
ๅท่กๆนๅผ่้ฉ่ญๅปบ่ญฐ
1) Check Mode ็ๅทฎ็ฐ
ansible-playbook -i inventory/hosts.ini playbooks/netplan.yml --check --diff
2) ๆญฃๅผๅฅ็จ(ๅๆน)
ansible-playbook -i inventory/hosts.ini playbooks/netplan.yml
3) ๅฅ็จๅพ้ฉ่ญ(ไธปๆฉ็ซฏ)
ip addr
ip route show
systemctl status systemd-networkd --no-pager || true
systemctl status NetworkManager --no-pager || true
๐ ็ต่ช
ๆ Netplan ่้ๆ ่ทฏ็ฑ「่ณๆๅ、ๆจกๆฟๅ、่ง่ฒๅ」,ๅ้ ๅๅๆนๅฅ็จ่ๅบๆฌ้ฉ่ญ, ๅฐฑ่ฝไปฅ Infrastructure as Code ็ๆนๅผ็ฎก็ๅคง้ไธปๆฉ็ถฒ่ทฏ่จญๅฎ,่ฎ่ฎๆดๆดๅฏๆง、ๅฏ่ฟฝๆบฏไธๆดๅฎๅ จ。
๐ฌ ็่จไบๅ:ไฝ ็็ฐๅข่้ๆฑๆฏไป้บผ?
ๅฆๆไฝ ๅจๅฅ็จ Netplan / ้ๆ ่ทฏ็ฑๆ้ๅฐๆท็ท、ไธๅ renderer ่ก็บๅทฎ็ฐ、ๆๆณๆฏๆด VLAN / ๅค NIC / policy routing, ๆญก่ฟๅจ็่จๆไพไปฅไธ่ณ่จ,ๆๅฏไปฅๅๅฉไฝ ๆ Playbook ่ชฟๆดๆๆด่ฒผ่ฟๅฏฆ้ๅ ดๆฏ็็ๆฌ。
- ไฝๆฅญ็ณป็ตฑ็ๆฌ(ไพๅฆ Ubuntu 22.04/24.04)่ renderer(networkd / NetworkManager)
- ไป้ขๅ็จฑ(ไพๅฆ ens160、bond0、vlan10)่ IP ่ฆๅ
- Gateway ่้่ฆ็้ๆ ่ทฏ็ฑ(to/via/metric)
- ๆฏๅฆ้ๅๆต(ๅคๅบๅฃ)、ๆ้ policy routing / routing table
ๅปถไผธ้ฑ่ฎ
- ๐ Linux Netplan ่ ifcfg ่จญๅฎๆด็(ๅบ็คๅฐ็ ง)
- ๐งฉ Linux IPv6:Netplan ่ ifcfg ่จญๅฎ็ฏไพ่ๆณจๆไบ้
- ๐ง Linux ้ฒ้็ถฒ่ทฏ่จญๅฎๅคงๅ จ(่ทฏ็ฑ/ๅคไป้ข/้ฒ้่งๅฟตๅฝๆด)
- ๐ Linux OpenVPN:PKI ่ Client Routing ่จญ่จ(่ทฏ็ฑ่ๅๆต่งๅฟตๅปถไผธ)
- ๐ Proxmox ่ชๅๅ:CLI / API / Ansible(Ansible ่ชๅๅ่็ตกๅปถไผธ)
- ๐งญ Windows ้ๆ ่ทฏ็ฑ่จญๅฎ(่ทจๅนณๅฐ่งๅฟตๅฐ็ ง)
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ