【大咖講堂-173期】 十五分鐘實(shí)現(xiàn)Ansible常用模塊入門
本文是馬哥教育特約金牌講師、Linux運(yùn)維專家魏巍的分享《Anisble常用模塊入門指南》的文字整理篇。
朋友們晚上好:
今天我為大家?guī)?lái)的分享是
Ansible系列課堂之基礎(chǔ)入門-基礎(chǔ)模塊的使用
難度指數(shù): 2星(滿星5星)
技術(shù)指數(shù): 5星(滿星5星)
理論指數(shù): 2星(滿星5星)
面向人群: 自動(dòng)化運(yùn)維&初中級(jí)運(yùn)維
簡(jiǎn)單做下自我介紹:
魏巍: 出生時(shí)經(jīng)醫(yī)生證實(shí)為90后超早期,狂熱的單車與開源愛(ài)好者,6年Linux一線運(yùn)維經(jīng)驗(yàn),《Ansible權(quán)威指南》一書聯(lián)合作者,做事情常出于“我不懂所以我想知道”的好奇心,在運(yùn)維界界頗負(fù)“魏巍是誰(shuí)啊沒(méi)聽說(shuō)過(guò)”的盛名。
簡(jiǎn)介
眾所周知,ansible是自動(dòng)化運(yùn)維神器
可以方便的實(shí)現(xiàn)大批量定制任務(wù)
首先,我們來(lái)了解一下ansible的整體架構(gòu)

接下來(lái),我們對(duì)上圖中ansible的核心組件進(jìn)行簡(jiǎn)單的解析
-
Ansible core :?即ansible軟件本身
-
Host ivnetory :?主機(jī)池,定義可以由ansible來(lái)管理的主機(jī)
-
Core modules :?核心模塊,即ansible處自帶的模塊,可完成大部分任務(wù)
-
Custom modules :?用戶自己編寫定制的模塊,實(shí)現(xiàn)特定功能
-
Playbook :?用于定義多個(gè)任務(wù)在一個(gè)文件中,可多次使用
-
Connection plugin :?用來(lái)連接第一個(gè)被管理主機(jī),實(shí)現(xiàn)一些輔助功能
第一條ansible命令
今天我們將借助一些ansible基礎(chǔ)命令來(lái)初步了解一下Host inventory,深入學(xué)習(xí)幾個(gè)常用的Core module
我們來(lái)看一條簡(jiǎn)單的ansible命令:
ansible datanodes -mcommand -a “uptime”

下面我們對(duì)其基本命令格式進(jìn)行解析
adnsible的基本使用格式,如下:
ansible <host-pattern> [-f forks] [-mmodule_name] [-a args]
-
-f forks:?啟動(dòng)的并發(fā)線程數(shù)
-
-m module_name:?要使用的模塊
-
-a args:?模塊所需的參數(shù)
主機(jī)池
# ansible datanodes -mcommand -a uptime?中,
datanodes即所謂的host-pattern
定義在/etc/ansible/hosts文件中,格式如下:

(主機(jī)列表可以為域名,也可為IP地址)
data[4:6]為data4,data5,data6的簡(jiǎn)寫形式
只有在/etc/ansible/hosts中定義過(guò)的主機(jī),才能被ansible管理
主機(jī)變量
可以在inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用。例如:
[webservers]
www1.magedu.com http_port=80maxRequestsPerChild=100
www2.magedu.com http_port=8080maxRequestsPerChild=200
需要注意的是這些變量只能在playbook中使用
組變量
組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playboo中可用的變量。例如:
[webservers]
www1.magedu.com
www2.magedu.com
共享如下變量:
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
如此,ntp_server和nfs_server兩個(gè)變量,便可被webservers組內(nèi)所有主機(jī)共享
主機(jī)池
Ansible默認(rèn)使用root用戶,通過(guò)ssh對(duì)各主機(jī)進(jìn)行管理
建議使用ssh密鑰免密碼認(rèn)證來(lái)連接各主機(jī)
但也可以全用指定用戶和密碼,可直接在ansible hosts文件中指定:

