linux學習第八週總結

linux學習第八週總結

本週學習了兩個服務,DNS和ansible 由於這些服務很複雜,我也只能是到達剛瞭解或者是剛剛入門的程度,所以只說一些簡單基本的東西,簡單總結。

一、DNS服務

1.簡介

域名系統(英文:DomainNameSystem,縮寫:DNS)是互聯網的一項服務。它作爲將域名和IP地址相互映射的一個分佈式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCP和UDP端口53。當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。
記錄類型

主條目:域名服務器記錄類型列表

DNS系統中,常見的資源記錄類型有:

  • 主機記錄(A記錄):RFC 1035定義,A記錄是用於名稱解析的重要記錄,它將特定的主機名映射到對應主機的IP地址上。
  • 別名記錄(CNAME記錄): RFC 1035定義,CNAME記錄用於將某個別名指向到某個A記錄上,這樣就不需要再爲某個新名字另外創建一條新的A記錄。
  • IPv6主機記錄(AAAA記錄): RFC 3596定義,與A記錄對應,用於將特定的主機名映射到一個主機的IPv6地址。
  • 服務位置記錄(SRV記錄): RFC 2782定義,用於定義提供特定服務的服務器的位置,如(hostname),端口(port number)等。
  • NAPTR記錄:RFC 3403定義,它提供了正則表達式方式去映射一個域名。NAPTR記錄非常著名的一個應用是用於ENUM查詢。

DNS服務器類型
DNS服務器的類型:
1.主DNS服務器
2.從DNS服務器
3.緩存DNS服務器(轉發器)
主DNS服務器:管理和維護所負責解析的域內解析庫的服務器
從DNS服務器:從主服務器或從服務器“複製”(區域傳輸)解析庫副本
1.序列號:解析庫版本號,主服務器解析庫變化時,其序列遞增
2.刷新時間間隔:從服務器從主服務器請求同步解析的時間間隔
3.重試時間間隔:從服務器請求同步失敗時,再次嘗試時間間隔
4.過期時長:從服務器聯繫不到主服務器時,多久後停止服務
“通知”機制:主服務器解析庫發生變化時,會主動通知從服務器

2.工作原理

概述

DNS通過允許一個名稱服務器把他的一部分名稱服務(衆所周知的zone)“委託”給子服務器而實現了一種層次結構的名稱空間。此外,DNS還提供了一些額外的信息,例如系統別名、聯繫信息以及哪一個主機正在充當系統組或域的郵件樞紐。

任何一個使用IP的計算機網絡可以使用DNS來實現他自己的私有名稱系統。儘管如此,當提到在公共的InternetDNS系統上實現的域名時,術語“域名”是最常使用的。

這是基於504個全球範圍的“根域名服務器”(分成13組,分別編號爲A至M)。從這504個根服務器開始,餘下的Internet DNS名字空間被委託給其他的DNS服務器,這些服務器提供DNS名稱空間中的特定部分。
軟件

DNS系統是由各式各樣的DNS軟件所驅動的,例如:
BIND(Berkeley Internet Name Domain),使用最廣的DNS軟件

資源記錄
區域解析庫:由衆多RR組成:
資源記錄:Resource Record, RR
記錄類型:A, AAAA, PTR, SOA, NS, CNAME, MX
SOA:Start Of Authority,起始授權記錄;一個區域解析庫有且僅能有一個SOA記錄,必須位於解析庫的第一條記錄
A:internet Address,作用,FQDN --> IP
AAAA:FQDN --> IPv6
PTR:PoinTeR,IP --> FQDN
NS:Name Server,專用於標明當前區域的DNS服務器
CNAME : Canonical Name,別名記錄
MX:Mail eXchanger,郵件交換器
TXT:對域名進行標識和說明的一種方式,一般做驗證記錄時會使用此項,如:SPF(反垃圾郵件)記錄,https驗證等
示例:_dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x

3.實現主服務器

BIND安裝
DNS服務器軟件:bind,powerdns,unbound
BIND相關程序包:yum list all bind*
bind:服務器
bind-libs:相關庫
bind-utils:客戶端
bind-chroot: /var/named/chroot/
BIND程序名:named

