在 Linux 系統上搭建 PXE(Preboot Execution Environment)伺服器,可以實現網路啟動功能,允許客戶端計算機從網路載入作業系統或安裝程式。以下是設定 PXE 伺服器的基本步驟。

suv789發表於2024-12-02

在 Linux 系統上搭建 PXE(Preboot Execution Environment)伺服器,可以實現網路啟動功能,允許客戶端計算機從網路載入作業系統或安裝程式。以下是設定 PXE 伺服器的基本步驟。

1. 安裝必要的軟體包

首先,你需要確保安裝了以下軟體包:

  • dnsmasq:提供 DHCP、TFTP 和 DNS 服務。
  • tftpd-hpa 或其他 TFTP 伺服器:用於傳輸啟動檔案。
  • nfs-kernel-serverhttpd:如果需要透過 NFS 或 HTTP 提供作業系統安裝檔案。

使用以下命令在 Debian/Ubuntu 系統上安裝這些軟體包:

bashCopy Code
sudo apt update
sudo apt install dnsmasq tftpd-hpa nfs-kernel-server

對於 RHEL/CentOS 系統:

bashCopy Code
sudo yum install dnsmasq tftp-server nfs-utils

2. 配置 dnsmasq (DHCP 和 TFTP 伺服器)

dnsmasq 是一個輕量級的網路服務,能夠提供 DHCP 和 TFTP 服務。你需要編輯其配置檔案來指定相關設定。

編輯 /etc/dnsmasq.conf 檔案:

bashCopy Code
sudo nano /etc/dnsmasq.conf

新增以下配置:

bashCopy Code
# 設定 TFTP 伺服器的根目錄
enable-tftp
tftp-root=/srv/tftp

# 啟用 DHCP 服務並分配 IP 地址範圍
dhcp-range=192.168.1.20,192.168.1.50,12h
dhcp-option=3,192.168.1.1    # 預設閘道器
dhcp-option=6,8.8.8.8        # DNS 伺服器

# 指定網路啟動的啟動檔案
dhcp-boot=pxelinux.0,pxeserver,192.168.1.1
  • tftp-root 設定 TFTP 伺服器的根目錄,用於存放 PXE 啟動檔案。
  • dhcp-range 設定 DHCP 服務的 IP 地址池。
  • dhcp-option 用於指定閘道器和 DNS 伺服器。
  • dhcp-boot 指定啟動檔案,這裡是 pxelinux.0,你可以根據實際需要調整。

3. 設定 TFTP 伺服器

編輯 /etc/default/tftpd-hpa 檔案以設定 TFTP 伺服器:

bashCopy Code
sudo nano /etc/default/tftpd-hpa

確保檔案內容如下:

bashCopy Code
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

然後重新啟動 tftpd-hpa 服務:

bashCopy Code
sudo systemctl restart tftpd-hpa

4. 準備 PXE 啟動檔案

你需要準備 PXE 啟動所需的檔案,如 pxelinux.0、核心映像檔案(vmlinuz)和根檔案系統映像(initrd.img)。你可以從安裝映象中提取這些檔案。

示例:

  1. pxelinux.0:這是 PXELINUX 啟動載入程式,可以從 Syslinux 下載。
  2. 核心檔案:可以從 Linux 安裝映象中獲取,例如 vmlinuz
  3. 根檔案系統:例如 initrd.img

將這些檔案複製到 /srv/tftp 目錄下:

bashCopy Code
sudo mkdir -p /srv/tftp/pxelinux.cfg
sudo cp /path/to/pxelinux.0 /srv/tftp
sudo cp /path/to/vmlinuz /srv/tftp
sudo cp /path/to/initrd.img /srv/tftp

5. 配置啟動選單

/srv/tftp/pxelinux.cfg 目錄下,建立一個名為 default 的檔案,用於指定 PXE 啟動選單的配置:

bashCopy Code
sudo nano /srv/tftp/pxelinux.cfg/default

新增以下內容:

bashCopy Code
DEFAULT menu.c32
PROMPT 0
TIMEOUT 50
ONTIMEOUT local

MENU TITLE PXE Boot Menu

LABEL linux
  MENU LABEL Install Linux
  KERNEL vmlinuz
  APPEND initrd=initrd.img root=/dev/nfs nfsroot=192.168.1.1:/srv/nfs/linux-install

6. 配置 NFS 共享(如果使用 NFS 提供安裝源)

