天天看點

Linux 運維自動化之Cobbler概述

大綱

一、前言 二、PXE 概述 三、Kickstart 概述 四、Cobbler 簡介 五、Cobbler 組成 六、Cobbler 工作原理 七、Cobbler 不足

注,作業系統 CentOS 6.4 x86_64,軟體版本 Cobbler-2.4.0-1。(目前最新版)

預啟動執行環境(Preboot eXecution Environment,PXE,也被稱為預執行環境)是讓計算機通過網卡獨立地使用資料裝置(如硬碟)或者安裝作業系統。PXE當初是作為Intel的有線管理體系的一部分,Intel和 Systemsoft于1999年9月20日公布其規格(版本2.1)。通過使用像網際協定(IP)、使用者資料報協定(UDP)、動态主機設定協定(DHCP)、小型檔案傳輸協定(TFTP)等幾種網絡協定和全局唯一辨別符(GUID)、通用網絡驅動接口(UNDI)、通用唯一識别碼(UUID)的概念并通過對客戶機(通過PXE自檢的電腦)固件擴充預設的API來實作目的。PXE 客戶機(client)這個術語是指機器在PXE啟動過程中的角色。一個PXE 客戶機(client)可以是一台伺服器、桌面級電腦、筆記本電腦或者其他裝有PXE啟動代碼的機器。

客戶機的固件為接受到可用的PXE啟動伺服器,要在網絡中嘗試找出PXE重定向服務(DHCP代理)。在分析傳回的包後,固件會向合适的啟動伺服器詢問網絡自檢程式(NBP)的路徑,并且通過TFTP協定下載下傳到電腦的記憶體中,有可能會去校驗它,最後執行它。當隻有全部的PXE 客戶機(client)隻使用一個NBP時,全部的PXE 客戶機可能會被指定是用BOOTP協定,進而不需要DHCP代理,但是仍然需要TFTP啟動服務。

PXE 協定大緻上結合了DHCP和TFTP,雖然都有在兩者上面有改進。DHCP用于查找合适的啟動伺服器,TFTP用于下載下傳初始引導程式和附加檔案。為了開始一個PXE自檢會話,PXE固件廣播一個帶有明确的PXE選項DHCPDISCOVER包(擴充DHCPDISCOVER)到67/UDP端口(DHCP伺服器端口)。PXE選項是PXE固件有PXE能力的鑒定,但是會被一般的DHCP服務忽略。當固件受到從這樣的服務受到DHCPOFFER包時,它會通過要求其提供配置資訊來自我配置。

當 PXE 重定向服務 (DHCP代理) 收到一個 擴充DHCPDISCOVER 包時,它會通過發送一個帶有明确的PXE選項DHCPDISCOVER包到PXE客戶機的68/UDP端口 (DHCP 客戶機端口)來回答。 一個擴充DHCPDISCOVER包主要包含:

一個PXE發現控制領域,以決定是使用多點傳播,廣播(網路)或單點傳播來聯系PXE啟動伺服器。

一個列出可用的PXE啟動伺服器類型的位址表。

一個代表每個一個PXE啟動伺服器類型的條目單。

一個帶有帶有提示使用者按下哪一個鍵來看到啟動菜單的PXE啟動菜單。

一個超過多長時間就啟動第一啟動菜單的逾時數值。

一個DHCP代理服務可能在相同的主機上運作一個标準的DHCP伺服器。盡管兩個服務不可以共享67/UDP 端口,DHCP代理服務在4011/UDP 端口上運作,要求從用戶端來的DHCPDISCOVER 包變成DHCPREQUEST 包。标準DHCP服務在其發送的DHCPOFFER 包中加入特殊的PXE 選項組合,這樣PXE用戶端知道可以在同一個主機的 4011/UDP 端口找到一個DHCP代理服務。