bind服務器
服務腳本和名稱:/etc/rc.d/init.d/named /usr/lib/systemd/system/named.service
主配置文件:/etc/named.conf, /etc/named.rfc1912.zones, /etc/rndc.key
解析庫文件:/var/named/ZONE_NAME.ZONE
注意:
(1) 一臺物理服務器可同時爲多個區域提供解析
(2) 必須要有根區域文件;named.ca
(3) 應該有兩個(如果包括ipv6的,應該更多)實現localhost和本地迴環地址的解

配置主DNS服務器

(1) 在主配置文件中定義區域
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
(2) 定義區域解析庫文件
出現的內容
宏定義
資源記錄

主配置文件語法檢查:
named-checkconf
解析庫文件語法檢查:
named-checkzone "baidu.com" /var/named/magedu.com.zone
配置生效:
rndc reload 或 service named reload

測試命令
dig [-t type] name [@SERVER] [query options]
host [-t type] name [SERVER]
nslookup命令: nslookup [-option] [name | -] [server]

4.實現反向解析區域

反向區域:
區域名稱:網絡地址反寫.in-addr.arpa.
172.16.100.-->100.16.172.in-addr.arpa.

(1) 定義區域
zone "ZONE_NAME" IN {
type {master|slave|forward};
file "網絡地址.zone"
};
(2) 定義區域解析庫文件
注意:不需要MX,以PTR記錄爲主

5.實現從服務器

1、應該爲一臺獨立的名稱服務器
2、主服務器的區域解析庫文件中必須有一條NS記錄指向從服務器
3、從服務器只需要定義區域,而無須提供解析庫文件;解析庫文件應該放置於/var/named/slaves/目錄中
4、主服務器得允許從服務器作區域傳送
5、主從服務器時間應該同步,可通過ntp進行;
6、bind程序的版本應該保持一致;否則,應該從高,主低
定義從區域的方法:

zone "ZONE_NAME" IN {
type slave;
masters { MASTER_IP; };
file "slaves/ZONE_NAME.zone";
};

rndc命令
rndc COMMAND
reload: 重載主配置文件和區域解析庫文件
reload zonename: 重載區域解析庫文件
retransfer zonename: 手動啓動區域傳送,而不管序列號是否增加
notify zonename: 重新對區域傳送發通知
reconfig: 重載主配置文件
querylog: 開啓或關閉查詢日誌文件/var/log/message
trace: 遞增debug一個級別
trace LEVEL: 指定使用的級別
notrace:將調試級別設置爲 0
flush:清空DNS服務器的所有緩存記錄

6.實現子域

子域授權:分佈式數據庫
正向解析區域子域方法
定義一個子區域:

ops.magedu.com.      IN  NS  ns1.ops.magedu.com.
ops.magedu.com.      IN  NS  ns2.ops.magedu.com.
ns1.ops.magedu.com.  IN  A   1.1.1.1
ns2.ops.magedu.com.  IN  A   1.1.1.2
fin.magedu.com.      IN  NS   ns1.fin.magedu.com

7.實現轉發

注意:被轉發的服務器需要能夠爲請求者做遞歸,否則轉發請求不予進行
(1) 全局轉發: 對非本機所負責解析區域的請求,全轉發給指定的服務器

Options {
forward first|only;
forwarders { ip;};
};

(2) 特定區域轉發:僅轉發對特定的區域的請求,比全局轉發優先級高

zone "ZONE_NAME" IN {
type forward;
forward first|only;
forwarders { ip;};
};

注意:關閉dnssec功能

dnssec-enable no;
dnssec-validation

8.實現智能CDN

N的全稱是Content Delivery Network,即內容分發網絡。CDN是構建在網絡之上的內容分發網絡,依靠部署在各地的邊緣服務器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。CDN的關鍵技術主要有內容存儲和分發技術。

基本思路
基本思路是儘可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。