如果你打算透過 NFS 提供作業系統安裝檔案,設定 NFS 伺服器共享目錄。

首先,建立一個共享目錄:

bashCopy Code
sudo mkdir -p /srv/nfs/linux-install

然後,將你的作業系統安裝檔案(例如 isolinux 資料夾、vmlinuzinitrd.img)複製到這個目錄中。

編輯 /etc/exports 檔案,新增以下行以共享目錄:

bashCopy Code
sudo nano /etc/exports
bashCopy Code
/srv/nfs/linux-install 192.168.1.0/24(rw,sync,no_root_squash)

接著重新載入 NFS 配置:

bashCopy Code
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

7. 啟動 PXE 伺服器

最後,重啟 dnsmasq 服務以使配置生效:

bashCopy Code
sudo systemctl restart dnsmasq

8. 配置客戶端計算機

  1. 在客戶端計算機的 BIOS 或 UEFI 設定中,確保啟用了網路啟動(PXE Boot)。
  2. 將客戶端計算機設定為透過網路啟動(PXE啟動)啟動。

當客戶端計算機啟動時,它將透過網路獲取 IP 地址,下載 PXE 啟動檔案,並根據你配置的選單啟動作業系統安裝過程。

透過以上步驟,你已經在 Linux 系統上搭建了一個基本的 PXE 伺服器,可以讓客戶端透過網路啟動並安裝作業系統。如果你有更復雜的需求,例如支援多個作業系統或使用其他協議(如 HTTP),你可以根據需要進一步配置和定製 PXE 伺服器。


9. 配置 HTTP 服務(如果透過 HTTP 提供安裝源)

如果你希望透過 HTTP 提供作業系統安裝檔案(而不是 NFS),可以配置一個 HTTP 伺服器(如 Apache)來提供檔案。這通常用於提供更高的效能,尤其是在客戶端數量較多時。

安裝 Apache Web 伺服器

如果你的系統尚未安裝 Apache,可以使用以下命令進行安裝:

bashCopy Code
# Debian/Ubuntu
sudo apt update
sudo apt install apache2

# CentOS/RHEL
sudo yum install httpd

配置 Apache 伺服器

  1. 建立一個目錄來存放安裝映象(例如 /srv/httpd/linux-install):

    bashCopy Code
    sudo mkdir -p /srv/httpd/linux-install
  2. 將作業系統安裝檔案(如 vmlinuzinitrd.img、安裝映象)複製到該目錄中:

    bashCopy Code
    sudo cp /path/to/vmlinuz /srv/httpd/linux-install/
    sudo cp /path/to/initrd.img /srv/httpd/linux-install/
  3. 修改 Apache 配置檔案,使其能夠提供該目錄的檔案。在 /etc/apache2/sites-available/000-default.conf(Debian/Ubuntu)或 /etc/httpd/conf/httpd.conf(CentOS/RHEL)中,加入以下配置:

    bashCopy Code
    <Directory /srv/httpd/linux-install>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
  4. 重啟 Apache 服務以應用配置:

    bashCopy Code
    sudo systemctl restart apache2  # Debian/Ubuntu
    sudo systemctl restart httpd    # CentOS/RHEL

修改 PXE 配置檔案

如果你使用 HTTP 伺服器提供安裝檔案,在 /srv/tftp/pxelinux.cfg/default 中修改啟動選單配置,使用 HTTP 路徑來載入 vmlinuzinitrd.img。假設 Apache 伺服器的 IP 地址是 192.168.1.1,你可以做如下更改:

bashCopy Code
DEFAULT menu.c32
PROMPT 0
TIMEOUT 50
ONTIMEOUT local

MENU TITLE PXE Boot Menu

LABEL linux
  MENU LABEL Install Linux
  KERNEL http://192.168.1.1/linux-install/vmlinuz
  APPEND initrd=http://192.168.1.1/linux-install/initrd.img root=/dev/nfs nfsroot=192.168.1.1:/srv/nfs/linux-install