和一個正在啟動系統的啟動服務聯系必須有一個IP位址(可能來自DHCP服務)。通過多點傳播或單點傳播一個帶有特殊的PXE選項的 DHCPREQUEST 包(擴充DHCPREQUEST包)到 4011/UDP端口,或者廣播(網路)這種包到 67/UDP端口。這種包包含有PXE啟動服務類型和PXE啟動層,一個守護程序允許運作多個啟動服務類型。 一個擴充 DHCPREQUEST包可能是一個DHCPINFORM包。下面是PXE具體工作原理圖,

<a href="http://blog.51cto.com/attachment/201311/204443258.png" target="_blank"></a>

簡單總結一下,

PXE Client發送廣播包請求DHCP配置設定IP位址DHCP

Server回複請求,給出IP位址以及Boot

Server的位址PXE下載下傳引導檔案執行引導程式

好了,PXE我們就簡單的說到這裡。下面我們來說一下Kickstart。

1.Kickstart 簡介

官方文檔:Many system administrators would prefer to use an automated installation method to install Fedora or Red Hat Enterprise Linux on their machines. To answer this need, Red Hat created the kickstart installation method. Using kickstart, a system administrator can create a single file containing the answers to all the questions that would normally be asked during a typical installation.(大意就是很多系統管理者希望自動安裝系統,于是便有了kickstart這種方式,隻需配置一個安裝應答檔案,便可以自動安裝系統了。)

2.Kickstart 組成

Kickstart 安裝選項,包含語言的選擇,防火牆,密碼,網絡,分區的設定等;

%Pre 部分,安裝前解析的腳本,通常用來生成特殊的ks配置,比如由一段程式決定磁盤分區等;

%Package 部分,安裝包的選擇,可以是 @core 這樣的group的形式,也可以是這樣 vim-* 包的形式;

%Post 部分,安裝後執行的腳本,通常用來做系統的初始化設定。比如啟動的服務,相關的設定等。

3.Kickstart 樣例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

<code># Kickstart file automatically generated by anaconda.</code>

<code>#Install OS instead of upgrade</code>

<code>install</code>

<code>#Use text mode install</code>

<code>text</code>

<code>#Use CDROM installation media</code>

<code>cdrom</code>

<code>lang en_US.UTF-8</code>

<code>keyboard us</code>

<code>#Skip the X Configuration</code>

<code>skipx</code>

<code>#Use network installation</code>

<code>url --url=http:</code><code>//192</code><code>.168.0.13</code><code>/cobbler/ks_mirror/CentOS-5</code><code>.9-X86_64</code>

<code>#Network information</code>

<code>#network --device eth0 --bootproto static --ip 192.168.9.226 --netmask 255.255.255.0 --gateway 192.168.9.1 --nameserver 192.168.9.1 --noipv6 --onboot=yes --hostname kerry-web-001</code>

<code>network --device eth0 --bootproto dhcp --noipv6 --</code><code>hostname</code> <code>leo</code>

<code>#root -- redhat</code>

<code>rootpw --iscrypted $1$1Cthpm5k$ejyOypOnp0YYX0RQ3qMk41</code>

<code>firewall --disabled</code>

<code>#System authorization information</code>

<code>authconfig --enableshadow --enablemd5</code>

<code>selinux --disabled</code>

<code>timezone --utc Asia</code><code>/Shanghai</code>

<code>#System bootloader configuration</code>

<code>bootloader --location=mbr</code>

<code>#Clear the Master Boot Record</code>

<code>zerombr </code><code>yes</code>

<code># Set the Mouse</code>

<code>mouse generic3ps</code><code>/2</code>

<code># The following is the partition information you requested</code>

<code># Note that any partitions you deleted are not expressed</code>

<code># here so unless you clear all partitions first, this is</code>

<code># not guaranteed to work</code>

<code>#Partition clearing information</code>

<code>clearpart --all --initlabel</code>

<code>part </code><code>/boot</code> <code>--fstype ext3 --size=200 --asprimary</code>

