dhcp、tftp及pxe簡介
DHCP:
全稱:Dynamic Host Configuration Protocol 動態主機配置協議
DHCP配置內容:
IP/Netmask
Gateway
DNS Server
bootp: boot protocol --> dhcp 動態指派IP,永久有效
租約:即使用期限,DHCP伺服器為客戶端分配IP後,客戶端使用IP地址是有期限的
2hours:假如租約期限為2小時
50%: 1hours --> 2hours 過了一個小時之後就要續租
50%:1hours --> 2hours 續租後又過了一個小時,就再續租,如果不用的時候,地址會自動被釋放
75%: 0.5hours --> 2hours
87.5%: 0.25hours --> 2hours
dhcp discover 如果租約快要到期一直無法續租就要提前廣播尋找DHCP伺服器
RARP:(Reverse Address Resolution Protocol),是一種網路協議,網際網路工程任務組(IETF)在RFC903中描述了RARP。RARP使用與ARP相同的報頭結構,作用與ARP相反。 RARP用於將
RARP工作原理
- 傳送主機發送一個本地的RARP廣播,在此廣播包中,宣告自己的MAC地址並且請求任何收到此請求的RARP伺服器分配一個IP地址;
- 本地網段上的RARP伺服器收到此請求後,檢查其RARP列表,查詢該MAC地址對應的IP地址;
- 如果存在,RARP伺服器就給源主機發送一個響應資料包並將此IP地址提供給對方主機使用;
- 如果不存在,RARP伺服器對此不做任何的響應;
- 源主機收到從RARP伺服器的響應資訊,就利用得到的IP地址進行通訊;如果一直沒有收到RARP伺服器的響應資訊,表示初始化失敗。
DHCP的工作流程:
比如客戶端剛開機,那麼客戶端關機的時候地址是被釋放的了。所以客戶端開機後要重新做地址獲取。地址獲取是通過RARP協議獲取的,所以客戶端廣播請求DHCP服務為其分配一個IP地址。分以一下4個步驟,都是以廣播的方式進行的
1、Client: dhcp discover:客戶端傳送廣播尋找DHCP伺服器
2、Server: dhcp offer:(IP/netmask, gw) DHCP伺服器端收到廣播報文後會做出響應,提供與客戶端MAC匹配的IP/network,gw
3、Client:dhcp request 客戶端選擇DHCP伺服器提供的IP後,要發出一個廣播說採用了哪個IP。假如採用了DHCP伺服器1的提供的IP,那麼這臺伺服器就要在地址池中刪除這次被採用的地 址。而沒有被採用的IP,DHCP伺服器會回收過來
(有兩種情況:1:多臺DHCP伺服器同時響應客戶端的廣播請求為客戶端提供IP,2:客戶端MAC相匹配的IP已經被佔用)
4、Server: dhcp ack DHCP 被選定地址的伺服器確認
續租:是以單播的方式
Client: dhcp request 客戶端直接給DHCP伺服器傳送請求採用續租的地址
Server: dhcp ack 伺服器端響應,
Server: dhcp nak DHCP伺服器拒絕續租,如果DHCP伺服器拒絕續租,有可能DHCP伺服器上的地址範圍被修改了,客戶端請求續租的地址不在此範圍內
假如公司的網路做了兩個區域,一個區域是財務,另一個區域是技術部門,彼此之間使用路由器連結。在財務部門的網路區域中提供了一臺DHCP伺服器,所以財務部門獲取IP地址是沒有問題。但技術部門如何獲取IP地址?由於路由器是廣播報文的屏障,所以財務部門這邊的DHCP伺服器是無法收到技術部門的客戶端傳送的廣播。那麼如何才能讓DHCP伺服器為技術部門的客戶端分配地址呢?由於DHCP協議是可以被中繼的,但是需要路由器開啟中繼功能,即路由器在右側網路介面上安裝一個提供DHCP服務的程式,這裡成為A,監聽在某個介面上接收技術部門客戶端的請求並分配地址。所以技術部門的客戶端廣播的時候是路由器的A是可以接收到廣播報文的。但路由器是沒有DHCP功能的,所以路由器在收到報文後會定向單播給財務部門的DHCP伺服器,DHCP伺服器收到路由器的報文後,會定向把響應報文定向單播給路由器,路由器接收響應報文後再有A把此報文廣播給技術部門的客戶端。技術部門的客戶端接收到IP地址後會再廣播一個request,路由器接會把這個廣播報文封裝後再次單播給DHCO伺服器。DHCP伺服器接收到報文後再次單播給路由器,路由器A再次廣播給技術部門的客戶端。
問題:
1、DHCP伺服器本身有地址,同時DHCP伺服器自己的地址是不能動態分配的。
2、DHCP伺服器應該跟財務部門一體。首先先滿足財務部門客戶端的需求,才能提供其他網路提供DHCP服務。
為每一個網路提供地址服務的功能稱為作用域。所謂作用域就是能夠為哪些網路提供地址池列表,從而能夠完成地址分配。首先保證本地作用域,才能為其他網路提供。
Linux DHCP協議的實現程式:dhcp, dnsmasq
dnsmasq既可以配置成DNS轉發器又可以作為DHCP server使用
# yum info dnsmasq
Dnsmasq is lightweight, easy to configure DNS forwarder and DHCP server.
: It is designed to provide DNS and, optionally, DHCP, to a small network.
: It can serve the names of local machines which are not in the global
: DNS. The DHCP server integrates with the DNS server and allows machines
: with DHCP-allocated addresses to appear in the DNS with names configured
: either in each host or in a central configuration file. Dnsmasq supports
: static and dynamic DHCP leases and BOOTP for network booting of diskless
: machines.
Linux也可以充當DHCP中繼器
# yum install dhcp //提供了兩個守護程序,dhcp伺服器和dhcp中繼器,且二者取其一
/etc/dhcp/dhcpd.conf //配置檔案
/etc/dhcp/dhcpd6.conf
/etc/dhcp/scripts
/etc/dhcp/scripts/README.scripts
/etc/openldap/schema/dhcp.schema
/etc/sysconfig/dhcpd
/usr/bin/omshell
/usr/lib/systemd/system/dhcpd.service
/usr/lib/systemd/system/dhcpd6.service
/usr/lib/systemd/system/dhcrelay.service
/usr/sbin/dhcpd --> /etc/rc.d/init.d/dhcpd(centos6) //啟動程序
/usr/sbin/dhcrelay --> /etc/rc.d/init.d/dhcrelay //中繼器不需要配置檔案
如何配置使用DHCP
# cat /etc/dhcp/dhcpd.conf //是一個空檔案
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example //這裡有一個模板
# see dhcpd.conf(5) man page
#
# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf //把模板copy過來用
# vim /etc/dhcp/dhcpd.conf
在dhcpd.conf配置檔案中:如果定義了多個option,那麼範圍最小的option優先順序最高
subnet { //每一個subnet用來定義一個子網,在windows中叫作用域,所以地址池就是在子網中定義的,每一個地址再分配是,額外的屬性如閘道器、DNS伺服器等都
... //通過option指定,而option既可以放在subnet之外也可以放在subnet之內,如果option放在subnet之外,則全域性有效,對每一個subnet都有效。
}
host { //固定分配給某一個主機的保留地址,有些主機來請求IP地址,都期望使用固定地址,這個地址不在地址池中,而是額外保留給某個主機使用
...
}
share-network { //超級作用域,把多個對應的地址網段在同一個池中進行同一分配
#option指明除了地址和掩碼以外分配的其他屬性,既可以定義在全域性位置,也可以定義在subnet中
option domain-name "example.org"; //搜尋域,比如在主機上#ping www,這時候是不通的,如果在此處定義了搜尋域,他會在www後面自動補全的
option domain-name-servers ns1.example.org, ns2.example.org; //域名伺服器,如果是域名,則需要先把域名轉換成IP地址,再分配給客戶端,因為客戶端本來就沒有域名伺服器指向,沒辦法解析
#全域性配置選項
default-lease-time 600; //預設租約期限,單位是秒鐘,比如改為1天86400,後面必須是分號結尾
max-lease-time 7200; //最大租約期限
log-facility local7; //日誌
subnet 10.152.187.0 netmask 255.255.255.0 { //先滿足本子網,在服務其他網段。這裡是為10.152.187.0分配IP地址,注意:這裡的這裡定義的網路一定是配置檔案的當前主機所在的網路
range 10.152.187.120 10.152.187.130; //指明起始地址和結束地址,叫地址池,這裡一共定義了10個地址
}
對本機的dhcpd.conf進行修改
option domain-name "dongshi.com"; option domain-name-servers 8.8.8.8; default-lease-time 86400; max-lease-time 86400;
log-facility local7;
subnet 192.168.184.0 netmask 255.255.255.0 {
range 192.168.184.130 192.168.184.160;
}
:.,$s/^[^#]/#/g //然後把後面的不以#開頭的內容加上#號
# systemctl start dhcpd // 啟動
監聽在udp的67號埠
在另外一個主機上進行測試
# dhclient -d //用另一個主機以工作於前臺的方式動態獲取地址,dhclient程序只能啟動一次
此時繫結的192.168.184.130是可以登入的,監聽在68號埠上
如何知道DHCP伺服器把地址分配給哪個主機?
# cat /var/lib/dhcpd/dhcpd.leases //記錄了DHCP的租約位置
# The format of this file is documented in the dhcpd.leases(5) manual page. # This lease file was written by isc-dhcp-4.2.5 server-duid "\000\001\000\001#\260\371l\000\014)\316\370\004"; lease 192.168.184.130 { //130地址被分配到MAC地址是最下面一行的主機 starts 6 2018/12/22 13:41:57; //租約的起始時間 ends 0 2018/12/23 13:41:57; //租約的到期時間 cltt 6 2018/12/22 13:41:57; binding state active; next binding state free; rewind binding state free; hardware ethernet 00:0c:29:67:09:fe; //被分到IP地址的主機的MAC地址 } lease 192.168.184.145 { starts 6 2018/12/22 13:47:32; ends 0 2018/12/23 13:47:32; cltt 6 2018/12/22 13:47:32; binding state active; next binding state free; rewind binding state free; hardware ethernet 00:0c:29:cf:00:6b; }
在node2上檢視繫結的地址
在node3上檢視繫結的地址
如何分配閘道器呢?
# vim dhcpd.conf //編輯配置檔案指定閘道器
option domain-name "dongshi.com"; option domain-name-servers 8.8.8.8; option routers 192.168.184.141; //新增此行,放在這裡是全域性使用,如果有subnet的話,也可以把option放在指定的subnet中,一般routers都是定義在subnet中
# systemctl restart dhcpd
再在node2上檢視閘道器,依然沒有,因為dhclient功能有限,所以在設定node2網路採用內部閘道器通道,自定義下的VMnet2
其它配置選項:
filename: 指明引導檔名稱;
next-server:提供引導檔案的伺服器IP地址;
filename "pxelinux.0";
next-server 172.16.100.67;
PXE:preboot execute environment, Intel
dhcp, tftp, file server(yum repository)
CentOS 6 PXE:
yum -y install syslinux tftp-server
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /media/cdrom/images/pxelinux/{vmlinuz,initrd.img} /var/lib/tftp/boot/
cp /media/cdrom/isolinux/{boot.cfg,vesamenu.c32,splash.png} /var/lib/tftp/boot/
mkdir /var/lib/tftpboot/pxelinux.cfg/
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default/
CentOS 7 PXE:
yum -y install syslinux tftp-server
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /media/cdrom/images/pxelinux/{vmlinuz,initrd.img} /var/lib/tftp/boot/
cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/
mkdir /var/lib/tftpboot/pxelinux.cfg/
建立/var/lib/tftpboot/pxelinux.cfg/default
內容類似如下:
default menu.c32
prompt 5
timeout 30
MENU TITLE CentOS 7 PXE Menu
LABEL linux
MENU LABEL Install CentOS 7 x86_64
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://172.16.100.67/centos7 ks=http://172.16.100.67/centos7.cfg
Ansible:
運維工作:系統安裝(物理機、虛擬機器)--> 程式包安裝、配置、服務啟動 --> 批量操作 --> 程式釋出 --> 監控
OS Provisioning:
物理機:PXE、Cobbler
虛擬機器:Image Templates
Configration:
puppet (ruby)
saltstack (python)
chef
cfengine
Command and Control:
fabric
預釋出驗正:
新版本的程式碼先發布到伺服器(跟線上環境配置完全相同,只是未接入到排程器);
程式釋出:
不能影響使用者體驗;
系統不能停機;
不能導致系統故障或造成系統完全不可用;
灰度釋出:
釋出路徑:
/webapp/tuangou-1.1
/web/app/tuangou
/webapp/tuangou-1.2
在排程器上下線一批主機(maintanance) --> 關閉服務 --> 部署新版本的應用程式 --> 啟動服務 --> 在排程器上啟用這一批伺服器;
自動化灰度釋出:指令碼、釋出平臺;
運維工具的分類:
agent: puppet, func
agentless: ansible, fabric
ssh
ansible:
模組化,呼叫特定的模組,完成特定的任務;
基於Python語言實現,由Paramiko、PyYAML和Jinja2三個關鍵模組;
部署簡單,agentless;
主從模式
支援自定義模組
支援Playbook
冪等性:
配置檔案:
/etc/ansible/ansible.cfg
/etc/ansible/hosts
http://172.16.0.1/centos7.cfg
回顧:pxe, ansible
pxe:
網絡卡支援網路引導;
dhcp, filename, next-server
tftp-server
pxelinux.0
vmlinuz, initrd.img
menu.c32
pxelinux.cfg/default
system-config-kickstart
ksvalidator
ansible:
os provision:
物理機:pxe, cobbler
虛擬機器:image file template
configuration:
程式包管理、使用者管理、配置檔案、服務管理、cron任務等等;
puppet, saltstack, chef, cfengine
task exec
command and control
func, fabric
程式釋出:灰度模型
agent
agentless:
ssh服務;
ansible:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
args:
key=value
注意:command模組要執行命令無須為key=value格式,而是直接給出要執行的命令即可;
常用模組:
command
-a 'COMMAND'
user
-a 'name= state={present|absent} system= uid='
group
-a 'name= gid= state= system='
cron
-a 'name= minute= hour= day= month= weekday= job= user= state='
copy
-a 'dest= src= mode= owner= group='
file
-a 'path= mode= owner= group= state={directory|link|present|absent} src='
ping
沒有引數
yum
-a 'name= state={present|latest|absent}'
service
-a 'name= state={started|stopped|restarted} enabled='
shell
-a 'COMMAND'
script
-a '/path/to/script'
setup
playbook的核心元素:
tasks: 任務
variables: 變數
templates: 模板
handlers: 處理器
roles: 角色
變數:
facts
--extra-vars "name=value name=value"
role定義
Inventory中的變數:
主機變數
hostname name=value name=value
組變數
[groupname:vars]
name=value
name=value
Inventory的高階用法:
Playbook:
- host:
vars:
remote_user:
tasks:
-
-
-
variables:
-
-
-
handlers:
-
-
- host:
- host:
"ansible_distribution_major_version": "7",
nginx.conf
worker_processes {{ ansible_processor_cores * ansible_processor_count - 1 }};
實戰:用ansible playbook完成配置keepalived的叢集;
部落格:ansible的用法;