總的來說,內容服務基於緩存服務器,也稱作代理緩存(Surrogate),它位於網絡的邊緣,距用戶僅有"一跳"(Single Hop)之遙。同時,代理緩存是內容提供商源服務器(通常位於CDN服務提供商的數據中心)的一個透明鏡像。這樣的架構使得CDN服務提供商能夠代表他們客戶,即內容供應商,向最終用戶提供儘可能好的體驗,而這些用戶是不能容忍請求響應時間有任何延遲的。

9.DNS排錯

#dig A example.com
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> A example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30523
...
SERVFAIL:The nameserver encountered a problem while processing the query.
•可使用dig +trace排錯,可能是網絡和防火牆導致

二、運維自動化之ansible

1.簡介

ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:

(1)、連接插件connection plugins:負責和被監控端實現通信;

(2)、host inventory:指定操作的主機,是一個配置文件裏面定義監控的主機;

(3)、各種模塊核心模塊、command模塊、自定義模塊;

(4)、藉助於插件完成記錄日誌郵件等功能;

(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。

特性

(1)、no agents:不需要在被管控主機上安裝任何客戶端;

(2)、no server:無服務器端,使用時直接運行命令即可;

(3)、modules in any languages:基於模塊工作,可使用任意語言開發模塊;

(4)、yaml,not code:使用yaml語言定製劇本playbook;

(5)、ssh by default:基於SSH工作;

(6)、strong multi-tier solution:可實現多級指揮。

優點
(1)、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
(2)、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
(3)、使用python編寫,維護更簡單,ruby語法過於複雜;
(4)、支持sudo。

2.Ansible主要組成部分

1.ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件

2.INVENTORY:Ansible管理主機的清單/etc/anaible/hosts

3.MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義

4.PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用

5.API:供第三方程序調用的應用程序編程接口

6.ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解爲是ansible命令工具,其爲核心執行工具

Ansible-playbook(劇本)執行過程:
將已有編排好的任務集寫入Ansible-Playbook
通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行
Ansible主要操作對象:
HOSTS主機
NETWORKING網絡設備
注意事項
執行ansible的主機一般稱爲主控端,中控,master或堡壘機
主控端Python版本需要2.6或以上
被控端Python版本小於2.4需要安裝python-simplejson
被控端如開啓SELinux需要安裝libselinux-python
windows不能做爲主控端

3.安裝配置

安裝方式
1.rpm包安裝: EPEL源
yum install ansible
2.編譯安裝:

yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible

3.Git方式:

git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

4.pip安裝: pip是安裝Python包的管理器,類似yum

yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade

確認安裝: ansible --version

配置文件

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄

程序

/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具

主機清單inventory

Inventory 主機清單
ansible的主要功用在於批量主機操作,爲了便捷地使用其中的部分主機,可以在inventory file中將其分組命名
默認的inventory file爲/etc/ansible/hosts
inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成

/etc/ansible/hosts文件格式
inventory文件遵循INI文件風格,中括號中的字符爲組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明

ntp.magedu.com 
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機
示例:

[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)

[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄
#local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄
#forks = 5 # 默認併發數
#sudo_user = root # 默認sudo 用戶
#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋
#log_path=/var/log/ansible.log #日誌文件
#module_name = command #默認模塊

4.系列命令

ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯繫各被管理節點
Ansible系列命令
ansible
ansible-doc
ansible-playbook
ansible-vault
ansible-console
ansible-galaxy
ansible-pull

ansible <host-pattern> [-m module_name] [-a args]

--version 顯示版本
-m module 指定模塊,默認爲command
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫 --list
-k, --ask-pass 提示輸入ssh連接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入sudo時的口令
-C, --check 檢查,並不執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo 切換
--become-user=USERNAME 指定sudo的runas用戶,默認爲root

ansible的Host-pattern

邏輯與
ansible “websrvs:&dbsrvs” –m ping
在websrvs組並且在dbsrvs組中的主機
邏輯非
ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs組,但不在dbsrvs組中的主機
注意:此處爲單引號
綜合邏輯
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正則表達式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db).*\.magedu\.com

ansible命令執行過程

  1. 加載自己的配置文件 默認/etc/ansible/ansible.cfg
  2. 加載自己對應的模塊文件,如command
  3. 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
  4. 給文件+x執行
  5. 執行並返回結果
  6. 刪除臨時py文件,sleep 0退出

執行狀態:
綠色:執行成功並且不需要做改變的操作
×××:執行成功並且對目標主機做變更
紅色:執行失敗

5.常用模塊

Command:在遠程主機執行命令,默認模塊,可忽略-m選項

ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’
此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現

Shell:和command相似,用shell執行命令

ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &> /tmp/example.txt 這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器

Script:在遠程主機上運行ansible服務器上的腳本

-a "/PATH/TO/SCRIPT_FILE“
ansible websrvs -m script -a /data/f1.sh

Copy:從主控端複製文件到遠程主機

ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
如目標存在,默認覆蓋,此處指定先備份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 指定內容,直接生成目標文件

Fetch:從遠程主機提取文件至主控端,copy相反,目錄可先tar

ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’

File:設置文件屬性

ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’

Hostname:管理主機名

ansible node1 -m hostname -a “name=websrv”

Cron:計劃任務
支持時間:minute,hour,day,month,weekday

ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 創建任務
ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務

Yum:管理包

ansible srv -m yum -a ‘name=httpd state=present’ 安裝
ansible srv -m yum -a ‘name=httpd state=absent’ 刪除

Service:管理服務

ansible srv -m service -a 'name=httpd state=stopped'
ansible srv -m service -a 'name=httpd state=started enabled=yes'
ansible srv -m service -a 'name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted'

User:管理用戶

ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘

刪除用戶及家目錄等數據

Group:管理組

ansible srv -m group -a "name=testgroup system=yes“
ansible srv -m group -a "name=testgroup state=absent

6.playbook

playbook是由一個或多個“play”組成的列表

play的主要功能在於將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。Task實際是調用ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯合起來,按事先編排的機制執行預定義的動作

Playbook採用YAML語言編寫

YAML介紹
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)
特性

YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據類型
YAML有一個一致的信息模型
YAML易於實現
YAML可以基於流來處理
YAML表達能力強,擴展性好

YAML語法簡介
在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
次行開始正常寫Playbook的內容,一般建議寫明Playbook的功能
使用#號註釋代碼
縮進必須是統一的,不能空格和tab混用
縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
YAML文件內容是區別大小寫的,k/v的值均需大小寫敏感
多個k/v可同行寫也可換行寫,同行使用,分隔
v可是個字符串,也可是另一個列表
一個完整的代碼塊功能需最少元素需包括 name 和 task
一個name只能包括一個task
YAML文件擴展名通常爲yml或yaml
List:列表,其所有元素均使用“-”打頭
示例:

# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango

Dictionary:字典,通常由多個key與value構成
示例:

---
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以將key:value放置於{}中進行表示,用,分隔多個key:value

YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)裏的項用"-"來代表,Map裏的鍵值對用":"分隔

示例

name: John Smith
age: 41
gender: Male
spouse:
  name: Jane Smith
  age: 37
  gender: Female
children:
  - name: Jimmy Smith
    age: 17
    gender: Male
  - name: Jenny Smith
    age 13
    gender: Female

Playbook核心元素
Hosts 執行的遠程主機列表
Tasks 任務集
Varniables 內置變量或自定義變量在playbook中調用
Templates 模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
Handlers 和 notity 結合使用,由特定條件觸發的操作,滿足條件方纔執行,否則不執行
tags 標籤 指定某條任務執行,用於選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼爲測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
ansible-playbook -t tagsname useradd.yml
運行playbook的方式

ansible-playbook <filename.yml> ... [options]

常見選項

--check -C 只檢測可能會發生的改變,但不真正執行操作
--list-hosts 列出運行任務的主機
--list-tags 列出tag
--list-tasks 列出task
--limit 主機列表 只針對主機列表中的主機執行
-v -vv -vvv 顯示過程

示例

ansible-playbook file.yml --check 只檢測
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs

Playbook定義

---
- hosts: all
tasks:
- name: "安裝Apache"
yum: name=httpd
- name: "複製配置文件"
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
- name: "複製配置文件"
copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.cd/
- name: "啓動Apache,並設置開機啓動"
service: name=httpd state=started enabled=yes