<code>part / --fstype ext3 --size=10000</code>

<code>part swap --size=2048</code>

<code>part </code><code>/data</code> <code>--fstype ext3 --size=1 --grow</code>

<code>#--- Reboot the host after installation is done</code>

<code>reboot</code>

<code>%packages</code>

<code>@base</code>

<code>@core</code>

<code>@development-libs</code>

<code>@development-tools</code>

<code>@editors</code>

<code>@text-internet</code>

<code>keyutils</code>

<code>trousers</code>

<code>fipscheck</code>

<code>device-mapper-multipath</code>

<code>imake</code>

<code>%post --nochroot</code>

<code># Mount CDROM</code>

<code>mkdir</code> <code>-p </code><code>/mnt/cdrom</code>

<code>mount</code> <code>-r -t iso9660 </code><code>/tmp/cdrom</code> <code>/mnt/cdrom</code>

<code>cp</code> <code>/mnt/cdrom/ipmod</code> <code>/mnt/sysimage/root/ipmod</code> <code>&gt; </code><code>/dev/null</code>

<code>umount</code> <code>/mnt/cdrom</code>

<code>%post</code>

<code>#vim syntax on</code>

<code>sed</code> <code>-i </code><code>"8 s/^/alias vi='vim'/"</code> <code>/root/</code><code>.bashrc 2&gt;</code><code>/dev/null</code>

<code>echo</code> <code>'syntax on'</code> <code>&gt; </code><code>/root/</code><code>.vimrc 2&gt;</code><code>/dev/null</code>

<code>#init_ssh</code>

<code>ssh_cf=</code><code>"/etc/ssh/sshd_config"</code>

<code>sed</code> <code>-i -e </code><code>'74 s/^/#/'</code> <code>-i -e </code><code>'76 s/^/#/'</code> <code>$ssh_cf</code>

<code>sed</code> <code>-i </code><code>"s/#UseDNS yes/UseDNS no/"</code> <code>$ssh_cf</code>

<code>#client</code>

<code>sed</code> <code>-i -e </code><code>'44 s/^/#/'</code> <code>-i -e </code><code>'48 s/^/#/'</code> <code>$ssh_cf</code>

<code># Remove the ISO File translation files</code>

<code>find</code> <code>/ -name TRANS.TBL -</code><code>exec</code> <code>rm</code> <code>{} \; </code><code>/dev/null</code> <code>2&gt;</code><code>/dev/null</code>

<code># Remove some unneeded services</code>

<code>#--------------------------------------------------------------------------------</code>

<code>cat</code> <code>&lt;&lt; EOF</code>

<code>+--------------------------------------------------------------+</code>

<code>| === Welcome to Tunoff services === |</code>

<code>EOF</code>

<code>#---------------------------------------------------------------------------------</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>ls</code> <code>/etc/rc3</code><code>.d</code><code>/S</code><code>*`</code>

<code>do</code>

<code>  </code><code>CURSRV=`</code><code>echo</code> <code>$i|</code><code>cut</code> <code>-c 15-`</code>

<code>echo</code> <code>$CURSRV</code>

<code>case</code> <code>$CURSRV </code><code>in</code>

<code>    </code><code>crond | irqbalance | microcode_ctl | network | random | sshd | syslog | </code><code>local</code> <code>)</code>

<code>  </code><code>echo</code> <code>"Base services, Skip!"</code>

<code>  </code><code>;;</code>

<code>  </code><code>*)</code>

<code>    </code><code>echo</code> <code>"change $CURSRV to off"</code>

<code>    </code><code>chkconfig --level 235 $CURSRV off</code>

<code>    </code><code>service $CURSRV stop</code>

<code>esac</code>

<code>done</code>

<code># file descriptors</code>

<code>ulimit</code> <code>-HSn 65535</code>

<code>echo</code> <code>-</code><code>ne</code> <code>"</code>

<code>* soft nofile 65536</code>