10. 測試和故障排除

  • 客戶端無法從網路啟動:確保客戶端計算機的 BIOS/UEFI 設定已啟用網路啟動(PXE)。通常,BIOS/UEFI 會提供 "Boot Order" 選項,你需要將 "Network Boot" 或 "PXE Boot" 設定為首選啟動裝置。

  • TFTP 傳輸失敗:如果客戶端在 TFTP 過程中超時,檢查 /srv/tftp 目錄的許可權,確保 TFTP 服務對該目錄具有讀許可權。你可以透過以下命令檢查目錄許可權:

    bashCopy Code
    sudo ls -ld /srv/tftp

    如果許可權不足,可以使用以下命令修改許可權:

    bashCopy Code
    sudo chmod -R 755 /srv/tftp
  • NFS 共享無法訪問:檢查 NFS 服務是否正常執行,並且客戶端可以訪問 NFS 共享。使用以下命令檢視共享目錄:

    bashCopy Code
    sudo exportfs -v

    確保共享目錄具有正確的許可權,並且客戶端的 IP 地址範圍已列入允許訪問的列表。

  • HTTP 伺服器無法訪問檔案:如果你使用 HTTP 伺服器,確保 Apache 或 Nginx 配置正確,並且目錄許可權允許客戶端讀取檔案。可以透過訪問 http://<server-ip>/linux-install/ 來驗證是否可以在瀏覽器中訪問檔案。

  • DNSmasq 配置問題:如果 DHCP 或 TFTP 服務沒有正常啟動,檢查 /etc/dnsmasq.conf 檔案中的配置。特別是,確保 DHCP 服務能夠為客戶端分配 IP 地址,並且 dhcp-boot 指定的啟動檔案路徑正確。

11. 自定義 PXE 啟動選單

如果你需要為多個作業系統或不同版本的作業系統提供網路安裝支援,可以在 pxelinux.cfg 目錄下建立多個配置檔案。pxelinux.cfg 目錄中的檔案可以根據客戶端的 MAC 地址或 IP 地址自動選擇配置檔案。

按 MAC 地址配置

假設客戶端的 MAC 地址是 01:23:45:67:89:ab,可以在 pxelinux.cfg 目錄中建立一個名為 01-23-45-67-89-ab 的檔案,配置檔案內容類似:

bashCopy Code
DEFAULT linux
LABEL linux
  MENU LABEL Install Linux
  KERNEL vmlinuz
  APPEND initrd=initrd.img root=/dev/nfs nfsroot=192.168.1.1:/srv/nfs/linux-install

按 IP 地址配置

你還可以根據客戶端的 IP 地址進行配置。例如,建立一個名為 192.168.1.100 的配置檔案,配置檔案內容如下:

bashCopy Code
DEFAULT linux
LABEL linux
  MENU LABEL Install CentOS 8
  KERNEL vmlinuz
  APPEND initrd=initrd.img root=/dev/nfs nfsroot=192.168.1.1:/srv/nfs/centos8

選單增強

你還可以使用 menu.c32pxelinux.cfg 檔案中的 MENULABEL 選項來提供更復雜的選單結構。例如,可以建立多個安裝選項:

bashCopy Code
DEFAULT menu.c32
PROMPT 0
TIMEOUT 50

MENU TITLE PXE Boot Menu

LABEL ubuntu
  MENU LABEL Install Ubuntu 20.04
  KERNEL ubuntu/vmlinuz
  APPEND initrd=ubuntu/initrd.img root=/dev/nfs nfsroot=192.168.1.1:/srv/nfs/ubuntu

LABEL centos
  MENU LABEL Install CentOS 8
  KERNEL centos/vmlinuz
  APPEND initrd=centos/initrd.img root=/dev/nfs nfsroot=192.168.1.1:/srv/nfs/centos

LABEL local
  MENU LABEL Boot local hard disk
  LOCALBOOT 0

12. 自動化和擴充套件

透過配置不同的作業系統映象和安裝指令碼,可以為不同的客戶端提供定製化的安裝方式。此外,你還可以將 PXE 伺服器與其他部署工具(如 KickstartPreseedAnsible)結合使用,自動化作業系統的安裝和配置。

  • Kickstart:CentOS/RHEL 系列作業系統的自動化安裝指令碼。
  • Preseed:用於自動化安裝 Ubuntu/Debian 作業系統的指令碼。

透過將這些自動化工具整合到 PXE 安裝流程中,你可以實現完全無人值守的作業系統安裝,尤其適合批次部署。

透過 PXE 伺服器,你可以實現無盤啟動、作業系統網路安裝等功能,簡化 IT 管理工作。配置 PXE 伺服器雖然需要一些步驟,但一旦搭建完成,它能為網路中的各類客戶端提供靈活的作業系統安裝方式。透過 NFS、HTTP 等協議,你可以根據需求提供不同型別的安裝源和啟動檔案,從而實現更高效的網路安裝和維護。


13. 使用 Kickstart 進行自動化安裝

