一唐瀑、Ansible介紹
???????基于python語(yǔ)言實(shí)現(xiàn),無(wú)需代理奠货,適用中小型應(yīng)用環(huán)境介褥。
???????特性:
???????模塊化:調(diào)用特定的模塊,完成特定任務(wù)
???????有Paramiko,PyYAML柔滔,Jinja2(模板語(yǔ)言)三個(gè)關(guān)鍵模塊
???????支持自定義模塊
???????基于Python語(yǔ)言實(shí)現(xiàn)
???????部署簡(jiǎn)單溢陪,基于python和SSH(默認(rèn)已安裝)
???????安全,基于OpenSSH
???????支持playbook編排任務(wù)
???????冪等性:一個(gè)任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣睛廊,不因重復(fù)執(zhí)行帶來(lái)意外情況
???????無(wú)需代理不依賴PKI(無(wú)需ssl)
???????可使用任何編程語(yǔ)言寫(xiě)模塊
???????YAML格式形真,編排任務(wù),支持豐富的數(shù)據(jù)結(jié)構(gòu)
???????較強(qiáng)大的多層解決方案
1.1 Ansible主要組成
- ANSIBLE PLAYBOOKS:任務(wù)劇本(任務(wù)集)超全,編排定義Ansible任務(wù)集的配置文件咆霜,由Ansible順序依次執(zhí)行,通常是JSON格式的YML文件
- INVENTORY:Ansible管理主機(jī)的清單/etc/anaible/hosts
- MODULES:Ansible執(zhí)行命令的功能模塊嘶朱,多數(shù)為內(nèi)置核心模塊蛾坯,也可自定義
- PLUGINS:模塊功能的補(bǔ)充,如連接類(lèi)型插件疏遏、循環(huán)插件脉课、變量插件、過(guò)濾插件等财异,該功能不常用
- API:供第三方程序調(diào)用的應(yīng)用程序編程接口
- ANSIBLE:組合INVENTORY倘零、API、MODULES戳寸、PLUGINS的綠框呈驶,可以理解為是ansible命令工具,其為核心執(zhí)行工具
ansible命令執(zhí)行來(lái)源:
- USER疫鹊,普通用戶袖瞻,即SYSTEM ADMINISTRATOR
- CMDB(配置管理數(shù)據(jù)庫(kù)) API 調(diào)用
- PUBLIC/PRIVATE CLOUD API調(diào)用
- USER-> Ansible Playbook -> Ansibile
利用ansible實(shí)現(xiàn)管理的方式:
- Ad-Hoc 即ansible命令,主要用于臨時(shí)命令使用場(chǎng)景
- Ansible-playbook 主要用于長(zhǎng)期規(guī)劃好的订晌,大型項(xiàng)目的場(chǎng)景虏辫,需要有前期的規(guī)劃過(guò)程
Ansible-playbook(劇本)執(zhí)行過(guò)程:
- 將已有編排好的任務(wù)集寫(xiě)入Ansible-Playbook
- 通過(guò)ansible-playbook命令分拆任務(wù)集至逐條ansible命令,按預(yù)定規(guī)則逐條執(zhí)行
Ansible主要操作對(duì)象:
- HOST 主機(jī)
- NETWORKING 網(wǎng)絡(luò)設(shè)備
1.2 Ansible架構(gòu)
1.3 Ansible工作原理
1.4 playbook 介紹
- playbook是由一個(gè)或多個(gè)“play”組成的列表
- play的主要功能在于將預(yù)定義的一組主機(jī)锈拨,裝扮成事先通過(guò)ansible中的task定義好的角色砌庄。Task實(shí)際是調(diào)用ansible的一個(gè)module,將多個(gè)play組織在一個(gè)playbook中奕枢,即可以讓它們聯(lián)合起來(lái)娄昆,按事先編排的機(jī)制執(zhí)行預(yù)定義的動(dòng)作
- Playbook采用YAML語(yǔ)言編寫(xiě)
1.4.1 YAML 語(yǔ)言
???????YAML是一個(gè)可讀性高的用來(lái)表達(dá)資料序列的格式。
???????特性:
???????- YAML的可讀性好
???????- YAML和腳本語(yǔ)言的交互性好
???????- YAML使用實(shí)現(xiàn)語(yǔ)言的數(shù)據(jù)類(lèi)型
???????- YAML有一個(gè)一致的信息模型
???????- YAML易于實(shí)現(xiàn)
???????- YAML可以基于流來(lái)處理
???????- YAML表達(dá)能力強(qiáng)缝彬,擴(kuò)展性好
1.4.1.1 YAML 語(yǔ)法
- 在單一檔案中萌焰,可用連續(xù)三個(gè)連字號(hào)(- - -)區(qū)分多個(gè)檔案。另外谷浅,還有選擇性的連續(xù)三個(gè)點(diǎn)號(hào)( ... )用來(lái)表示檔案結(jié)尾
- 次行開(kāi)始正常寫(xiě)Playbook的內(nèi)容扒俯,一般建議寫(xiě)明該P(yáng)laybook的功能
- 使用#號(hào)注釋代碼
- 縮進(jìn)必須是統(tǒng)一的奶卓,不能空格和tab混用
- 縮進(jìn)的級(jí)別也必須是一致的,同樣的縮進(jìn)代表同樣的級(jí)別撼玄,程序判別配置的級(jí)別是通過(guò)縮進(jìn)結(jié)合換行來(lái)實(shí)現(xiàn)的
- YAML文件內(nèi)容是區(qū)別大小寫(xiě)的夺姑,k/v的值均需大小寫(xiě)敏感
- 多個(gè)k/v可同行寫(xiě)也可換行寫(xiě),同行使用掌猛,分隔
- v可是個(gè)字符串盏浙,也可是另一個(gè)列表
- 一個(gè)完整的代碼塊功能需最少元素需包括 name 和 task
- 一個(gè)name只能包括一個(gè)task
- YAML文件擴(kuò)展名通常為yml或yaml
List:列表,其所有元素均使用“-”打頭
示例:
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
Dictionary:字典荔茬,通常由多個(gè)key與value構(gòu)成
示例1:
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以將key:value放置于{}中進(jìn)行表示废膘,用,分隔多個(gè)key:value
示例2:
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
1.4.2 playbook 核心組成
- hosts 執(zhí)行的遠(yuǎn)程主機(jī)列表
- tasks 任務(wù)集
- variables 內(nèi)置變量或自定義變量在playbook中調(diào)用
- templates 模板,可替換模板文件中的變量并實(shí)現(xiàn)一些簡(jiǎn)單邏輯的文件
- handlers 和 notity 結(jié)合使用慕蔚,由特定條件觸發(fā)的操作丐黄,滿足條件方才執(zhí)行,否則不執(zhí)行
- tags 標(biāo)簽 指定某條任務(wù)執(zhí)行孔飒,用于選擇運(yùn)行playbook中的部分代碼孵稽。ansible具有冪等性,因此會(huì)自動(dòng)跳過(guò)沒(méi)有變化的部分十偶,即便如此,有些代碼為測(cè)試其確實(shí)沒(méi)有發(fā)生變化的時(shí)間依然會(huì)非常地長(zhǎng)园细。此時(shí)惦积,如果確信其沒(méi)有變化,就可以通過(guò)tags跳過(guò)此些代碼片斷
1.4.3 playbook 基礎(chǔ)結(jié)構(gòu)
- hosts:
???????playbook中的每一個(gè)play的目的都是為了讓特定主機(jī)以某個(gè)指定的用戶身份執(zhí)行任務(wù)猛频。hosts用于指定要執(zhí)行指定任務(wù)的主機(jī)狮崩,須事先定義在主機(jī)清單中
可以為如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
websrvs:dbsrvs 或者,兩個(gè)組的并集
websrvs:&dbsrvs 與鹿寻,兩個(gè)組的交集
webservers:!dbsrvs 在websrvs組睦柴,但不在dbsrvs組
remote_user: 可用于Host和task中。也可以通過(guò)指定其通過(guò)sudo的方式在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)毡熏,其可用于play全局或某任務(wù)坦敌;此外,甚至可以在sudo時(shí)使用sudo_user指定sudo時(shí)切換的用戶
示例:
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: magedu
sudo: yes #默認(rèn)sudo為root
sudo_user:wang #sudo為wang
- task列表和action
???????play的主體部分是task list痢法,task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行狱窘,即在所有主機(jī)上完成第一個(gè)任務(wù)后,再開(kāi)始第二個(gè)任務(wù)
???????task的目的是使用指定的參數(shù)執(zhí)行模塊财搁,而在模塊參數(shù)中可以使用變量蘸炸。模塊執(zhí)行是冪等的,這意味著多次執(zhí)行是安全的尖奔,因?yàn)槠浣Y(jié)果均一致
???????每個(gè)task都應(yīng)該有其name搭儒,用于playbook的執(zhí)行結(jié)果輸出穷当,建議其內(nèi)容能清晰地描述任務(wù)執(zhí)行步驟。如果未提供name淹禾,則action的結(jié)果將用于輸出
tasks:任務(wù)列表
兩種格式:
(1) action: module arguments
(2) module: arguments 建議使用
注:shell和command模塊后面跟命令馁菜,而非key=value
某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過(guò)“notify”通知給相應(yīng)的handlers
任務(wù)可以通過(guò)"tags“打標(biāo)簽稀拐,可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用
示例:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
如果命令或腳本的退出碼不為零火邓,可以使用如下方式替代
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來(lái)忽略錯(cuò)誤信息
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
1.4.2 playbook 基本使用
- 運(yùn)行playbook的方式
ansible-playbook <filename.yml> ... [options]
常見(jiàn)選項(xiàng)
--check -C 只檢測(cè)可能會(huì)發(fā)生的改變,但不真正執(zhí)行操作
--list-hosts 列出運(yùn)行任務(wù)的主機(jī)
--list-tags 列出tag
--list-tasks 列出task
--limit 主機(jī)列表 只針對(duì)主機(jī)列表中的主機(jī)執(zhí)行
-v -vv -vvv 顯示過(guò)程
示例:實(shí)現(xiàn)自動(dòng)化安裝httpd
yum -y install ansible ##來(lái)自epel軟件倉(cāng)庫(kù)源
cat httpd.yml
---
- hosts: all
remote_user: root
tasks:
- name: install package.
yum: name=httpd
- name: service
service: name=httpd state=started enabled=yes
tags: service
二德撬、HTTP服務(wù)介紹
???????超文本傳輸協(xié)議 http(Hyper Text Transfer Protocol)铲咨,工作在應(yīng)用層。默認(rèn)端口:tcp/80蜓洪。
2.1 HTTP工作機(jī)制
工作機(jī)制:
http請(qǐng)求:http request
http響應(yīng):http response
一次http事務(wù):請(qǐng)求<-->響應(yīng)
提高HTTP連接性能:
并行連接:通過(guò)多條TCP連接發(fā)起并發(fā)的HTTP請(qǐng)求
持久連接:keep-alive,長(zhǎng)連接纤勒,重用TCP連接,以消除連接和關(guān)閉的時(shí)延,以事務(wù)個(gè)數(shù)和時(shí)間來(lái)決定是否關(guān)閉連接
管道化連接:通過(guò)共享TCP連接發(fā)起并發(fā)的HTTP請(qǐng)求
復(fù)用的連接:交替?zhèn)魉驼?qǐng)求和響應(yīng)報(bào)文(實(shí)驗(yàn)階段)
Web資源:web resource
一個(gè)網(wǎng)頁(yè)由多個(gè)資源構(gòu)成隆檀,打開(kāi)一個(gè)頁(yè)面摇天,會(huì)有多個(gè)資源展示出來(lái),但是每個(gè)資源都要單獨(dú)請(qǐng)求恐仑。因此泉坐,一個(gè)“Web 頁(yè)面”通常并不是單個(gè)資源,而是一組資源的集合靜態(tài)文件:無(wú)需服務(wù)端做出額外處理
文件后綴:.html, .txt, .jpg, .js, .css, .mp3, .avi動(dòng)態(tài)文件:服務(wù)端執(zhí)行程序裳仆,返回執(zhí)行的結(jié)果
文件后綴:.php, .jsp ,.asp
2.2 HTTP通信過(guò)程
2.3 HTTP服務(wù)器
http服務(wù)器程序:
apache(httpd)
nginx
lighttpd
2.3.1 httpd 介紹
???????20世紀(jì)90年代初腕让,國(guó)家超級(jí)計(jì)算機(jī)應(yīng)用中心NCSA開(kāi)發(fā)
???????1995年開(kāi)源社區(qū)發(fā)布apache(a patchy server)
???????功能特性:
???????- 虛擬主機(jī)
???????IP、Port歧斟、FQDN
???????- CGI:Common Gateway Interface纯丸,通用網(wǎng)關(guān)接口
???????- 反向代理
???????- 負(fù)載均衡
???????- 路徑別名
???????- 豐富的用戶認(rèn)證機(jī)制
???????basic
???????digest
???????- 支持第三方模塊
2.3.2 httpd 虛擬主機(jī)
- 站點(diǎn)標(biāo)識(shí): socket
IP相同,但端口不同
IP不同静袖,但端口均為默認(rèn)端口
FQDN不同: 請(qǐng)求報(bào)文中首部 Host: www.bza.com - 有三種實(shí)現(xiàn)方案:
基于ip:為每個(gè)虛擬主機(jī)準(zhǔn)備至少一個(gè)ip地址
基于port:為每個(gè)虛擬主機(jī)使用至少一個(gè)獨(dú)立的port
基于FQDN:為每個(gè)虛擬主機(jī)使用至少一個(gè)FQDN
配置示例:建立httpd服務(wù)器觉鼻,要求提供兩個(gè)基于名稱的虛擬主機(jī)
yum -y install httpd ##安裝httpd軟件包
mkdir -pv /web/vhosts/{x,y} ##創(chuàng)建虛擬主機(jī)的站點(diǎn)目錄
echo 'www.X.com' > /web/vhosts/x/index.html ##創(chuàng)建并寫(xiě)入站點(diǎn)1默認(rèn)主頁(yè)文件內(nèi)容
echo 'www.Y.com' > /web/vhosts/y/index.html ##創(chuàng)建并寫(xiě)入站點(diǎn)2默認(rèn)主頁(yè)文件內(nèi)容
cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/vhosts.conf ##拷貝虛擬主機(jī)配置模板文件
vi /etc/httpd/conf.d/vhosts.conf ##編輯虛擬主機(jī)配置文件,修改如下內(nèi)容
<VirtualHost *:80>
ServerName www.X.com
DocumentRoot "/web/vhosts/x"
ErrorLog "/var/log/httpd/x.err"
CustomLog "/var/log/httpd/x.access" common
<Directory "/web/vhosts/x">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.Y.com
DocumentRoot "/web/vhosts/y"
ErrorLog "/var/log/httpd/www2.err"
CustomLog "/var/log/httpd/y.access" common
<Directory "/web/vhosts/y">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
systemctl restart httpd ##重啟服務(wù)队橙,使更改生效