<code>* hard nofile 65536</code>

<code>" &gt;&gt;</code><code>/etc/security/limits</code><code>.conf</code>

<code>#set sysctl</code>

<code>true</code> <code>&gt; </code><code>/etc/sysctl</code><code>.conf</code>

<code>cat</code> <code>&gt;&gt; </code><code>/etc/sysctl</code><code>.conf &lt;&lt; EOF</code>

<code>net.ipv4.ip_forward = 0</code>

<code>net.ipv4.conf.default.rp_filter = 1</code>

<code>net.ipv4.conf.default.accept_source_route = 0</code>

<code>kernel.sysrq = 0</code>

<code>kernel.core_uses_pid = 1</code>

<code>net.ipv4.tcp_syncookies = 1</code>

<code>kernel.msgmnb = 65536</code>

<code>kernel.msgmax = 65536</code>

<code>kernel.shmmax = 68719476736</code>

<code>kernel.shmall = 4294967296</code>

<code>net.ipv4.tcp_max_tw_buckets = 6000</code>

<code>net.ipv4.tcp_sack = 1</code>

<code>net.ipv4.tcp_window_scaling = 1</code>

<code>net.ipv4.tcp_rmem = 4096 87380 4194304</code>

<code>net.ipv4.tcp_wmem = 4096 16384 4194304</code>

<code>net.core.wmem_default = 8388608</code>

<code>net.core.rmem_default = 8388608</code>

<code>net.core.rmem_max = 16777216</code>

<code>net.core.wmem_max = 16777216</code>

<code>net.core.netdev_max_backlog = 262144</code>

<code>net.core.somaxconn = 262144</code>

<code>net.ipv4.tcp_max_orphans = 3276800</code>

<code>net.ipv4.tcp_max_syn_backlog = 262144</code>

<code>net.ipv4.tcp_timestamps = 0</code>

<code>net.ipv4.tcp_synack_retries = 1</code>

<code>net.ipv4.tcp_syn_retries = 1</code>

<code>net.ipv4.tcp_tw_recycle = 1</code>

<code>net.ipv4.tcp_tw_reuse = 1</code>

<code>net.ipv4.tcp_mem = 94500000 915000000 927000000</code>

<code>net.ipv4.tcp_fin_timeout = 1</code>

<code>net.ipv4.tcp_keepalive_time = 1200</code>

<code>net.ipv4.ip_local_port_range = 1024 65535</code>

<code>/sbin/sysctl</code> <code>-p</code>

<code>#close ctrl+alt+del</code>

<code>sed</code> <code>-i </code><code>"s/ca::ctrlaltdel:\/sbin\/shutdown -t3 -r now/#ca::ctrlaltdel:\/sbin\/shutdown -t3 -r now/"</code> <code>/etc/inittab</code>

<code>#set purview</code>

<code>chmod</code> <code>600 </code><code>/etc/passwd</code>

<code>chmod</code> <code>600 </code><code>/etc/shadow</code>

<code>chmod</code> <code>600 </code><code>/etc/group</code>

<code>chmod</code> <code>600 </code><code>/etc/gshadow</code>

好了,到這裡PXE與Kickstart就簡單的介紹完成了,下面我們來說一下Cobbler工具。

1.Cobbler 概述

Cobbler由python語言開發,是對PXE和Kickstart以及DHCP的封裝。融合很多特性,提供了CLI和Web的管理形式。更加友善的實行網絡安裝。同時,Cobbler也提供了API接口,使用其它語言也很容易做擴充。它不緊可以安裝實體機,同時也支援kvm、xen虛拟化、Guest OS的安裝。更多的是它還能結合Puppet等集中化管理軟體,實作自動化的管理。

2.新舊對比

以前自動化安裝系統得先設定一個網絡環境,可是設定網絡環境涉及到許多步驟,才能為開始安裝系統做好準備。你必須:

