python ansible服務(wù)及劇本編寫(xiě)
第1章 ansible軟件概念說(shuō)明
python語(yǔ)言是運(yùn)維人員必會(huì)的語(yǔ)言,而ansible是一個(gè)基于Python開(kāi)發(fā)的自動(dòng)化運(yùn)維工具 (saltstack)。其功能實(shí)現(xiàn)基于SSH遠(yuǎn)程連接服務(wù);ansible可以實(shí)現(xiàn)批量系統(tǒng)配置、批量軟件部署、批量文件拷貝、批量運(yùn)行命令等功能
ansible軟件相關(guān)參考鏈接信息:
http://docs.ansible.com/ansible/intro_installation.html http://www.ansible.com.cn/ http://docs.ansible.com/modules_by_category.html http://www.ansible.cn/docs/
1.1 軟件特點(diǎn)概述
01.不需要單獨(dú)安裝客戶(hù)端(no agents),基于系統(tǒng)自帶的sshd服務(wù),sshd就相當(dāng)于ansible的客戶(hù)端
02.不需要服務(wù)端(no servers)
03.需要依靠大量的模塊實(shí)現(xiàn)批量管理
04.配置文件/etc/ansible/ansible.cfg(無(wú)需配置)
1.2 企業(yè)級(jí)生產(chǎn)場(chǎng)景批量管理-自動(dòng)化管理方案
01.最簡(jiǎn)單/最常用/最強(qiáng)大的選擇是ssh key+shell/pssh方案,一般中小型企業(yè)會(huì)用(50-100臺(tái)以下規(guī)模企業(yè))
a.利用ssh key執(zhí)行命令,并將命令放在腳本里面
b.利用ssh key執(zhí)行命令,將命令放在腳本里面,并加上相應(yīng)循環(huán)語(yǔ)句或判斷語(yǔ)句
02.sina cfengine/puppet較早的批量管理工具(現(xiàn)在基本上沒(méi)有企業(yè)用)
03.門(mén)戶(hù)級(jí)別比較流行的,puppet批量管理工具(復(fù)雜/笨重)
04.saltstack批量管理工具;特點(diǎn):簡(jiǎn)單,功能強(qiáng)大(配置復(fù)雜)---趕集網(wǎng)/小米/ CDN公司
批量管理路線(xiàn):ssh key-->cfengine-->puppet-->saltstack/ansible
注意:使用ansible軟件的前提是ssh key公鑰分發(fā)完成
1.3 實(shí)現(xiàn)集群規(guī)模架構(gòu)一鍵部署自動(dòng)化-步驟說(shuō)明
01.5臺(tái)服務(wù)器先配置好(kickstart,cobbler無(wú)人值守安裝),高級(jí)實(shí)現(xiàn)云計(jì)算(按需分配,動(dòng)態(tài)調(diào)整)-openstack,kvm
02.linux基本優(yōu)化,包括ssh服務(wù)(可以自動(dòng)化實(shí)現(xiàn))
03.創(chuàng)建密鑰信息(自動(dòng)化免交互創(chuàng)建)
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
04.進(jìn)行批量分發(fā)密鑰(sshpass,expect自動(dòng)化實(shí)現(xiàn))
05.ansible軟件安裝(自動(dòng)化實(shí)現(xiàn))
06.網(wǎng)絡(luò)服務(wù)自動(dòng)化安裝(ansible實(shí)現(xiàn))
搭建yum倉(cāng)庫(kù),定制rpm包
第2章 ansible軟件實(shí)踐部署
ansible軟件部署安裝需求
01. 需要有epel源
系統(tǒng)yum源(base epel--pip gem)
sshpass---epel
02. ssh+key免密碼環(huán)境必須部署完成
2.1 ansible地址規(guī)劃
|
服務(wù)器名稱(chēng) |
網(wǎng)卡eth0 |
網(wǎng)卡eth1 |
用途說(shuō)明 |
|
m01 |
10.0.0.61 |
172.16.1.61 |
批量管理服務(wù)器 |
|
nfs01 |
10.0.0.31 |
172.16.1.31 |
nfs共享存儲(chǔ)服務(wù)器 |
|
backup |
10.0.0.41 |
172.16.1.41 |
rsync備份服務(wù)器 |
|
web01 |
10.0.0.8 |
172.16.1.8 |
web服務(wù)器 |
|
說(shuō)明:無(wú)特殊說(shuō)明,子網(wǎng)掩碼均為255.255.255.0,一個(gè)C類(lèi)網(wǎng)段254臺(tái)機(jī)器規(guī)模 |
|||
2.2 ①部署ssh+key免密碼登錄方式
利用非交互式工具實(shí)現(xiàn)批量分發(fā)公鑰與批量管理服務(wù)器
sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostChecking=no 172.16.1.41" sshpass -p123456 ssh -o StrictHostChecking=no root@172.16.1.41 "uptime" sshpass -p123456 scp -o StrictHostChecking=no /etc/hosts root@172.16.1.41:~ <- -p:指定ssh連接用戶(hù)的密碼 <- -o:StrictHostChecking=no 避免第一次登錄出現(xiàn)公鑰檢查
2.3 ②受控端安裝ansible相關(guān)管理軟件
保留yum安裝的軟件
sed -i.bak 's#keepcache=0#keepcache=1#g' /etc/yum.conf 2 grep keepcache /etc/yum.conf
客戶(hù)端配置
yum install libselinux-python -y
說(shuō)明:由于初始我們關(guān)閉了selinux安全管理軟件,故這里需要操作此步驟。不裝這個(gè)軟件只能關(guān)閉selinux,但是無(wú)論什么情況也不要開(kāi)啟,工作環(huán)境下視情況而定
2.4 ③管理端m01安裝ansible軟件
yum install ansible -y
2.4.1 查看版本信息
[root@m01 ~]# ansible --version ansible 2.3.2.0 config file = /etc/ansible/ansible.cfg #告知ansible軟件配置文靜路徑 configured module search path = Default w/o overrides python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
2.4.2 查看軟件相關(guān)安裝信息
[root@m01 ~]# rpm -ql ansible|egrep -v '/usr/share/|/usr/lib' /etc/ansible /etc/ansible/ansible.cfg #ansible配置文件 /etc/ansible/hosts #定義ansible可以管理的主機(jī)信息 /etc/ansible/roles #主要在自動(dòng)化部署多臺(tái)主機(jī)時(shí)應(yīng)用 /usr/bin/ansible /usr/bin/ansible-playbook #執(zhí)行ansible劇本命令
2.4.3 軟件安裝目錄信息
[root@m01 ~]# tree /etc/ansible/ /etc/ansible/ ├── ansible.cfg #ansible配置 ├── hosts #被ansible管理的主機(jī)名單(分組) └── roles
2.5 ④配置/etc/ansible/hosts文件
編輯ansible的主機(jī)配置文件hosts,添加主機(jī)組banana
cp /etc/ansible/hosts{,.bak}
[root@m01 ~]# vim /etc/ansible/hosts #配置文件編寫(xiě)舉例
[banana] #定義組名稱(chēng)
172.16.1.8
172.16.1.31
172.16.1.41
[root@m01 ~]# tail /etc/ansible/hosts
2.6 ⑤實(shí)踐測(cè)試
[root@m01 ~]# ansible banana -m command -a "hostname" #-m指定命令的模塊 -a指定參數(shù)(action) 172.16.1.31 | SUCCESS | rc=0 >> #主機(jī)IP|請(qǐng)求狀態(tài)|返回值(0即成功,否則失敗) nfs01 #命令輸出結(jié)果 172.16.1.8 | SUCCESS | rc=0 >> web01 172.16.1.41 | SUCCESS | rc=0 >> backup
2.6.1 ansible命令輸出信息說(shuō)明
輸出內(nèi)容為綠色,表示執(zhí)行成功,僅查詢(xún)但沒(méi)有發(fā)生任何改變
輸出內(nèi)容為黃色,表示執(zhí)行成功,但對(duì)受控主機(jī)產(chǎn)生了影響,發(fā)生了配置改變
輸出內(nèi)容為紅色:表示執(zhí)行失敗!!!
第3章 ansible有關(guān)語(yǔ)法參數(shù)總結(jié)
3.1 語(yǔ)法格式圖示