Kickstart 是一種用於自動化安裝 CentOS、RHEL、Fedora 等 Linux 系統的工具。它允許你定義作業系統安裝過程中的各種設定,如分割槽、軟體包選擇、網路配置等,從而實現完全無人值守的安裝。你可以將 Kickstart 檔案與 PXE 結合使用,提供定製化的安裝方式。

建立 Kickstart 配置檔案

  1. 基本的 Kickstart 檔案示例:

    建立一個名為 ks.cfg 的檔案,內容如下:

    bashCopy Code
    #version=RHEL7
    install
    url --url=http://192.168.1.1/centos/7/
    lang en_US.UTF-8
    keyboard us
    network --bootproto=dhcp --device=eth0 --onboot=on
    rootpw --iscrypted \$6$....  # 加密的 root 密碼
    firewall --enabled --service=ssh
    timezone America/New_York
    authconfig --enableshadow --passalgo=sha512
    selinux --permissive
    reboot
    %packages
    @core
    %end

    該檔案配置了安裝源、語言設定、網路設定、分割槽、時間區域、防火牆、SELinux 等安裝選項。

    • url --url=http://192.168.1.1/centos/7/:指定作業系統的安裝源,可以是 HTTP、NFS 或其他型別的檔案伺服器。
    • rootpw --iscrypted \$6$....:設定 root 使用者的密碼,可以使用加密的密碼。
    • %packages 部分:定義要安裝的軟體包,這裡是安裝一個最基本的 @core 軟體包集。
  2. 將 Kickstart 檔案放置到網路伺服器:

    ks.cfg 檔案複製到 PXE 伺服器上,或者放置在 HTTP 伺服器提供的共享目錄中。例如,如果你使用 HTTP 提供安裝檔案,將 ks.cfg 複製到 /srv/httpd/centos7/ 目錄:

    bashCopy Code
    sudo cp ks.cfg /srv/httpd/centos7/
  3. 修改 PXE 配置檔案:

    編輯 PXE 配置檔案,使其呼叫 Kickstart 檔案。假設你已經在 PXE 伺服器上設定了 CentOS 7 的安裝檔案,並且 HTTP 伺服器的 IP 地址是 192.168.1.1,你可以將以下內容新增到 /srv/tftp/pxelinux.cfg/default 配置檔案:

    bashCopy Code
    DEFAULT menu.c32
    PROMPT 0
    TIMEOUT 50
    
    MENU TITLE PXE Boot Menu
    
    LABEL Install CentOS 7
      MENU LABEL Install CentOS 7 (Automated)
      KERNEL http://192.168.1.1/centos7/images/pxeboot/vmlinuz
      APPEND initrd=http://192.168.1.1/centos7/images/pxeboot/initrd.img ks=http://192.168.1.1/centos7/ks.cfg

    該配置在安裝時自動載入 Kickstart 檔案。ks=http://192.168.1.1/centos7/ks.cfg 引數指定了 Kickstart 配置檔案的路徑。

啟動安裝

透過 PXE 啟動客戶端計算機時,安裝程式將自動讀取 Kickstart 檔案,按照預定義的配置進行安裝。這種方式對於批次安裝非常有用,因為它不需要人工干預。

14. 使用 Preseed 配置 Ubuntu/Debian 安裝

Preseed 是類似於 Kickstart 的自動化安裝工具,專為 Ubuntu 和 Debian 系列作業系統設計。Preseed 檔案用於自動化配置作業系統安裝過程,支援網路安裝、分割槽、軟體包選擇等。