配置服務,比如 DHCP、TFTP、DNS、HTTP、FTP 和 NFS;

在 DHCP 和 TFTP 配置檔案中填入各個用戶端機器的資訊;

建立自動部署檔案(比如 kickstart 和 autoinst);

将安裝媒介解壓縮到 HTTP/FTP/NFS 存儲庫中。

這個過程并不簡單,而且手動注冊每個必須配置的用戶端機器可能很麻煩。對配置一台機器的任何參數更改(比如要使用一個不同的作業系統),都需要對配置進行手動幹預,并有可能對自動部署檔案進行手動幹預。當機器數量增加時,如果不高度重視檔案組織的條理性,TFTP 目錄等元素就可能變得混亂。

Cobbler 通過為機器配置的所有方面建立一個中央管理點,進而解決了這些不足。Cobbler 可重新配置服務,建立存儲庫,解壓縮作業系統媒介,代理或內建一個配置管理系統,控制電源管理等。Cobbler 建立了一個抽象層,您可在其中運作 “add new repository” 或 “change client machine operating system” 等指令。Cobbler 負責處理所有事情:建立或更新配置檔案,重新啟動服務,或者将媒介解壓到新建立的目錄中。它的目的是隐藏所有與系統相關的問題,以便您可專注于任務本身。

3.Cobbler 提供的功能

使用 Cobbler,您無需進行人工幹預即可安裝機器。Cobbler 設定一個 PXE 引導環境(它還可使用 yaboot 支援 PowerPC),并控制與安裝相關的所有方面,比如網絡引導服務(DHCP 和 TFTP)與存儲庫鏡像。當希望安裝一台新機器時,Cobbler 可以:

使用一個以前定義的模闆來配置 DHCP 服務(如果啟用了管理 DHCP) 将一個存儲庫(yum 或 rsync)建立鏡像或解壓縮一個媒介,以注冊一個新作業系統 在 DHCP 配置檔案中為需要安裝的機器建立一個條目,并使用您指定的參數(IP 和 MAC 位址) 在 TFTFP 服務目錄下建立适當的 PXE 檔案 重新啟動 DHCP 服務以反映更改 重新啟動機器以開始安裝(如果電源管理已啟用)

Cobbler 支援衆多的發行版:Red Hat、Fedora、CentOS、Debian、Ubuntu 和 SuSE。當添加一個作業系統(通常通過使用 ISO 檔案)時,Cobbler 知道如何解壓縮合适的檔案并調整網絡服務,以正确引導機器。

Cobbler 可使用 kickstart 模闆。基于 Red Hat 或 Fedora 的系統使用 kickstart 檔案來自動化安裝流程。通過使用模闆,您就會擁有基本的 kickstart 模闆,然後定義如何針對一種配置檔案或機器配置而替換其中的變量。例如,一個模闆可能包含兩個變量 $domain和 $machine_name。在 Cobbler 配置中,一個配置檔案指定 <code>domain=mydomain.com</code>,并且每台使用該配置檔案的機器在machine_name 變量中指定其名稱。該配置檔案中的所有機器都使用相同的 kickstart 安裝且針對 <code>domain=mydomain.com</code> 進行配置,但每台機器擁有其自己的機器名稱。您仍然可以使用 kickstart 模闆在不同的域中安裝其他機器并使用不同的機器名稱。

為了協助管理系統,Cobbler 可通過 fence scripts 連接配接到各種電源管理環境。Cobbler 支援 apc_snmp、bladecenter、bullpap、drac、ether_wake、ilo、integrity、ipmilan、ipmitool、lpar、rsa、virsh 和 wti。要重新安裝一台機器,可運作 <code>reboot system foo</code>指令,而且 Cobbler 會使用必要的憑據和資訊來為您運作恰當的 fence scripts(比如機器插槽數)。