ssh相關(guān)的參數(shù)如下:
ansible_ssh_host
指定域名對(duì)應(yīng)的IP地址
ansible_ssh_port
指定ssh連接端口號(hào)
ansible_ssh_user
指定ssh默認(rèn)使用哪個(gè)用戶進(jìn)行管理
ansible_ssh_pass
ssh連接所用的密碼 (這非常不安全,強(qiáng)烈建議全用ssh密鑰認(rèn)證或交互式輸入密碼 --ask-pass )
ansible_sudo_pass
?指定sudo的密碼 (這非常不安全,強(qiáng)烈建議全用ssh密鑰認(rèn)證或交互式輸入密碼 --ask-pass)
簡(jiǎn)單明了,不是嗎?
關(guān)于主機(jī)池的應(yīng)用,先說(shuō)這么多
下面我們深入介紹一下幾個(gè)常用的核心模塊
常用模塊
Ansible?默認(rèn)使用command模塊,所以
#ansible –m commanddatanodes -a uptime
可以簡(jiǎn)寫為: #ansible datanodes -a uptime

如圖所示:
執(zhí)行命令成功,返回結(jié)果為綠色
獲取幫助
Anbible的模塊那么多,我該如何獲取各模塊的信息和幫助呢?
Ansible為我們提供了ansible-doc命令
基本用法為:
ansible-doc [-Mmodule_path] [-l] [-s] [module...]
-M?文件路徑, --moudle-path=文件路徑
指定額外目錄來(lái)尋找模塊所需的庫(kù)文件
-s, --snipet=
產(chǎn)生一段可以應(yīng)用playbook中內(nèi)容,類似于一種任務(wù)模板
-l, --list=
顯示簡(jiǎn)潔的模塊列表和一些簡(jiǎn)單的注釋

如圖所示,ansible-doc會(huì)顯示兩列信息
左側(cè)為模塊名,右側(cè)為模塊簡(jiǎn)介
左右一一對(duì)應(yīng)
簡(jiǎn)單明了

以group模塊為例
# ansible-doc -s group

group部共四個(gè)參數(shù)
-
gid:?指定所建組的ID,可選
-
name:?指定組名
-
state:?設(shè)定組的狀態(tài),默認(rèn)為present,設(shè)置為absent時(shí),表示刪除該組
-
system:?值為yes時(shí),表示該組將會(huì)被創(chuàng)建為系統(tǒng)組
(注意:group模塊需要依賴系統(tǒng)命令:groupadd,groupdel,groupmod)
如此,我們?cè)诟鱠atanode結(jié)點(diǎn)上分別創(chuàng)建gid為501的組
#ansible datanodes -m group -a 'name=developer'
data2| success >> {
??? "changed": true,
??? "gid": 501,
??? "name": "developer",
??? "state": "present",
??? "system": false
}
data3| success >> {
??? "changed": true,
??? "gid": 501,
??? "name": "developer",
??? "state": "present",
??? "system": false
}

刪除developer組操作
?? # ansible datanodes -m group -a'name=developer state=absent'
data4 | success>> {
??? "changed": true,
??? "name": "developer",
??? "state": "absent"
}
data3 | success>> {
??? "changed": true,
??? "name": "developer",
??? "state": "absent"
}

user模塊
ansible-doc user

user模塊常用的參數(shù)有:??
-
name:?指定所建用戶的用戶名
-
group:?指定所建用戶的主組,可選
-
groups:?指定所建用戶的附加組,如果設(shè)置為空(’groups=’),則清空所有附加組信息
-
shell:?指定使用哪種shell
-
uid:?指定用戶的ID
-
state:?設(shè)定帳號(hào)狀態(tài),當(dāng)值為absent時(shí),將會(huì)刪除指定用戶
一個(gè)直觀的例子:
ansible all –m user –a‘name=dev uid=666 group=developer’

我們看到,uid和group均為我們?cè)O(shè)置的值
group顯示的是gid,gid501即為我們剛才新建的組ID
狀態(tài)值state為present
當(dāng)我們需要?jiǎng)h除用戶時(shí),使用state設(shè)為absent就可以了,如:
ansible all –m user –a‘name=dev uid=666 group=developer state=absent’