建立 Preseed 配置檔案

  1. 基本的 Preseed 檔案示例:

    建立一個名為 preseed.cfg 的檔案,內容如下:

    bashCopy Code
    # Preseed file for Ubuntu installation
    
    # Language and Locale
    d-i locale string en_US.UTF-8
    d-i console-keymaps-at/keymap string us
    
    # Network Configuration
    d-i netcfg/get_hostname string ubuntu-pxe
    d-i netcfg/get_domain string local
    
    # Set up the partitioning
    d-i partman-auto/method string lvm
    d-i partman-lvm/device_remove_lvm bool true
    d-i partman-auto/choose_recipe select atomic
    d-i partman-auto/confirm boolean true
    d-i partman-auto/commit boolean true
    
    # Set the root password
    d-i passwd/root-password password mypassword
    d-i passwd/root-password-again password mypassword
    
    # Set the timezone
    d-i time/zone string America/New_York
    
    # Install packages
    tasksel tasksel/first multiselect ubuntu-server
    d-i pkgsel/include string openssh-server build-essential
    
    # Run after installation
    d-i preseed/late_command string in-target apt-get update; in-target apt-get install -y vim
    
    # Finish installation
    d-i finish-install/reboot_in_progress note

    該檔案配置了語言、網路、分割槽、時區、安裝的軟體包等資訊,完全自動化了安裝過程。

  2. 將 Preseed 檔案放置到網路伺服器:

    preseed.cfg 檔案放到 PXE 伺服器的某個目錄中,例如 /srv/httpd/ubuntu/

    bashCopy Code
    sudo cp preseed.cfg /srv/httpd/ubuntu/
  3. 修改 PXE 配置檔案:

    編輯 PXE 配置檔案,指向 Preseed 檔案。假設你已經配置好了 Ubuntu 安裝源,並且 HTTP 伺服器的 IP 地址是 192.168.1.1,可以在 /srv/tftp/pxelinux.cfg/default 中新增以下內容:

    bashCopy Code
    DEFAULT menu.c32
    PROMPT 0
    TIMEOUT 50
    
    MENU TITLE PXE Boot Menu
    
    LABEL Install Ubuntu 20.04
      MENU LABEL Install Ubuntu 20.04 (Automated)
      KERNEL http://192.168.1.1/ubuntu/20.04/install/netboot/ubuntu-installer/amd64/linux
      APPEND initrd=http://192.168.1.1/ubuntu/20.04/install/netboot/ubuntu-installer/amd64/initrd.gz preseed/http://192.168.1.1/ubuntu/preseed.cfg

    這裡,preseed/http://192.168.1.1/ubuntu/preseed.cfg 引數指定了 Preseed 配置檔案的位置。

啟動安裝

透過 PXE 啟動 Ubuntu 客戶端時,安裝程式將使用指定的 Preseed 檔案自動完成整個安裝過程。

15. 使用 Ansible 配合 PXE 進行配置管理

除了自動化作業系統安裝,Ansible 還可以用於配置管理和後期部署。你可以結合 PXE 安裝作業系統後,使用 Ansible 在安裝完的系統上進行進一步的配置和管理。

  1. 安裝 Ansible:

    在管理節點(控制節點)上安裝 Ansible:

    bashCopy Code
    sudo apt install ansible  # Debian/Ubuntu
    sudo yum install ansible  # CentOS/RHEL
  2. 編寫 Ansible Playbook:

    建立一個簡單的 Playbook 來安裝常用軟體和進行基礎配置:

    yamlCopy Code
    ---
    - name: Configure new servers
      hosts: all
      become: true
      tasks:
        - name: Update apt cache
          apt:
            update_cache: yes
    
        - name: Install vim and git
          apt:
            name:
              - vim
              - git
            state: present
  3. 執行 Playbook:

    將 Playbook 檔案儲存為 setup.yml,然後執行 Ansible Playbook 來管理新安裝的伺服器:

    bashCopy Code
    ansible-playbook -i inventory setup.yml

    inventory 檔案中,你需要列出所有目標伺服器的 IP 地址或主機名。

透過將 PXE、Kickstart、Preseed 和 Ansible 配合使用,你可以實現一個從作業系統安裝到自動化配置和管理的完整自動化部署流程。

透過 PXE、Kickstart、Preseed 和 Ansible 等工具的結合使用,你可以輕鬆地實現作業系統的網路安裝、批次部署和後期配置管理。這樣的自動化流程不僅能大大提高部署效率,還能確保部署的一致性和可維護性。特別是在大規模伺服器或工作站的管理中,這種方法能夠極大地減少人工干預和出錯的機會。


16. 配置和管理大規模的自動化部署

在大規模資料中心或企業環境中,管理大量伺服器或工作站的部署和配置是一個複雜且繁瑣的任務。結合 PXE、Kickstart/Preseed 和 Ansible 的自動化部署方法,可以實現高效的批次部署和系統管理。以下是如何擴充套件和最佳化這種自動化過程的一些技巧和最佳實踐。

16.1. 批次化的伺服器管理