除了這些特性,還可使用一個配置管理系統 (CMS)。您有兩種選擇:該工具内的一個内部系統,或者內建一個現有的外部 CMS,比如 Chef 或 Puppet。借助内部系統,您可以指定檔案模闆,這些模闆會依據配置參數進行處理(與 kickstart 模闆的處理方式一樣),然後複制到您指定的位置。如果必須自動将配置檔案部署到特定機器,那麼此功能很有用。

使用 koan 用戶端,Cobbler 可從用戶端配置虛拟機并重新安裝系統。

Cobbler 的配置結構基于一組注冊的對象。每個對象表示一個與另一個實體相關聯的實體(該對象指向另一個對象,或者另一個對象指向該對象)。當一個對象指向另一個對象時,它就繼承了被指向對象的資料,并可覆寫或添加更多特定資訊。以下對象類型的定義為:

發行版:表示一個作業系統。它承載了核心和 initrd 的資訊,以及核心參數等其他資料。

配置檔案:包含一個發行版、一個 kickstart 檔案以及可能的存儲庫,還包含更多特定的核心參數等其他資料。

系統:表示要配給的機器。它包含一個配置檔案或一個鏡像,還包含 IP 和 MAC 位址、電源管理(位址、憑據、類型)以及更為專業的資料等資訊。

存儲庫:儲存一個 yum 或 rsync 存儲庫的鏡像資訊。

鏡像:可替換一個包含不屬于此類别的檔案的發行版對象(例如,無法分為核心和 initrd 的對象)。

基于注冊的對象以及各個對象之間的關聯,Cobbler 知道如何更改檔案系統以反映具體配置。因為系統配置的内部是抽象的,是以您可以僅關注想要執行的操作。下面是Cobbler各對象之間的關系圖,

<a href="http://blog.51cto.com/attachment/201311/204336913.png" target="_blank"></a>

<a href="http://freeloda.blog.51cto.com/attachment/201311/3/2033581_1383482251rCsG.png" target="_blank"></a>

下面我們來簡單的說明一下,

Server端:

第一步,啟動Cobbler服務

第二步,進行Cobbler錯誤檢查,執行cobbler check指令

第三步,進行配置同步,執行cobbler sync指令

第四步,複制相關啟動檔案檔案到TFTP目錄中

第五步,啟動DHCP服務,提供位址配置設定

第六步,DHCP服務配置設定IP位址

第七步,TFTP傳輸啟動檔案

第八步,Server端接收安裝資訊

第九步,Server端發送ISO鏡像與Kickstart檔案

Client端:

第一步,用戶端以PXE模式啟動

第二步,用戶端擷取IP位址

第三步,通過TFTP伺服器擷取啟動檔案

第四步,進入Cobbler安裝選擇界面

第五步,用戶端确定加載資訊

第六步,根據配置資訊準備安裝系統

第七步,加載Kickstart檔案

第八步,傳輸系統安裝的其它檔案

第九步,進行安裝系統

1.問題說明

根據MAC位址來配置主機ip和hostname,根據mac配置ip等相關資訊是一些常見需求,有些裝置标簽上有mac位址,這一類可以手動抄下,然後在配置。但是,由于主機更換主機闆,或其他原因導緻mac不對,你還用标簽上的mac位址來配置,這就悲劇了。為了更好的解決這樣的問題我們也可以有解決的辦法。

2.解決方法

根據dhcp請求資訊抓取mac位址,然後進行配置。具體方法可以通過tcpdump或者腳本來分析/var/log/message檔案,抓取對目标端口為67通路的資料包,然後進行分析。

[root@node6 ~]# tcpdump -i eth0 dst port 67

好了,到這裡我們的Linux 運維自動化之Cobbler概述就講解完成了,在下篇部落格中我們和大家講解一下Cobbler的安裝與配置。最後希望大家有所收獲^_^……

本文轉自陳明乾51CTO部落格,原文連結:http://blog.51cto.com/freeloda/1319695,如需轉載請自行聯系原作者

繼續閱讀