copy模塊
顧名思義,copy模塊是用來(lái)遠(yuǎn)程傳輸文件的
常用參數(shù)如下:
-
src:?指定本地源文件路徑,絕對(duì)路徑或相對(duì)路徑都可以,如果路徑指向一個(gè)目錄,則會(huì)把目錄下所有文件全部復(fù)制
-
dest:遠(yuǎn)程主機(jī)的上文件存放路徑,必做使用絕對(duì)路徑
-
content:?直接在命令中指定文件內(nèi)容,使用該內(nèi)容在遠(yuǎn)程主機(jī)上生成文件
-
backup:?是否備份目標(biāo)文件,默認(rèn)為no
-
owner:?指定文件屬主
-
group:?指定文件屬組
-
mode:?指定文件權(quán)限,如640
一個(gè)簡(jiǎn)單的例子
我們要把本地文件/etc/issue復(fù)制到遠(yuǎn)程主機(jī)/tmp/目錄下
屬主為:zabbix用戶
同時(shí),還要求只有屬主對(duì)該文件有讀寫權(quán)限
ansible datanodes -m copy -a 'src=/etc/issuedest=/tmp/issue.ansible mode=600 owner=zabbix'


content?參數(shù)的用法
比如,我們傳送一段內(nèi)容
“hello world
how are you ?”?到遠(yuǎn)程主機(jī)上的文件/tmp/content.ansible,操作如下:
# ansible datanodes -m copy -a'content="hello world!\n how are you? \n"dest="/tmp/content.ansible"'

# ssh data3 "cat /tmp/content.ansible"
hello world!
?how areyou?
content可以對(duì)\n進(jìn)行轉(zhuǎn)義
是不是很棒?!~

定時(shí)任務(wù)管理模塊:cron??
批量管理定時(shí)任務(wù)
cron模塊下的參數(shù):day,hour,minute,month,weekday與系統(tǒng)crontab中的值一一對(duì)應(yīng)
默認(rèn)值都是*
-
jod:指定要定期執(zhí)行的任務(wù)
-
name:?給任務(wù)一個(gè)簡(jiǎn)單的名字或注釋,必選
-
state:?設(shè)定任務(wù)狀態(tài),absent表示刪除該定時(shí)任務(wù)

為了演示效果
要求第分鐘ping 一個(gè)www.baidu.com
# ansible data1 -m cron -a 'name="pingtest" minute="*/1" job="ping www.baidu.com" '
data1 | success >> {
???"changed": true,
???"jobs": [
???????"ping test"
??? ]
}

注意:
?? name變量是必須指定的

刪除某個(gè)job時(shí),使用state參數(shù):
state=absent

shell模塊:在遠(yuǎn)程主機(jī)上執(zhí)行命令
類似command模塊
但是稍有不同,功能更為強(qiáng)大
比如,使用command中要使用管道符“|”
報(bào)出一系列的錯(cuò)誤

使后shell模塊后

順利執(zhí)行
所以,當(dāng)命令中需要用到管道符時(shí),一定要使用shell模塊替代command模塊
最后,給初學(xué)都一個(gè)最容易上手的模塊
ping模塊
Ping?模塊用于檢測(cè)主機(jī)的網(wǎng)絡(luò)連通性
正常通信的主機(jī),會(huì)返回一個(gè)pong信號(hào)

————廣告時(shí)間————
《馬哥Linux云計(jì)算及架構(gòu)師》課程,由知名Linux布道師馬哥創(chuàng)立,經(jīng)歷了8年的發(fā)展,聯(lián)合阿里巴巴、唯品會(huì)、大眾點(diǎn)評(píng)、騰訊、陸金所等大型互聯(lián)網(wǎng)一線公司的馬哥課程團(tuán)隊(duì)的工程師進(jìn)行深度定制開發(fā),課程采用 Centos7.2系統(tǒng)教學(xué),加入了大量實(shí)戰(zhàn)案例,授課案例均來(lái)自于一線的技術(shù)案例。
開課時(shí)間:11月06號(hào)
掃描二維碼和更多小伙伴組團(tuán)學(xué)習(xí)