在大規模環境下,單一的 PXE、Kickstart 或 Preseed 檔案可能不足以覆蓋所有機器的需求。為了實現靈活的批次化管理,可以使用以下方法:

  1. 動態生成配置檔案:

    對於不同的伺服器,可能需要不同的配置,例如硬體配置、軟體包、分割槽方案等。可以根據不同的環境(如生產環境、測試環境、開發環境等)動態生成不同的 Kickstart 或 Preseed 配置檔案。

    • 使用 AnsibleJinja2 模板Python 指令碼 來自動生成配置檔案。例如,可以在 Ansible Playbook 中使用模板引擎生成不同的 Kickstart 配置,或者為每個環境建立單獨的配置檔案並自動分發。
    yamlCopy Code
    - name: Generate Kickstart file for the environment
      template:
        src: "templates/ks.cfg.j2"
        dest: "/tmp/ks.cfg"

    ks.cfg.j2 檔案中使用 Jinja2 模板語法動態插入變數,例如:

    bashCopy Code
    # Kickstart configuration
    install
    url --url={{ repo_url }}
    network --bootproto=dhcp --device=eth0 --onboot=on
    rootpw --iscrypted {{ root_password }}
    firewall --enabled --service=ssh
    timezone {{ timezone }}
  2. 分發和儲存配置檔案:

    在大量的伺服器上分發這些配置檔案時,可以將它們放置在集中式的網路共享資料夾中,或者使用 HTTP、FTP 等協議透過 PXE 啟動時進行下載。使用配置管理工具(如 Ansible)來保證配置檔案的同步和一致性。

    bashCopy Code
    sudo cp ks.cfg /srv/httpd/centos7/

16.2. 使用版本控制來管理配置

為了確保各個伺服器的配置一致性和可追溯性,可以使用 Git 等版本控制系統來管理這些配置檔案。這使得配置檔案的修改、審計和回滾變得更加容易。

  • 將所有的 PXE 配置檔案、Kickstart、Preseed 模板以及其他自定義指令碼儲存在一個 Git 倉庫中。
  • 使用 Git 的分支和標籤管理不同環境的配置版本。例如,你可以為開發環境、生產環境和測試環境建立不同的分支或標籤。
bashCopy Code
git init
git add ks.cfg
git commit -m "Initial commit of Kickstart file"
git push origin master

16.3. 自動化監控與警報

為了確保自動化部署流程的順利進行,可以結合 監控 系統(如 PrometheusZabbix)來實時跟蹤部署狀態,並透過郵件或其他方式進行告警。

  • 設定監控系統,監視 PXE 伺服器、HTTP 伺服器和目標機器的狀態。
  • 使用 Ansible 或其他指令碼定期檢查部署的伺服器是否處於預期的狀態。如果發現配置或安裝錯誤,立即觸發警報。

16.4. 自動化部署後配置和最佳化

一旦作業系統安裝完成並且系統啟動,你通常還需要進一步配置和最佳化系統。例如,配置 SSH 金鑰、安裝額外的軟體包、配置防火牆、調整系統引數等。可以透過以下方式實現:

  1. 使用 Ansible 執行後續操作:

    在伺服器安裝完畢後,使用 Ansible 進行自動化配置。例如,可以編寫 Playbook 來配置網路服務、更新軟體包、配置使用者等。

    yamlCopy Code
    ---
    - name: Configure post-installation tasks
      hosts: all
      become: yes
      tasks:
        - name: Set up SSH keys for user
          authorized_key:
            user: "{{ ansible_user }}"
            key: "{{ lookup('file', '/path/to/public_key.pub') }}"
    
        - name: Install additional packages
          apt:
            name:
              - git
              - curl
              - htop
            state: present
    
        - name: Configure firewall
          ufw:
            rule: allow
            name: OpenSSH
            state: enabled
    
        - name: Ensure time synchronization
          service:
            name: chrony
            state: started
            enabled: yes
  2. 後續最佳化:

    • 自動配置常用的系統設定,如調整核心引數、啟用日誌管理工具(如 Logrotate)等。
    • 配置監控代理,使得新安裝的伺服器能夠自動新增到監控系統中。
    • 定期執行 Ansible Playbook 來確保系統的一致性和自動修復潛在的問題。

16.5. 定期更新與補丁管理

部署完成後的維護工作同樣重要。可以使用自動化工具來定期更新系統,確保系統在最新安全補丁下執行。

  • 自動化更新: 設定自動化更新機制,使用 Ansible 或 cron 定期執行更新命令。

    bashCopy Code
    sudo yum update -y
  • 安全補丁管理: 結合 CVE(公共漏洞與暴露)資料庫,定期檢查已知漏洞,確保所有系統補丁及時安裝。

  • 自動化修復: 定期執行基於 Ansible 的 Playbook 來更新軟體包、移除過時的元件、清理快取等。