3.2 軟件常用參數(shù)表
|
命令參數(shù) |
參數(shù)說(shuō)明 |
|
-m MODULE_NAME |
相應(yīng)名稱(chēng)的模塊被執(zhí)行(默認(rèn)模塊為command); -m后面是模塊的的名字 |
|
-a MODULE_ARGS |
模塊參數(shù)信息; -a后面是要執(zhí)行的命令,也可以寫(xiě)一個(gè)IP,針對(duì)一臺(tái)機(jī)器來(lái)執(zhí)行命令 |
|
-C,--check |
不做任何改變;反而,只是嘗試預(yù)言一些可能出現(xiàn)的改變 |
|
--syntax-check |
執(zhí)行語(yǔ)法檢查在劇本上,但是并不執(zhí)行劇本 |
第4章 ansible常用模塊總結(jié)
|
常見(jiàn)模塊 |
模塊說(shuō)明 |
|
command(重要模塊) |
執(zhí)行命令模塊,ansible命令執(zhí)行默認(rèn)模塊 |
|
shell(重要模塊) |
執(zhí)行shell腳本模塊 |
|
script(重要模塊) |
把腳本發(fā)到客戶(hù)端然后執(zhí)行;執(zhí)行腳本命令在遠(yuǎn)程服務(wù)器上 |
|
copy(重要模塊) |
把本地文件發(fā)送到遠(yuǎn)端 |
|
file |
設(shè)定文件屬性模塊 |
|
service |
系統(tǒng)服務(wù)管理模塊 |
|
cron |
計(jì)劃任務(wù)管理模塊 |
|
yum |
yum軟件包安裝管理模塊 |
|
synchronize |
使用rsync同步文件模塊 |
|
mount |
掛載模塊 |
|
ansible幫助信息系統(tǒng)中查看方法:ansible-doc -l <-查看全部模塊列表信息 ansible-doc -s [模塊] <-查看指定模塊用法參數(shù)信息 |
|
4.1 ping模塊
[root@m01 ~]# ansible banana -m ping
172.16.1.41 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.1.31 | SUCCESS => {
"changed": false,
"ping": "pong"
}
說(shuō)明:ansible連接測(cè)試成功結(jié)果
ansible 172.16.1.8 -m ping
172.16.1.8 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n",
"unreachable": true
}
說(shuō)明:ansible連接測(cè)試不成功結(jié)果
模塊概要:
a.ping是一個(gè)簡(jiǎn)單的測(cè)試模塊,這個(gè)模塊在成功連接時(shí)返回"pong"信息。在劇本中沒(méi)有意義,但能夠使用ansible命令驗(yàn)證登錄能力和用于python的配置
b.這并不是傳統(tǒng)的ICMP ping,而是先檢查是否通過(guò)ssh登錄節(jié)點(diǎn),在檢查python版本是否滿(mǎn)足要求,能滿(mǎn)足要求就返回pong
連接正常返回pong通過(guò)幫助信息可以獲得: ansible-doc -v ping 可以獲得該模塊的說(shuō)明 ansible-doc -s file 參看模塊的具體信息
實(shí)例:
[root@m01 ~]# ansible-doc -v ping Using /etc/ansible/ansible.cfg as config file > PING (/usr/lib/python2.6/site-packages/ansible/modules/system/ping.py) A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability to login and that a usable python is configured. This is NOT ICMP ping, this is just a trivial test module.
4.2 command模塊
|
常見(jiàn)模塊 |
模塊說(shuō)明 |
|
chdir |
在執(zhí)行命令之前,通過(guò)cd命令進(jìn)入到指定目錄中 ansible banana -m command -a "chdir=/tmp ls" |
|
create |
定義一個(gè)文件是否存在,如果不存在運(yùn)行相應(yīng)命令;如果存在跳過(guò)此步驟 |
|
executable |
改變shell使用command進(jìn)行執(zhí)行,并且執(zhí)行時(shí)要使用絕對(duì)路徑 |
|
free_form |
命令模塊采用自由形式命令運(yùn)行;即可以輸入任意linux命令 |
|
removes |
定義一個(gè)文件是否存在,如果存在運(yùn)行相應(yīng)命令;如果不存在跳過(guò)此步驟 |
|
warn |
如果ansible配置文件中定義了命令警告,如果參數(shù)設(shè)置了no/false,將不會(huì)警告此行命令 |
實(shí)例01.
[root@m01 ~]# ansible all -m command -a "date" 172.16.1.8 | SUCCESS | rc=0 >> Thu Oct 19 17:12:27 CST 2017 172.16.1.31 | SUCCESS | rc=0 >> Thu Oct 19 17:12:28 CST 2017 172.16.1.41 | SUCCESS | rc=0 >> Thu Oct 19 17:12:27 CST 2017
實(shí)例02.
[root@m01 ~]# ansible banana -m command -a "chdir=/tmp pwd" 172.16.1.31 | SUCCESS | rc=0 >> /tmp 172.16.1.8 | SUCCESS | rc=0 >> /tmp 172.16.1.41 | SUCCESS | rc=0 >> /tmp
實(shí)例03.
[root@m01 ~]# ansible banana -m command -a "pwd creates=/tmp/banana_file" 172.16.1.31 | SUCCESS | rc=0 >> skipped, since /tmp/banana_file exists 172.16.1.8 | SUCCESS | rc=0 >> /root 172.16.1.41 | SUCCESS | rc=0 >> /root
模塊概要:
a.命令模塊中的多個(gè)參數(shù)設(shè)置用空格進(jìn)行分割
b.命令模塊中不能出現(xiàn) "<", ">", "|", ";" and "&",如需使用這些功能,可用shell模塊
提示:command模塊作為默認(rèn)模塊,在-m不指定具體模塊時(shí),即采用默認(rèn)模塊command
4.3 debug模塊
msg:設(shè)置打印自定義消息;如果忽略,則打印通用信息
[root@m01 ~]# ansible banana -m debug -a "msg=banana"
172.16.1.8 | SUCCESS => {
"msg": "banana"
}
172.16.1.31 | SUCCESS => {
"msg": "banana"
}
172.16.1.41 | SUCCESS => {
"msg": "banana"
}
模塊概要:這個(gè)模塊會(huì)打印語(yǔ)句在執(zhí)行時(shí),并且能夠用于調(diào)試變量或表達(dá)式,可以不需要停止劇本;可以結(jié)合when指令一起進(jìn)行調(diào)試
4.4 copy模塊
|
參數(shù) |
參數(shù)說(shuō)明 |
|
src |
被復(fù)制到遠(yuǎn)程主機(jī)的本地文件。如果路徑是一個(gè)目錄,它將遞歸復(fù)制。如果路徑使用"/"來(lái)結(jié)尾,則只復(fù)制目錄里的內(nèi)容,如果沒(méi)有使用"/"來(lái)結(jié)尾,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制 |
|
remote_src |
如果這個(gè)值設(shè)置為T(mén)rue,將到遠(yuǎn)程/目標(biāo)主機(jī)的機(jī)器上搜索 |
|
dest |
必選項(xiàng)。要將源文件復(fù)制到的遠(yuǎn)程主機(jī)的絕對(duì)路徑,如果源文件是一個(gè)目錄,那么該路徑也必須是個(gè)目錄 |
|
owner |
設(shè)置復(fù)制傳輸后的數(shù)據(jù)屬主信息 |
|
group |
設(shè)置復(fù)制傳輸后的數(shù)據(jù)屬組信息 |
|
mode |
設(shè)置文件數(shù)據(jù)權(quán)限信息(注意4位) |
|
backup |
在覆蓋遠(yuǎn)端服務(wù)器文件之前,將遠(yuǎn)端服務(wù)器源文件備份,備份文件包含時(shí)間信息。有兩個(gè)選項(xiàng):yes|no |
|
content |
用于替代"src”,可以直接設(shè)定指定文件的值 |
|
force |
如果目標(biāo)主機(jī)包含該文件,但內(nèi)容不同。 如果設(shè)置為yes,則強(qiáng)制覆蓋;如果為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時(shí)才復(fù)制,默認(rèn)為yes。 |
|
directory_mode |
遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限 |
模塊概要:
a.copy模塊拷貝文件從本地或遠(yuǎn)程機(jī)器到遠(yuǎn)程機(jī)器的一個(gè)目錄區(qū)域中;使用fetch模塊來(lái)拷貝文件從遠(yuǎn)程區(qū)域到本地
b.如果需要復(fù)制文件中插入的變量值,可以使用template模塊
說(shuō)明:第一次執(zhí)行時(shí)結(jié)果為黃色,即文件傳輸;第二次執(zhí)行沒(méi)有發(fā)生任何改變,即為綠
實(shí)例01. 使用copy 模塊,將/etc/hosts文件傳輸?shù)礁鱾€(gè)服務(wù)器送,權(quán)限修改為044,屬主屬組為banana
[root@m01 ~]# ansible banana -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=banana group=banana "
172.16.1.8 | SUCCESS => {
"changed": true,
"checksum": "b3c1ab140a1265cd7f6de9175a962988d93c629b",
"dest": "/tmp/hosts",
"gid": 500,
"group": "banana",
"md5sum": "8c2b120b4742a806dcfdc8cfff6b6308",
"mode": "0600",
"owner": "banana",
"size": 357,
"src": "/root/.ansible/tmp/ansible-tmp-1508410846.63-224022812989166/source",
"state": "file",
"uid": 500
}
實(shí)例02.移動(dòng)遠(yuǎn)程主機(jī)上的文件remote_src=true參數(shù)
[root@m01 ~]# ansible banana -m copy -a "remote_src=true src=/etc/hosts dest=/opt"
172.16.1.41 | SUCCESS => {
"changed": false,
"checksum": "545f587595b5c60d66243fca48e052ed34eed782",
"dest": "/opt/hosts",
"gid": 0,
"group": "root",
"md5sum": "fe08440ffebed54cab7a9b4cb3c3beda",
"mode": "0644",
"owner": "root",
"size": 371,
"src": "/etc/hosts",
"state": "file",
"uid": 0
}
實(shí)例03.定義文件中的內(nèi)容content=bananaedu.com默認(rèn)沒(méi)有換行
[root@m01 ~]# ansible banana -m copy -a "content=bananaedu.com dest=/opt/banana.txt"
172.16.1.31 | SUCCESS => {
"changed": true,
"checksum": "291694840cd9f9c464263ea9b13421d8e74b7d00",
"dest": "/opt/banana.txt",
"gid": 500,
"group": "banana",
"md5sum": "0a6bb40847793839366d0ac014616d69",
"mode": "0600",
"owner": "banana",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1508649097.07-180967115147583/source",
"state": "file",
"uid": 500
}
4.5 shell模塊
注意:shell模塊在遠(yuǎn)程執(zhí)行腳本時(shí),遠(yuǎn)程主機(jī)上一定要有相應(yīng)的腳本
01.把腳本文件復(fù)制到遠(yuǎn)程服務(wù)器,執(zhí)行遠(yuǎn)程服務(wù)器的腳本
[root@m01 ~]# ansible banana -m shell -a "/bin/sh /server/scripts/ssh-key.sh" 172.16.1.31 | SUCCESS | rc=0 >> fenfa 172.16.1.31 [ OK ] fenfa 172.16.1.41 [ OK ] fenfa 172.16.1.8 [ OK ]
02.把/etc/hosts文件中的內(nèi)容重定向到/banana.txt
[root@m01 ~]# ansible banana -m shell -a "cat /etc/hosts >/banana.txt" 172.16.1.41 | SUCCESS | rc=0 >> 172.16.1.8 | SUCCESS | rc=0 >> 172.16.1.31 | SUCCESS | rc=0 >>
說(shuō)明:可支持command模塊不能完成的特殊符號(hào),同時(shí)匯總所有的模塊
4.6 script模塊
[root@m01 ~]# ansible banana -m script -a "/server/scripts/ip.sh"
172.16.1.8 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.16.1.8 closed.\r\n",
"stdout_lines": [
"eth0 Link encap:Ethernet HWaddr 00:0C:29:4B:16:9D ",
" inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0",
" UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1",
" RX bytes:86527 (84.4 KiB) TX bytes:76532 (74.7 KiB)",
]
}
提示:script模塊與shell模塊的區(qū)別
shell:需要將腳本文件都知道遠(yuǎn)端服務(wù)器,然后sh執(zhí)行遠(yuǎn)端服務(wù)器的腳本
script:不需要將腳本文件復(fù)制到遠(yuǎn)端服務(wù)器,實(shí)質(zhì)是將腳本執(zhí)行過(guò)程在遠(yuǎn)端服務(wù)器上進(jìn)行執(zhí)行
4.7 file模塊
|
參數(shù) |
參數(shù)說(shuō)明 |
|
|
owner |
設(shè)置復(fù)制傳輸后的數(shù)據(jù)屬主信息 |
|
|
group |
設(shè)置復(fù)制傳輸后的數(shù)據(jù)屬組信息 |
|
|
mode |
設(shè)置文件數(shù)據(jù)權(quán)限信息 |
|
|
dest |
要?jiǎng)?chuàng)建的文件或目錄命令,以及路徑信息 |
|
|
src |
指定要?jiǎng)?chuàng)建軟鏈接的文件信息 |
|
|
state |
參數(shù) |
參數(shù)說(shuō)明 |
|
directory |
所有不存在的子目錄將會(huì)被創(chuàng)建 |
|
|
file |
文件不存在將不能被創(chuàng)建 |
|
|
link |
符號(hào)鏈接(軟鏈接)將被創(chuàng)建或更改 |
|
|
hard |
創(chuàng)建出硬鏈接 |
|
|
absent |
目錄將被遞歸刪除以及文件,鏈接被取消 注意:定義文件不存在不會(huì)失敗,只是輸出沒(méi)有發(fā)生任何改變的結(jié)果 |
|
|
touch |
如果路徑不存在將創(chuàng)建一個(gè)空文件,如果文件或目錄存在將接收更新的文件訪(fǎng)問(wèn)和修改時(shí)間 |
|
實(shí)例01.創(chuàng)建遠(yuǎn)端目錄
[root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_dir state=directory"
172.16.1.41 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/banana_dir",
"size": 4096,
"state": "directory",
"uid": 0
}
實(shí)例02.創(chuàng)建遠(yuǎn)端文件
[root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_file state=touch"
172.16.1.8 | SUCCESS => {
"changed": true,
"dest": "/tmp/banana_file",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
4.8 yum模塊
|
參數(shù) |
參數(shù)說(shuō)明 |
|
name=name |
指定安裝的軟件 |
|
state=installed |
安裝 |
[root@m01 ~]# ansible banana -m yum -a "name=nmap state=installed"
172.16.1.41 | SUCCESS => {
"changed": false,
"msg": "",
"rc": 0,
"results": [
"nmap-2:5.51-6.el6.x86_64 providing nmap is already installed"
]
}
提示:這里的state狀態(tài)均為過(guò)去式ed/d
4.9 service模塊
|
參數(shù) |
參數(shù)說(shuō)明 |
|
name=service name |
服務(wù)的名稱(chēng) |
|
state=參數(shù) |
停止服務(wù) 服務(wù)狀態(tài)信息為過(guò)去時(shí) stared/stoped/restarted/reloaded |
|
enabled=yes |
設(shè)置開(kāi)機(jī)自啟動(dòng) |
[root@m01 ~]# ansible banana -m service -a "name=crond state=restarted"
172.16.1.8 | SUCCESS => {
"changed": true,
"name": "crond",
"state": "started"
}
說(shuō)明:此時(shí)name即服務(wù)名,表示將名為crond的服務(wù)停止,并且取消開(kāi)機(jī)自啟動(dòng)
4.10 cron模塊
實(shí)例01.創(chuàng)建定時(shí)任務(wù)
[root@m01 ~]# ansible banana -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'" #name識(shí)別定時(shí)任務(wù)唯一性的標(biāo)識(shí),但只管理ansible信息
172.16.1.41 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"None",
"banana666"
]
}
實(shí)例02.刪除定時(shí)任務(wù)
[root@m01 ~]# ansible banana -m cron -a "name=None minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"
172.16.1.41 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"banana666"
]
}
實(shí)例03.查看定時(shí)任務(wù)
[root@m01 ~]# ansible banana -m shell -a "crontab -l" 172.16.1.8 | SUCCESS | rc=0 >> #time sync by banana at 2017-10-1 #web_backup by rsync #*/5 * * * * /bin/sh /server/scripts/web_backup.sh &>/dev/null #Ansible: banana666 #00 00 * * * /bin/sh /server/scripts/ip.sh &>/dev/null
4.11 fetch模塊
|
參數(shù) |
參數(shù)說(shuō)明 |
|
dest |
將遠(yuǎn)程主機(jī)拉取過(guò)來(lái)的文件保存在本地的路徑信息 |
|
src |
指定從遠(yuǎn)程主機(jī)要拉取的文件信息,只能拉取文件 |
|
flat |
默認(rèn)設(shè)置為no,如果設(shè)置為yes,將不顯示172.16.1.8/etc/信息 |
實(shí)例01.從遠(yuǎn)程主機(jī)拉取文件
[root@m01 ~]# ansible banana -m fetch -a "dest=/tmp src=/etc/hosts"
172.16.1.8 | SUCCESS => {
"changed": true,
"checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5",
"dest": "/tmp/172.16.1.8/etc/hosts",
"md5sum": "27b1ddf7c360698b439627b057f77d51",
"remote_checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5",
"remote_md5sum": null
}
實(shí)例02.拉取時(shí)不創(chuàng)建目錄(同名文件會(huì)覆蓋)
[root@m01 ~]# ansible banana -m fetch -a "dest=/tmp/ src=/etc/hosts flat=yes"
172.16.1.41 | SUCCESS => {
"changed": true,
"checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612",
"dest": "/tmp/hosts",
"md5sum": "211bd00bf9ba8a735db1c7953d7cebc4",
"remote_checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612",
"remote_md5sum": null
}
4.12 mount模塊
|
參數(shù) |
參數(shù)說(shuō)明 |
|
fstype |
指定掛載文件類(lèi)型;-t nfs == fstype=nfs |
|
opts |
設(shè)定掛載的參數(shù)選項(xiàng)信息;-o ro == opts=ro |
|
path |
指定掛載點(diǎn) path=/mnt |
|
src |
要被掛載的目錄設(shè)備信息 src=172.16.1.31:/data/w |
|
state |
01.如果為mountd 在fstab文件中的設(shè)備將被激活掛載和適當(dāng)配置 02.如果為unmounted 設(shè)備將被卸載并不會(huì)改變fstab文件信息,absent和present只處理fstab,但不影響目前的掛載 |
實(shí)例01.掛載
[root@m01 ~]#ansible banana -m mount -a “fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=mounted”
172.16.1.41 | SUCCESS => {
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "ro",
"passno": "0",
"src": "172.16.1.31:/data/w"
}
實(shí)例02.卸載
[root@m01 tmp]# ansible banana -m mount -a "fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=unmounted"
172.16.1.8 | SUCCESS => {
"changed": false,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "ro",
"passno": "0",
"src": "172.16.1.31:/data"
}
第5章 ansible劇本編寫(xiě)
5.1 ansible基礎(chǔ)知識(shí)部分補(bǔ)充
5.1.1 ansible軟件特點(diǎn)
01.可以實(shí)現(xiàn)批量管理
02.可以實(shí)現(xiàn)批量部署
03.ad-hoc(批量執(zhí)行命令)---針對(duì)臨時(shí)性的操作
ansible banana -m command -a "hostname" <-批量執(zhí)行命令舉例
04.編寫(xiě)劇本-腳本(playbook)---針對(duì)重復(fù)性的操作
5.1.2 ansible核心功能
01.pyYAML <-用于ansible編寫(xiě)劇本所使用的語(yǔ)言格式(saltstack---python)
02.paramiko <-遠(yuǎn)程連接與數(shù)據(jù)傳輸
03.Jinja2 <-用于編寫(xiě)ansible的模板信息
5.2 ansible劇本編寫(xiě)規(guī)則說(shuō)明
①規(guī)則一:縮進(jìn)/空格
yaml使用一個(gè)固定的縮進(jìn)風(fēng)格表示數(shù)據(jù)層結(jié)構(gòu)關(guān)系,Saltstack需要每個(gè)縮進(jìn)級(jí)別由兩個(gè)空格組成,一定不能使用tab鍵
注意:編寫(xiě)ansible-playbook文件,一定忘記有tab鍵
②規(guī)則二:冒號(hào)
CMD="echo"
yaml :
mykey :
注意:每個(gè)冒號(hào)前后一定要有空格(以冒號(hào)結(jié)尾不需要空格,表示文件路徑的模板不需要空格)
③規(guī)則三:短橫線(xiàn)
想要表示列表項(xiàng),使用一個(gè)短橫杠加一個(gè)空格。多個(gè)項(xiàng)使用同樣的縮進(jìn)級(jí)別作為同一個(gè)列表的一部分
核心規(guī)則:有效的利用空格進(jìn)行劇本的編寫(xiě),劇本編寫(xiě)是不支持tab的
5.3 劇本編寫(xiě)環(huán)境準(zhǔn)備
|
外網(wǎng)IP |
內(nèi)網(wǎng)IP |
主機(jī)名 |
|
10.0.0.8 |
172.16.1.8 |
web01 |
|
10.0.0.31 |
172.16.1.31 |
nfs01 |
|
10.0.0.41 |
172.16.1.41 |
backup |
|
10.0.0.61 |
172.16.1.61 |
m01 |
5.4 劇本書(shū)寫(xiě)格式
劇本的開(kāi)頭,可以不寫(xiě) - hosts: all #處理所有服務(wù)器,找到所有服務(wù)器; -(空)hosts:(空)all tasks: #劇本所要干的事情; -(空)(空)task: - command: echo hello banana linux. (空)(空)(空)(空)-(空)模塊名稱(chēng):(空)模塊中對(duì)應(yīng)的功能 ansible all -m command -a "echo hello banana linux"
劇本編寫(xiě)內(nèi)容擴(kuò)展:劇本任務(wù)定義名稱(chēng)
- hosts: 172.16.1.7 #處理指定服務(wù)器 -(空)hosts:(空)all task: #劇本所要干的事情; -(空)(空)task: - name: command: echo hello banana linux. (空)(空)(空)(空)-(空)模塊名稱(chēng):(空)模塊中對(duì)應(yīng)的功能
5.4.1 劇本格式示例
[root@m01 ansible-playbook]# vim rsync_sever.yml
- hosts: 172.16.1.41
tasks:
- name: install rsync
yum: name=rsync state=installed
5.5 劇本編寫(xiě)后檢查方法
ansible-playbook --syntax-check 01.yml 進(jìn)行劇本配置信息語(yǔ)法檢查 ansible-playbook -C 01.yml 模擬劇本執(zhí)行(彩排)
5.5.1 語(yǔ)法檢查
[root@m01 ansible-playbook]# ansible-playbook --syntax-check 01.yml playbook: 01.yml
5.5.2 模擬劇本執(zhí)行
[root@m01 ansible-playbook]# ansible-playbook -C 01.yml PLAY [all] *************************************************************** TASK [Gathering Facts] *************************************************************** ok: [172.16.1.41] ok: [172.16.1.8] ok: [172.16.1.31] TASK [cron] *************************************************************** ok: [172.16.1.8] ok: [172.16.1.41] ok: [172.16.1.31] PLAY RECAP *************************************************************** 172.16.1.31 : ok=2 changed=0 unreachable=0 failed=0 172.16.1.41 : ok=2 changed=0 unreachable=0 failed=0 172.16.1.8 : ok=2 changed=0 unreachable=0 failed=0
5.6 劇本示例
5.6.1 劇本編寫(xiě)內(nèi)容擴(kuò)展:劇本任務(wù)編寫(xiě)多個(gè)任務(wù)
- hosts: all
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
5.6.2 劇本編寫(xiě)內(nèi)容擴(kuò)展:劇本任務(wù)編寫(xiě)多個(gè)主機(jī)
- hosts: 172.16.1.7
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
- hosts: 172.16.1.31
tasks:
- name: show ip addr to file
shell: echo $(hostname -i) >> /tmp/ip.txt
5.7 劇本編寫(xiě)方式
01.多主機(jī)單任務(wù)編寫(xiě)方式
02.多主機(jī)多任務(wù)編寫(xiě)方式
03.不同主機(jī)多任務(wù)編寫(xiě)方式
第6章 ansible編寫(xiě)劇本排錯(cuò)思路
6.1 劇本排錯(cuò)方法
1. ansible-playbook編寫(xiě)完,檢査語(yǔ)法和模擬測(cè)試運(yùn)行
2.打開(kāi)劇本,定位異常問(wèn)題原因,將劇本中的內(nèi)容轉(zhuǎn)換命令執(zhí)行一次
3. 將參數(shù)中的腳本文件推送到遠(yuǎn)程屎務(wù)器,在遠(yuǎn)程服務(wù)器本地執(zhí)行腳本 sh -x test.sh
說(shuō)明:ansible執(zhí)行時(shí),加上-vvvv顯示ansible詳細(xì)執(zhí)行過(guò)程,也可以定位異常原因
--syntax-check或-C ansible語(yǔ)法檢查和模擬執(zhí)行(彩排)
6.2 排錯(cuò)邏輯
01.劇本執(zhí)行中的錯(cuò)誤
02.把劇本中的內(nèi)容轉(zhuǎn)換為ansible命令執(zhí)行
ansible banana -m yum -a "name=rsync state=installed"
03.把參數(shù)中的腳本文件推送到遠(yuǎn)端服務(wù)器,放在遠(yuǎn)端被管理服務(wù)器本地上執(zhí)行
sh -x /server/scripts/test.sh
6.3 ansible無(wú)法正常使用
6.3.1 常見(jiàn)問(wèn)題一:在被控端上 root@notty進(jìn)程一直存在
[root@backup ~]# ps -ef|grep sshd root 35274 1 0 15:25 ? 00:00:00 /usr/sbin/sshd root 37004 35274 0 16:23 ? 00:00:00 sshd: root@pts/2 root 37062 35274 0 16:55 ? 00:00:00 sshd: root@notty root 37154 37006 0 16:55 pts/2 00:00:00 grep --color=auto sshd
解決思路:kill pid將該進(jìn)程殺死,然后使用ansible的 -vvvv 參數(shù)查看執(zhí)行的錯(cuò)誤信息
Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.6/site-packages/ansible/plugins/callback/__init__.pyc META: ran handlers Using module file /usr/lib/python2.6/site-packages/ansible/modules/system/ping.py <172.16.1.8> ESTABLISH SSH CONNECTION FOR USER: None <172.16.1.8> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/923ebeb605 172.16.1.8 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
可能為:在/etc/ssh/sshd_config 文件中的第132行為空,導(dǎo)致sftp 無(wú)法連接出錯(cuò)
133 Subsystem sftp /usr/libexec/openssh/sftp-server
6.3.2 常見(jiàn)問(wèn)題二:
[root@m01 ~]# ansible -k 172.16.1.51 -m ping SSH password: [WARNING]: No hosts matched, nothing to do
解決思路:在ansible的hosts文件中,沒(méi)有配置相應(yīng)主機(jī)地址信息
6.3.3 常見(jiàn)問(wèn)題三:
# ansible -k 172.16.1.51 -m ping
SSH password:
172.16.1.51|FAILED! => {
"failed": true,
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
解決思路:在known_hosts文件中沒(méi)有受控端指紋信息
6.4 [附錄](méi)pssh命令使用擴(kuò)展
6.4.1 pssh命令使用場(chǎng)景說(shuō)明
背景:若同時(shí)給上千臺(tái)服務(wù)器執(zhí)行一個(gè)命令,拷貝一個(gè)文件,殺一個(gè)進(jìn)程等,有什么簡(jiǎn)化運(yùn)維管理的工具呢?
在小型企業(yè)中通常使用for循環(huán),但是數(shù)量巨大時(shí):一方面不確定操作是否成功;另一方面for循環(huán)語(yǔ)句性能不好估計(jì)且是否是同步并行執(zhí)行,故此時(shí)會(huì)用到批量并行執(zhí)行的命令如 pdsh,mussh,cssh,dsh等,及下面說(shuō)明提到的pssh
6.4.2 pssh軟件安裝部署方式
①通過(guò)yum安裝pssh軟件
yum install -y pssh <-pssh軟件下載需要依靠epel源
說(shuō)明:pssh是一個(gè)軟件大禮包,里面有很多軟件命令
②通過(guò)編譯方式安裝pssh軟件
wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz tar zxvf pssh-2.2.2.tar.gz cd pssh-2.2.2 python setup.py install
③pssh軟件使用操作說(shuō)明(ssh key認(rèn)證密鑰配置完畢)
01.pssh 多主機(jī)并行運(yùn)行命令
[root@server pssh-2.2.2]# vim hosts_info.txt 172.16.1.31:22 172.16.1.41:22 172.16.1.7:22 //注意我的端口號(hào)不僅是默認(rèn)的22
說(shuō)明:如果想將執(zhí)行命令的批量輸出信息重定向到一個(gè)文件 加-o 目錄 選項(xiàng)
參數(shù)說(shuō)明:
-h HOST_FILE, --hosts=HOST_FILE hosts file (each line "[user@]host[:port]") -o OUTDIR, --outdir=OUTDIR output directory for stdout files (OPTIONAL) -P, --print print output as we get it
02.pscp 把文件并行地復(fù)制到多個(gè)主機(jī)上(從服務(wù)器端給客戶(hù)端傳送文件)
[root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network
03.prsync 使用rsync協(xié)議從本地計(jì)算機(jī)同步到遠(yuǎn)程主機(jī)
[root@server ~]# pssh -h test.txt -P mkdir /tmp/etc [root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc
04.pslurp 將文件從遠(yuǎn)程主機(jī)復(fù)制到本地,和pscp方向相反
[root@server ~]# pslurp -h test.txt -L /tmp/test -l root /tmp/network test [1] 14:53:54 [SUCCESS] 192.168.9.102 9922 [2] 14:53:54 [SUCCESS] 192.168.9.104 9922 [root@server ~]# ll /tmp/test/192.168.9.10 192.168.9.102/ 192.168.9.104/ [root@server ~]# ll /tmp/test/192.168.9.102/ 總計(jì) 4.0K -rw-r--r-- 1 root root 60 2011-04-22 14:53 test [root@server ~]# ll /tmp/test/192.168.9.104/ 總計(jì) 4.0K -rw-r--r-- 1 root root 60 2011-04-22 14:53 test
總結(jié)
以上所述是小編給大家介紹的ansible服務(wù)及劇本編寫(xiě),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- python ansible自動(dòng)化運(yùn)維工具執(zhí)行流程
- python中Ansible模塊的Playbook的具體使用
- ansible-playbook實(shí)現(xiàn)自動(dòng)部署KVM及安裝python3的詳細(xì)教程
- Python自動(dòng)化運(yùn)維之Ansible定義主機(jī)與組規(guī)則操作詳解
- python自動(dòng)化之Ansible的安裝教程
- python將ansible配置轉(zhuǎn)為json格式實(shí)例代碼
- ansible作為python模塊庫(kù)使用的方法實(shí)例
- python開(kāi)發(fā)的自動(dòng)化運(yùn)維工具ansible詳解
相關(guān)文章
Python機(jī)器學(xué)習(xí)算法庫(kù)scikit-learn學(xué)習(xí)之決策樹(shù)實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)算法庫(kù)scikit-learn學(xué)習(xí)之決策樹(shù)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了決策樹(shù)算法的原理及使用sklearn庫(kù)實(shí)現(xiàn)決策樹(shù)的相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
深入理解Python中的*args和**kwargs參數(shù)(示例代碼)
*args和**kwargs是Python函數(shù)編程中極其有用的特性,它們?yōu)楹瘮?shù)參數(shù)的處理提供了極大的靈活性和強(qiáng)大的功能,這篇文章主要介紹了Python中的*args和**kwargs參數(shù),需要的朋友可以參考下2024-06-06
python中淺復(fù)制copy與深復(fù)制deepcopy
本文主要介紹了python中淺復(fù)制copy與深復(fù)制deepcopy,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Python psutil模塊簡(jiǎn)單使用實(shí)例
這篇文章主要介紹了Python psutil模塊簡(jiǎn)單使用實(shí)例,本文直接給出使用腳本,實(shí)現(xiàn)查看cpu的信息、查看內(nèi)存信息、查看系統(tǒng)啟動(dòng)時(shí)間、查看網(wǎng)卡信息等,需要的朋友可以參考下2015-04-04
Python的10道簡(jiǎn)單測(cè)試題(含答案)
這篇文章主要介紹了Python的10道簡(jiǎn)單測(cè)試題(含答案),學(xué)習(xí)了一段時(shí)間python的小伙伴來(lái)做幾道測(cè)試題檢驗(yàn)一下自己的學(xué)習(xí)成果吧2023-04-04
Django處理文件上傳File Uploads的實(shí)例
今天小編就為大家分享一篇Django處理文件上傳File Uploads的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python實(shí)現(xiàn)批量文件分類(lèi)保存的示例代碼
當(dāng)我們電腦里面的文本或者或者文件夾太多了,有時(shí)候想找到自己想要的文件,只能通過(guò)去搜索文件名,這樣還是很麻煩的。本文將通過(guò)Python語(yǔ)言實(shí)現(xiàn)文件批量分類(lèi)保存,需要的可以參考一下2022-04-04

