自動化運維之-PXE實現系統批量自動安裝
本節索引
需求分析
PXE簡介
整體方案
服務選擇
功能實現
安裝調試
錯誤分析
總結
1 需求分析
隨著互聯網技術的不斷壯大,服務器數量也在不斷的增加,IT運維已經成為IT服務內涵中重要的組成部分。面對越來越復雜的業務,面對越來越多樣化的用戶需求,不斷擴展的IT應用需要越來越合理的模式來保障IT服務能靈活便捷、安全穩定地持續保障,這種模式中的保障因素就是IT運維。從初期的幾臺服務器發展到龐大的數據中心,單靠人工已經無法滿足在技術、業務、管理等方面的要求,那麽標準化、自動化、架構優化、過程優化等降低IT服務成本的因素越來越被人們所重視。而如何自動化批量部署安裝一個穩定的系統是實現自動化的第一步。
2 PXE簡介
PXE,就是預啟動執行環境,是一種引導啟動的方式。這種協議一般由兩部分構成,一部分是服務器端,一個是客戶端。簡單來說,我們通過這種方式可以自己創建一個“安裝源”,在安裝系統的時候只要能找到這個“源”便可以實現系統的安裝。在實現無人值守的安裝前,我們必須要搭建一些服務,來實現“安裝源”的建立,例如ftp、http、tftp、dhcp等。當一臺主機啟動時,標準輸入輸出會將PXE客戶端調入我們的內存中進行相關的操作,並提示相關的選項,在這裏我們可以進行選擇。PXE的客戶端通過網絡下載(download)啟動文件到本地運行。具體過程是,PXE客戶端通過網卡向局域網內發送ip請求,然後DHCP服務器會提供給給它一個ip地址和系統安裝所需要的文件,接下使用接收到的文件進行系統安裝。而安裝的過程又需要其他服務器提供的資源,例如:yum源,內核文件等,當主機拿到這些資源,便可以順利的安裝了。最終結果是:任意一臺主機在選著網絡啟動時會獲取DHCP服務器分發的ip,通過通過獲取到的ip地址與局域網內的TFTP服務器通信並獲取啟動文件,與FTP或者HTTP通信並獲取yum源文件及內核文件等。之後開始自動安裝,而這個過程不需要人在做任何操作。
PXE安裝優點,這種安裝系統的方式可以不受光驅,光盤以及一些外部設備的限制,還可以做到無人值守,大大減輕了運維人員的工作負荷,像在一些主機數量龐大的機房進行批量安裝,PXE將是你不二的選擇。
3整體方案
這一小節我們主要介紹方案選擇,在說方案之前先來看看PXE部署思路。部署思路其實並不難,在實現PXE自動批量安裝系統時,首先我們需要有DHCP服務器為我們提供IP地址,如果在一個網絡中你連IP地址都獲取不到,何談自動化。其次我們要安裝一個系統,那麽需要的文件必須要有人為我們提供才可以,應為是網絡自動安裝,本地是沒有任何資源的,我們可以使用HTTP,FTP服務來實現。最後就是獲取我們的安裝文件,這些文件會引導我們的計算機如何啟動,如何配置,我們選擇TFTP服務起來提供。整體框架
方案1:選則一臺主機同時搭建HTTP、TFTP、DHCP服務,為該子網內的主機提供服務。
方案2:選擇一臺主機搭建HTTP、TFTP服務,做提供資源的服務器,另為一臺主機單間DHCP服務,提供IP地址。
上述提供了兩種方案,當然了,如果你不怕資源浪費,你也可以選擇每種服務搭建在一臺主機上,做相應服務的提供,不過個人並不建議。考慮到節約資源的目的,我們選擇方案一
4 服務選型
4.1 DHCP服務
由於我們是實現自動化批量安裝部署,所以,能夠與其他主機通信是前提,而要想獲取IP並實現通信,我們必須要有DHCP服務器為大量的主機提供ip地址才行。
DHCP就是動態主機設置協議,主要是為客戶端分發IP,並且是自動分發IP的,一臺主機通過DHCP獲取的地址是動態的,每次獲取的地址都有可能不同,改地址是DHCP服務器暫時分配給用戶使用的,當主機關機之後則會返回這個ip地址,此時如果有其他用戶請求,DHCP服務器則會將該IP地址分配給他。局域網中的每臺主機都可以充當DHCP服務器,只要我們安裝DHCP服務,並做相應的配置即可,這裏的配置主要是子網的配置,配置其他主機能使用IP地址的範圍,例如:配置子網為192.168.14.0,該子網內主機獲取IP的範圍為192.168.14.1~192.168.14.100。那麽我們就可以打開DHCP的配置文件/etc/dhcp/dhcpd.conf做如下配置:
subnet 192.168.14.0 netmask 255.255.255.0 { range 192.168.25.50 192.168.25.100; next-server 192.168.25.107; # 指明tftp服務器的地址 filename "pxelinux.0"; # 指定PXE文件 }
4.2 HTTP服務
由於我們要獲取安裝系統服務的yum源以及內核文件,虛擬根文件,這些文件都是大文件,在傳輸時我們必須保證其能夠安全傳輸,所以我們選擇了HTTP服務,當然了,選擇FTP服務也是可以的。
HTTP是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。是互聯網上廣泛試用的協議。是用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分等。HTTP包含命令和傳輸信息,不僅可用於Web訪問,也可以用於其他因特網/內聯網應用系統之間的通信,從而實現各類應用資源超媒體訪問的集成。
4.3 TFTP服務
TFTP是一種文件傳輸服務,用於服務器與客戶端進行文件的傳輸,不過他只能進行簡單的文件傳輸,這個服務開銷不大,所以並不能進行大文件的傳輸,多用於小文件的傳輸。他沒有FTP那麽強大,但是TFTP使用UDP協議傳輸數據,有些時候比FTP更加方便,它所監聽的端口為69。由於我們是在局域網中,系統相對安全,而提供的數據也不是很大,所以TFTP是實現PXE的不二選擇。
5 功能實現
5.1安裝前準備
由於涉及到主機間不同基於不同協議的通信,所以為了避免不必要的麻煩,我們選擇關閉防火墻以及selinux。生產場景中不建議這樣做。
[ [email protected] ~ ]#iptables -F # 關閉防火墻 [ [email protected] ~ ]#setenforce 0 # 臨時關閉selinux [ [email protected] ~ ]#vim /etc/selinux/config # 修改文件永久關閉selinux ...前面省略 SELINUX=disabled # 設置SELINUX的值為disabled ...後面省略
5.2配置靜態IP地址
由於我們在前面方案分析中選擇了方案1,即將所有服務搭建在同一臺服務器上。由於做DHCP服務的主機的IP地址必須固定,所以我們要先配置服務器的IP地址。由於我是在CentOS7系統上搭建的服務器,所以有許多命令只有CentOS7才能使用。CentOS6及之前的版本請自行查閱相關文檔。
[ [email protected] ~ ]#vim /etc/sysconfig/network-scripts/ifcfg-ens33 # 設置靜態IP DEVICE=ens33 BOOTPROTO=static IPADDR=192.168.14.201 PREFIX=24 ONBOOT=yes [ [email protected] ~ ]#systemctl restart network.service #重啟網絡服務 [ [email protected] ~ ]#ip a # 查看自己的IP是否設置成功
5.3安裝服務
由於我們需要HTTP、TFTP、DHCP服務來提供相應的服務,所以我們必須要在系統中安裝,相應的服務。這裏需要註意,如果你的系統時最小化安裝,那麽建議你先安裝一些包組,GCC等。如果安裝過程中出現包依賴問題,依次安裝相應的包即可。
[ [email protected] ~ ]#yum -y install dhcp tftp-server httpd syslimux #安裝相應的服務包 [ [email protected] ~ ]#yum -y install xinetd # 安裝超級守護進程xinetd [ [email protected] ~ ]#systemctl enable dhcp # 設置dhcp開機啟動 [ [email protected] ~ ]#systemctl enable tftp # 設置tftp開機啟動 [ [email protected] ~ ]#systemctl start tftp # 啟動tftp服務 [ [email protected] ~ ]#systemctl enable httpd [ [email protected] ~ ]#systemctl start httpd # 啟動http服務 [ [email protected] ~ ]#chkconfig tftp on # 如果這天命令不能使用,請修改配置文件 [ [email protected] ~ ]#vim /etc/xinetd.d/tftp service tftp { ... disable =yes # 修改這一項為"disable =no" ... } [ [email protected] ~ ]#systemctl restart xinetd # 修改之後,一定要重啟xinetd服務
5.4配置DHCP服務
DHCP服務是保證我們能夠自動化批量安裝的前提,上面已經有提到過dhcp的配置,這裏做補充,詳細說明。主要是配置子網範圍,用於ip地址分配。
[ [email protected] ~ ]#rpm -ql dhcp # 查詢dhcp相關的文件 ...前面省略 /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example ...後面省略 [ [email protected] ~ ]#cd /etc/dhcp/ [ [email protected] ~ ]#cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example . # 復制模板配置文件 [ [email protected] ~ ]#mv dhcpd.conf.example dhcpd.conf # 改名為dhcpd.conf,頂替以前的配置文件 [ [email protected] ~ ]#vim dhcpd.conf # 打開模板文件並添加一下內容 ...前面省略... subnet 192.168.14.0 netmask 255.255.255.0{ # 這裏寫的ip地址為子網的地址,故為192.168.14.0 range 192.168.14.10 192.168.14.200; # 子網的範圍,之後主機請求獲取的ip地址就是這其中的一個 next-server 192.168.14.201; # 指明tftp服務器的地址 filename "pxelinux.0" # 指明PXE文件位置,這個在申請ip的時候會發送給安裝主機 } ...後面省略... [ [email protected] ~ ]#systemctl dhcpd start # 重啟服務
註意:如果你設置的子網有問題,那麽你將不能重啟dhcp服務,請檢查你配置的子網是否正確。dhcp服務器的地址必須固定,不能是自動獲取的ip。
5.5 準備yum源文件及kickstart文件
yum源文件我們是放在http服務器上的,由http服務來提供,所以我們要把相應的文件復制到http服務器上。並且我們安裝的主機系統可能是CentOS 6 也可能是CentOS7或者Ubantu等,所以我們在準備yum文件時,需要準備不同系統、不同版本的文件,我們這裏只提供CentOS 6 與CentOS 7的兩種系統的安裝。向我們先規劃一下目錄文件,在進行復制。如下所示。
我們規劃好了目錄結構,接下來便是創建這些目錄結構,並提供相應的文件。
[ [email protected] ~ ]#cd /var/www/html [ [email protected] html ]#mkdir -p centos/{6,7} [ [email protected] html ]#mkdir ksdir [ [email protected] html ]#
提供yum源文件,這裏有兩種方案來實現yum源文件的提供,方案1:我們分別掛載CentOS 6和CentOS 7的關盤將光盤裏的Packages目錄與repodata目錄復制到對應的目錄下(如果復制,建議全部復制);方案2:我們創建兩個關盤驅動器,一個添加CentOS 6的ISO鏡像,一個添加CentOS 7的ISO鏡像,然後我們分別將對應的關盤掛載到/var/www/html/centos下對應的目錄上。綜上所述,我們選擇方案2。下面是一方案2為基礎來實現的。
[ [email protected] html ]#mount /dev/sr0 centos/6 # 掛載CentOS 6光盤值6目錄下 mount: /dev/sr0 is write-protected,mounting read-only [ [email protected] html ]#mount /dev/sr1 centos/7 # 掛載CentOS 7光盤值7目錄下 mount: /dev/sr1 is write-protected,mounting read-only
接下來準備ksdir目錄下的安裝引導文件ks#.cfg。ks#.cfg文件的獲取方法有兩種,一種是通過工具來生成。不過這個工具需要自己安裝:
[ [email protected] ~ ]#yum install -y system-config-kickstart [ [email protected] ~ ]#system-config-kickstart
另外這一種是復制/root目錄下的anaconda-ks.cfg文件加以修改。我們選擇後者。
[ [email protected] html ]#cp /root/anaconda-ks.cfg ksdir/ks7.cfg [ [email protected] html ]#vim ksdir/ks7.cfg .... [ [email protected] html ]#chmod +r ksdir/ks7.cfg # "這裏的文件需要加讀權限,非常重要" [ [email protected] html ]#cat ksdir/ks7.cfg # centos 7的kickstart文件 #version=DEVEL # System authorization information auth --enableshadow --passalgo=sha512 # Use CDROM installation media url --url= # 指明yum源的路徑 # Use graphical install text # 將cdrom修改為text,我們不是基於光盤安裝的,我們是基於字符界面安裝 # Run the Setup Agent on first boot firstboot --enable ignoredisk --only-use=sda # Keyboard layouts keyboard --vckeymap=us --xlayouts=‘us‘ # System language lang en_US.UTF-8 # Network information network --bootproto=dhcp --device=ens33 --onboot=on --ipv6=auto --activate # --bootproto必須是dhcp獲取,--onboot=on network --hostname=centos7.magedu.com # Root password rootpw --iscrypted $6$Z7LBEUpwj3iQdYZ3$olYQ.Lj1xV2VAGS1UiNflKF0oMGip3b6tU9QFcp0i2JBjwKlY/Yaexul57NHpIJc.Y2V1hWAOueaqwjuWDGMk0 # System services services --disabled="chronyd" # System timezone timezone Asia/Shanghai --isUtc --nontp user --name=wang --password=$6$v.VphW/puRblcrFB$uaSrdEhGAwMXap27WIKTn5lyOOfoFyB/SNxyyL3og6s9/VQoAKoL2KQjKmeYFmoYTuYkSNL7BBxgbJzeryKr9. --iscrypted --gecos="wang" # X Window System configuration information xconfig --startxonboot # System bootloader configuration bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda # Partition clearing information zerombr yes # 添加zerombr ,表示清除舊磁盤上原有的mbr,新磁盤安裝可不寫 clearpart --all # 清除所有分區信息,新磁盤安裝可不寫 # Disk partitioning information part swap --fstype="swap" --ondisk=sda --size=2048 # 分區表信息,如果你想添加分區,可按照該格式添加 part /app --fstype="xfs" --ondisk=sda --size=51200 part / --fstype="xfs" --ondisk=sda --size=51200 part /boot --fstype="xfs" --ondisk=sda --size=1024 reboot # 安裝完成之後重啟 %packages # 安裝軟件包 @^graphical-server-environment @base @core @desktop-debugging @dial-up @fonts @gnome-desktop @guest-agents @guest-desktop-agents @hardware-monitoring @input-methods @internet-browser @multimedia @print-client @x11 kexec-tools autofs # 安裝autofs服務包 %end %addon com_redhat_kdump --enable --reserve-mb=‘auto‘ %end %anaconda pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty %end %post # 安裝後腳本,我們配置了yum源 systemctl enable autofs rm -rf /etc/yum.repos.d/* cat > /etc/yum.repos.d/base.repo <<eof [base] name=base baseurl=file:///misc/cd gpgcheck=0 eof %end ************下面是CentOS 6的kickstart文件************* *******方法同上,這裏你到別的主機上復制一份過來******* [ [email protected] html ]#cat ksdir/ks6.cfg #version=DEVEL install text # 基於字符界面安裝 lang en_US.UTF-8 keyboard us network --onboot yes --device eth0 --bootproto dhcp --noipv6 rootpw --iscrypted $6$hfb25YOYZDU3YZTl$VxTkHGGJGGBbr59OPnY5kTJzvJ9hb9NRwrh5FMHLIAlXh9VQ74PYoK7QzPWYN0zaJrm3mv/IP0fDkHxFglNi6/ firewall --service=ssh authconfig --enableshadow --passalgo=sha512 url --url= # yum源的路徑 selinux --disabled # 關閉selinux timezone Asia/Shanghai bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" # The following is the partition information you requested # Note that any partitions you deleted are not expressed # here so unless you clear all partitions first, this is # not guaranteed to work zerombr yes # 清除mbr clearpart --all # 清除分區信息 reboot # 安裝完成後重啟 part /boot --fstype=ext4 --size=1000 # 分區信息 part / --fstype=ext4 --size=50000 part /app --fstype=ext4 --size=40000 part swap --size=2048 #repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 # 註釋掉此行 %packages @base @core @debugging @basic-desktop @desktop-debugging @desktop-platform @directory-client @fonts @general-desktop @graphical-admin-tools @input-methods @internet-applications @internet-browser @java-platform @kde-desktop @legacy-x @network-file-system-client @office-suite @print-client @remote-desktop-clients @server-platform @server-policy @workstation-policy @x11 mtools pax python-dmidecode oddjob wodim sgpio genisoimage device-mapper-persistent-data abrt-gui qt-mysql samba-winbind certmonger pam_krb5 krb5-workstation xterm xorg-x11-xdm libXmu rdesktop %end %post # 安裝後腳本,安裝完系統後向做什麽配置,都可以寫在%post...%end中間 rm -rf /etc/yum.repos.d/* cat > /etc/yum.repos.d/base.repo <<eof [base] name=base baseurl=file:///misc/cd gpgcheck=0 eof %end
5.6準備內核文件菜單文件
內核文件、虛擬根文件以及菜單文件,我們都是通過tftp服務來提供的,由於系統及版本的不同,對於一個比較復制機群來說,我們需要準備不同系統,不同版本的內核文件,initrd.img文件。菜單文件只需要一份即可。/var/lib/tftpboot/目錄規劃如下:
規劃好了目錄結構,接下來自只需要按照目錄內容配置相關的文件即可。菜單風格文件menu.c32、不同系統的內核文件 vmlinuz 以及虛擬根文件系統 initrd.img 我們可以從光盤中復制。菜單文件defaults需要手動寫。
[ [email protected] ~ ]#cd /var/lib/tftpboot/ [ [email protected] tftpboot ]#mkdir -p centos{6,7} # 創建目錄文件 [ [email protected] tftpboot ]#cp /var/www/html/centos/6/{vmlinuz,initrd.img} centos6/ # 復制內核,虛擬根文件 [ [email protected] tftpboot ]#cp /var/www/html/centos/7/{vmlinuz,initrd.img} centos7/ # 由於之前掛載了不同系統,直接復制對應文件即可 [ [email protected] tftpboot ]#cp /usr/share/syslinux/pxelinux.0 . # pxelinux文件來自syslinux包,直接復制即可 [ [email protected] tftpboot ]#mkdir pxelinux.cfg [ [email protected] tftpboot ]#cp /var/www/html/centos/6/isolinux/isolinux.cfg pxelinux.cfg/default # 復制並改名 [ [email protected] tftpboot ]#vim pxelinux.cfg/default ... # 修改過程省略, [ [email protected] tftpboot ]#cat pxelinux.cfg/default # 查看修改過後的菜單文件內容 default menu.c32 # 指定菜單風格 timeout 600 # 安裝倒計時,1/10 s為單位 menu title Auto Install | www.vinsent.cn label centos7 menu label Auto Install CentOS Linux ^7 kernel centos7/vmlinuz append initrd=centos7/initrd.img ks= # 指明ks文件位置 label centos6 menu label Auto Install CentOS Linux ^6 kernel centos6/vmlinuz append initrd=centos6/initrd.img ks=http://192.168.14.201/ksdir/ks6.cfg label manual7 menu label ^Manual Install CentOS Linux 7 kernel centos7/vmlinuz append initrd=centos7/initrd.img inst.repo=http://192.168.14.201/centos/7 label manual6 menu label Manual ^Install CentOS Linux 6 kernel centos6/vmlinuz append initrd=centos6/initrd.img inst.repo=http://192.168.14.201/centos/6 label local menu default # 默認光標停在這一行 menu label Boot from ^local drive localboot 0xffff menu end
到此所有的配置就完成了。
6 調試並安裝
新創建一臺虛擬機,設置網絡段在上述DHCP服務所在的網絡段,選擇使用物理驅動器。
點擊啟動項開始安裝,選擇網絡安裝。
點擊網絡安裝後,我們就能看到我們的菜單了。
然後選擇你要啟動的項即可。
7 錯誤分析
最初還不是很熟悉PXE原理的時候,遇到了很多問題,在最後給處我與到的幾個問題,即解決方法。
問題1:ks.cfg文件出錯
解決方法:檢查tftp服務是否啟動,ks#.cfg文件路徑是否正確,ks#.cfg文件是否具有讀權限。出現這個問題大概就是這幾個地方出了問題
問題2:yum源文件路徑出錯
解決方法:尋找yum源出現錯誤,該錯誤是ks.cfg文件中url路徑寫錯了,修改該路徑為正確的yum源所在的地址即可。
問題3:iptables與selinux出問題
遺憾忘記截圖給大家了,見諒,安裝前檢查一下iptables與selinux是否關閉(實驗環境,生產中不建議這麽粗暴!)
8 總結
本文通過分析PXE實現批量自動化安裝的原理,再到一步步實現PXE的配置,再到後面的排錯思路。在這裏總結幾個要點:關閉selinux,iptables很重要,ks文件讀權限不可少,服務千萬不能down掉,文件路徑不能亂抄。謝謝大家閱讀~
若有疑問可參閱一下博文:
http://blog.zhubiaook.com/linux/2017/09/17/PXE+DHCP+Apache+KickStart/
http://yangzhiheng.blog.51cto.com/11586378/1966365
本文出自 “vinsent” 博客,請務必保留此出處http://vinsent.blog.51cto.com/13116656/1966419
自動化運維之-PXE實現系統批量自動安裝