16.6. 提高部署的可靠性與容錯性

在大規模部署中,出現失敗的情況時有發生。為了提高系統的容錯性,可以採取以下措施:

  1. 實施重試機制: 在配置管理工具中加入重試機制,尤其是當部署過程中某個步驟失敗時。Ansible 和其他工具都提供了重試功能,可以設定自動重試的次數和間隔。

    yamlCopy Code
    - name: Install package with retries
      apt:
        name: "{{ item }}"
        state: present
      with_items:
        - vim
        - git
      retries: 3
      delay: 10
      register: install_result
      until: install_result is success
  2. 多節點並行部署: 使用 PXE 啟動多個節點,配置 PXE 伺服器進行多節點並行安裝。這樣即使某個節點安裝失敗,也不會影響其他節點。

  3. 使用分散式儲存: 為了避免單點故障,可以使用分散式儲存系統(如 NFS 或 Ceph)來提供 PXE 安裝源和配置檔案。這樣可以在不同的節點上進行負載均衡,保證高可用性。

  4. 恢復機制: 對於系統故障或中斷,設計一個可靠的恢復方案。例如,使用自動備份恢復節點的狀態,或者設定自動重啟機制。

16.7. 綜合示例:使用 PXE + Kickstart + Ansible 完整部署流程

以下是一個典型的完整自動化部署流程:

  1. PXE 啟動: 透過 PXE 啟動目標伺服器,獲取安裝檔案並載入 Kickstart 檔案。

  2. Kickstart 自動化安裝: 使用 Kickstart 配置檔案自動化安裝作業系統。

  3. Post-installation 配置: 作業系統安裝完成後,透過 Ansible Playbook 對系統進行進一步的配置和最佳化(如安裝必要的軟體包、設定 SSH 金鑰、配置防火牆等)。

  4. 定期維護與更新: 使用 Ansible 定期檢查系統並應用最新的安全補丁,確保系統持續穩定。

透過這種自動化流程,您可以大規模、高效、可靠地部署和管理多臺伺服器,節省大量的人工成本,並提高部署的一致性和可重複性。

PXE、Kickstart、Preseed 和 Ansible 的結合為大規模作業系統部署和配置提供了強大的自動化解決方案。這些工具不僅能減少人工干預,還能確保部署過程的高效性和一致性。透過最佳化這些工具的使用,您可以為企業級環境中的大規模部署和運維提供一個高度自動化、可擴充套件和高效的解決方案。


16.8. 安全性和合規性考慮