handlers和notify結合使用觸發條件
Handlers
是task列表,這些task與前述的task並沒有本質上的不同,用於當關注的資源發生變化時,纔會採取一定的操作
Notify此action可用於在每個play的最後被觸發,這樣可避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱爲handler,也即notify中調用handler中定義的操作

示例

- hosts: websrvs
  remote_user: root
tasks:
  - name: add group nginx
    tags: user
    user: name=nginx state=present
  - name: add user nginx
    user: name=nginx state=present group=nginx
  - name: Install Nginx
    yum: name=nginx state=present
  - name: config
    copy: src=/root/config.txt dest=/etc/nginx/nginx.conf
notify:
  - Restart Nginx
  - Check Nginx Process
    handlers:
  - name: Restart Nginx
    service: name=nginx state=restarted enabled=yes
  - name: Check Nginx process
    shell: killall -0 nginx > /tmp/nginx.log

####7.Playbook中變量使用
變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
變量來源:
1 ansible setup facts 遠程主機的所有變量都可直接調用

2 在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高於公共變量
公共(組)變量:針對主機組中所有主機定義統一變量

3 通過命令行指定變量,優先級最高
ansible-playbook –e varname=value

4 在playbook中定義

vars:
- var1: value1
- var2: value2

5 在獨立的變量YAML文件中定義

6 在role中定義

變量命名
變量名僅能由字母、數字和下劃線組成,且只能以字母開頭
變量定義:key=value
示例:http_port=80
變量調用方式:
通過{{ variable_name }} 調用變量,且變量名前後必須有空格,有時用“{{ variable_name }}”才生效
ansible-playbook test.yml -e "hosts=www user=magedu"

模板template

文本文件,嵌套有腳本(使用模板編程語言編寫)
Jinja2語言,使用字面量,有下面形式
    字符串:使用單引號或雙引號
    數字:整數,浮點數
    列表:[item1, item2, ...]
    元組:(item1, item2, ...)
    字典:{key1:value1, key2:value2, ...}
    布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and,or,not
流表達式:For,If,When

template

template功能:根據模塊文件動態生成對應的配置文件
template文件必須存放於templates目錄下,且命名爲 .j2 結尾
yaml/yml 文件需和templates目錄平級,目錄結構如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2

when

條件測試:如果需要根據變量、facts或此前任務的執行結果來做爲某task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法格式
when語句
在task後添加when子句即可使用條件測試;when語句支持Jinja2表達式語法
示例:
tasks:
- name: "shutdown RedHat flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "RedHat"

8.roles

roles

ansible自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中

複雜場景:建議使用roles,代碼複用度高
1.變更指定主機或主機組
2.如命名不規範維護和傳承成本大
3.某些功能需多個Playbook,通過includes即可實現

角色(roles):角色集合

roles/
  mysql/
  httpd/
  nginx/
  memcached/

roles目錄結構:

playbook.yml
  roles/
    project/
    tasks/
    files/
    vars/
    templates/
    handlers/
    default/ 不常用
    meta/ 不常用

Roles各目錄作用

/roles/project/ :項目名稱,有以下子目錄
files/ :存放由copy或script模塊等調用的文件
templates/:template模塊查找所需要模板文件的目錄
tasks/:定義task,role的基本元素,至少應該包含一個名爲main.yml的文件;其它的文件需要在此文件中通過include進行包含
handlers/:至少應該包含一個名爲main.yml的文件;其它的文件需要在此文件中通過include進行包含
vars/:定義變量,至少應該包含一個名爲main.yml的文件;其它的文件需要在此文件中通過include進行包含
meta/:定義當前角色的特殊設定及其依賴關係,至少應該包含一個名爲main.yml的文件,其它文件需在此文件中通過include進行包含
default/:設定默認變量時使用此目錄中的main.yml文件

示例:

nginx-role.yml
roles/
└── nginx
├── files
│ └── main.yml
├── tasks
│ ├── groupadd.yml
│ ├── install.yml
│ ├── main.yml
│ ├── restart.yml
│ └── useradd.yml
└── vars
└── main.ym
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章