在進行大規模自動化部署時,安全性和合規性是不可忽視的重要方面。為了確保部署的伺服器符合企業的安全標準和合規要求,可以採取以下措施:

  1. 強制使用加密和安全協議

    在網路傳輸中,確保所有敏感資訊(如密碼、SSH 金鑰)都透過安全協議傳輸。例如,PXE 啟動過程中,可以使用 HTTPS 或 FTPs 來加密資料傳輸,以防止敏感資料洩露。

    • 配置 PXE 伺服器 支援 HTTPS 協議:

      bashCopy Code
      # 配置 PXE 伺服器使用 HTTPS
      sudo sed -i 's/http/https/' /etc/pxe/config
    • Ansible 中,使用 ansible_ssh_private_key_file 指定安全的私鑰檔案進行 SSH 連線。

  2. 最小化許可權原則

    在配置自動化工具時,應遵循最小化許可權原則,確保每個節點和每個角色僅有完成任務所需的最低許可權。這不僅有助於減少潛在的攻擊面,還可以降低因許可權過高而引發的安全隱患。

    • KickstartPreseed 配置中,不要使用過於簡單或通用的密碼。推薦使用強密碼或加密的密碼。

    • Ansible 中,使用 become 提升許可權時,確保僅針對需要的任務使用管理員許可權。

      yamlCopy Code
      - name: Install security updates
        become: true
        apt:
          name: "{{ item }}"
          state: latest
        with_items:
          - openssh-server
          - curl
  3. 自動化合規檢查

    使用自動化工具(如 Ansible)定期進行安全合規性檢查,確保新部署的系統符合企業的安全政策。例如,可以編寫 Playbook 來檢查系統是否啟用了必要的安全配置(如 SELinux、AppArmor、系統日誌記錄等)。

    • 使用 Ansible 進行系統審計:
      yamlCopy Code
      ---
      - name: Check if SELinux is enforcing
        hosts: all
        become: yes
        tasks:
          - name: Check SELinux status
            command: getenforce
            register: selinux_status
          - name: Fail if SELinux is not enforcing
            fail:
              msg: "SELinux is not enforcing"
            when: selinux_status.stdout != 'Enforcing'
  4. 加固系統配置

    在系統安裝後,使用自動化工具(如 Ansible)對每臺機器進行加固。加固措施包括:

    • 禁用不必要的服務。
    • 配置防火牆規則,確保只允許必要的埠開放。
    • 配置日誌記錄和審計功能。
    • 定期更新系統,安裝安全補丁。

    透過 Ansible 配置加固:

    yamlCopy Code
    - name: Harden system
      hosts: all
      become: yes
      tasks:
        - name: Disable unnecessary services
          service:
            name: "{{ item }}"
            state: stopped
            enabled: no
          with_items:
            - telnet
            - ftp
        - name: Configure firewall rules
          ufw:
            rule: allow
            name: 'OpenSSH'
            state: enabled
  5. 審計與日誌記錄

    確保所有部署操作、系統更改和安全事件都記錄在日誌中,以便日後審計和故障排查。可以使用 syslog 或集中的日誌管理工具(如 ELK StackGraylog)來收集和分析日誌。

    • 配置 Ansible 自動化日誌收集:
      yamlCopy Code
      - name: Install syslog
        hosts: all
        become: yes
        tasks:
          - name: Install rsyslog
            apt:
              name: rsyslog
              state: present
          - name: Ensure rsyslog is running
            service:
              name: rsyslog
              state: started
              enabled: yes
  6. 金鑰管理

    在自動化部署過程中,確保敏感資料(如密碼、SSH 金鑰等)得到妥善管理。可以使用 HashiCorp VaultAWS Secrets Manager 或其他金鑰管理工具來管理和儲存加密金鑰和憑證。

    • 使用 Vault 管理金鑰和憑證:
      yamlCopy Code
      - name: Retrieve Vault secret for SSH key
        hashivault_secret:
          url: https://vault.example.com
          secret: secret/ssh/key
        register: ssh_key
      
      - name: Set SSH key from Vault
        authorized_key:
          user: "{{ ansible_user }}"
          key: "{{ ssh_key.data.key }}"

16.9. 持續整合與持續部署(CI/CD)整合

大規模部署時,結合 CI/CD(持續整合和持續部署)流程可以進一步提升自動化和可重複性。透過自動化部署流水線,確保部署過程中的每個步驟都經過測試,並且能夠快速回滾。

  1. 整合自動化測試:

    在大規模部署之前,可以透過 CI/CD 管道執行自動化測試,驗證伺服器配置和安裝的正確性。使用工具(如 TestinfraServerspecAnsible Molecule)來測試目標機器是否符合預期的配置。

    • 使用 Ansible Molecule 進行測試:
      bashCopy Code
      molecule init scenario -r ansible_role -s default
      molecule test
  2. 自動化部署流水線:

    在 CI/CD 流水線中自動觸發 Ansible Playbook 執行部署任務。例如,可以使用 Jenkins、GitLab CI、GitHub Actions 等工具來整合 Ansible Playbook,實現自動化部署。

    • 在 Jenkins 中設定流水線:
      groovyCopy Code
      pipeline {
        agent any
        stages {
          stage('Deploy to Staging') {
            steps {
              ansiblePlaybook playbook: 'deploy.yml', inventory: 'inventory/staging.ini'
            }
          }
        }
      }
  3. 持續監控與反饋:

    在 CI/CD 流水線中,持續監控和日誌收集有助於在部署過程中捕獲潛在問題。可以結合 PrometheusGrafanaELK Stack 等監控工具,實現實時監控和自動化反饋。

自動化部署不僅僅是一個工具層面的應用,它還涉及到流程、架構設計和安全策略的全面考慮。透過結合 PXE、Kickstart/Preseed、Ansible 等工具,您可以高效地管理大規模伺服器的部署、配置和維護,同時確保系統的安全性和合規性。結合 CI/CD 流水線和自動化測試,不僅能夠提升部署的可靠性和一致性,還能有效縮短開發和運維週期,提供靈活、可擴充套件的部署解決方案。

透過這些步驟和方法,您能夠實現一個高效、可重複的自動化部署流程,同時保持系統的高可用性和安全性。這對於大規模資料中心、企業環境或雲基礎設施的管理,都是至關重要的。


相關文章