【大咖講堂-173期】 十五分鐘實現Ansible常用模塊入門
本文是馬哥教育特約金牌講師、Linux運維專家魏巍的分享《Anisble常用模塊入門指南》的文字整理篇。
朋友們晚上好:
今天我為大家帶來的分享是
Ansible系列課堂之基礎入門-基礎模塊的使用
難度指數: 2星(滿星5星)
技術指數: 5星(滿星5星)
理論指數: 2星(滿星5星)
面向人群: 自動化運維&初中級運維
簡單做下自我介紹:
魏巍: 出生時經醫生證實為90后超早期,狂熱的單車與開源愛好者,6年Linux一線運維經驗,《Ansible權威指南》一書聯合作者,做事情常出于“我不懂所以我想知道”的好奇心,在運維界界頗負“魏巍是誰啊沒聽說過”的盛名。
簡介
眾所周知,ansible是自動化運維神器
可以方便的實現大批量定制任務
首先,我們來了解一下ansible的整體架構
接下來,我們對上圖中ansible的核心組件進行簡單的解析
-
Ansible core :?即ansible軟件本身
-
Host ivnetory :?主機池,定義可以由ansible來管理的主機
-
Core modules :?核心模塊,即ansible處自帶的模塊,可完成大部分任務
-
Custom modules :?用戶自己編寫定制的模塊,實現特定功能
-
Playbook :?用于定義多個任務在一個文件中,可多次使用
-
Connection plugin :?用來連接第一個被管理主機,實現一些輔助功能
第一條ansible命令
今天我們將借助一些ansible基礎命令來初步了解一下Host inventory,深入學習幾個常用的Core module
我們來看一條簡單的ansible命令:
ansible datanodes -mcommand -a “uptime”
下面我們對其基本命令格式進行解析
adnsible的基本使用格式,如下:
ansible <host-pattern> [-f forks] [-mmodule_name] [-a args]
-
-f forks:?啟動的并發線程數
-
-m module_name:?要使用的模塊
-
-a args:?模塊所需的參數
主機池
# ansible datanodes -mcommand -a uptime?中,
datanodes即所謂的host-pattern
定義在/etc/ansible/hosts文件中,格式如下:
(主機列表可以為域名,也可為IP地址)
data[4:6]為data4,data5,data6的簡寫形式
只有在/etc/ansible/hosts中定義過的主機,才能被ansible管理
主機變量
可以在inventory中定義主機時為其添加主機變量以便于在playbook中使用。例如:
[webservers]
www1.magedu.com http_port=80maxRequestsPerChild=100
www2.magedu.com http_port=8080maxRequestsPerChild=200
需要注意的是這些變量只能在playbook中使用
組變量
組變量是指賦予給指定組內所有主機上的在playboo中可用的變量。例如:
[webservers]
www1.magedu.com
www2.magedu.com
共享如下變量:
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
如此,ntp_server和nfs_server兩個變量,便可被webservers組內所有主機共享
主機池
Ansible默認使用root用戶,通過ssh對各主機進行管理
建議使用ssh密鑰免密碼認證來連接各主機
但也可以全用指定用戶和密碼,可直接在ansible hosts文件中指定:
ssh相關的參數如下:
ansible_ssh_host
指定域名對應的IP地址
ansible_ssh_port
指定ssh連接端口號
ansible_ssh_user
指定ssh默認使用哪個用戶進行管理
ansible_ssh_pass
ssh連接所用的密碼 (這非常不安全,強烈建議全用ssh密鑰認證或交互式輸入密碼 --ask-pass )
ansible_sudo_pass
?指定sudo的密碼 (這非常不安全,強烈建議全用ssh密鑰認證或交互式輸入密碼 --ask-pass)
簡單明了,不是嗎?
關于主機池的應用,先說這么多
下面我們深入介紹一下幾個常用的核心模塊
常用模塊
Ansible?默認使用command模塊,所以
#ansible –m commanddatanodes -a uptime
可以簡寫為: #ansible datanodes -a uptime
如圖所示:
執行命令成功,返回結果為綠色
獲取幫助
Anbible的模塊那么多,我該如何獲取各模塊的信息和幫助呢?
Ansible為我們提供了ansible-doc命令
基本用法為:
ansible-doc [-Mmodule_path] [-l] [-s] [module...]
-M?文件路徑, --moudle-path=文件路徑
指定額外目錄來尋找模塊所需的庫文件
-s, --snipet=
產生一段可以應用playbook中內容,類似于一種任務模板
-l, --list=
顯示簡潔的模塊列表和一些簡單的注釋
如圖所示,ansible-doc會顯示兩列信息
左側為模塊名,右側為模塊簡介
左右一一對應
簡單明了
以group模塊為例
# ansible-doc -s group
group部共四個參數
-
gid:?指定所建組的ID,可選
-
name:?指定組名
-
state:?設定組的狀態,默認為present,設置為absent時,表示刪除該組
-
system:?值為yes時,表示該組將會被創建為系統組
(注意:group模塊需要依賴系統命令:groupadd,groupdel,groupmod)
如此,我們在各datanode結點上分別創建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模塊常用的參數有:??
-
name:?指定所建用戶的用戶名
-
group:?指定所建用戶的主組,可選
-
groups:?指定所建用戶的附加組,如果設置為空(’groups=’),則清空所有附加組信息
-
shell:?指定使用哪種shell
-
uid:?指定用戶的ID
-
state:?設定帳號狀態,當值為absent時,將會刪除指定用戶
一個直觀的例子:
ansible all –m user –a‘name=dev uid=666 group=developer’
我們看到,uid和group均為我們設置的值
group顯示的是gid,gid501即為我們剛才新建的組ID
狀態值state為present
當我們需要刪除用戶時,使用state設為absent就可以了,如:
ansible all –m user –a‘name=dev uid=666 group=developer state=absent’
copy模塊
顧名思義,copy模塊是用來遠程傳輸文件的
常用參數如下:
-
src:?指定本地源文件路徑,絕對路徑或相對路徑都可以,如果路徑指向一個目錄,則會把目錄下所有文件全部復制
-
dest:遠程主機的上文件存放路徑,必做使用絕對路徑
-
content:?直接在命令中指定文件內容,使用該內容在遠程主機上生成文件
-
backup:?是否備份目標文件,默認為no
-
owner:?指定文件屬主
-
group:?指定文件屬組
-
mode:?指定文件權限,如640
一個簡單的例子
我們要把本地文件/etc/issue復制到遠程主機/tmp/目錄下
屬主為:zabbix用戶
同時,還要求只有屬主對該文件有讀寫權限
ansible datanodes -m copy -a 'src=/etc/issuedest=/tmp/issue.ansible mode=600 owner=zabbix'
content?參數的用法
比如,我們傳送一段內容
“hello world
how are you ?”?到遠程主機上的文件/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可以對\n進行轉義
是不是很棒?!~
定時任務管理模塊:cron??
批量管理定時任務
cron模塊下的參數:day,hour,minute,month,weekday與系統crontab中的值一一對應
默認值都是*
-
jod:指定要定期執行的任務
-
name:?給任務一個簡單的名字或注釋,必選
-
state:?設定任務狀態,absent表示刪除該定時任務
為了演示效果
要求第分鐘ping 一個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變量是必須指定的
刪除某個job時,使用state參數:
state=absent
shell模塊:在遠程主機上執行命令
類似command模塊
但是稍有不同,功能更為強大
比如,使用command中要使用管道符“|”
報出一系列的錯誤
使后shell模塊后
順利執行
所以,當命令中需要用到管道符時,一定要使用shell模塊替代command模塊
最后,給初學都一個最容易上手的模塊
ping模塊
Ping?模塊用于檢測主機的網絡連通性
正常通信的主機,會返回一個pong信號
————廣告時間————
《馬哥Linux云計算及架構師》課程,由知名Linux布道師馬哥創立,經歷了8年的發展,聯合阿里巴巴、唯品會、大眾點評、騰訊、陸金所等大型互聯網一線公司的馬哥課程團隊的工程師進行深度定制開發,課程采用 Centos7.2系統教學,加入了大量實戰案例,授課案例均來自于一線的技術案例。
開課時間:11月06號
掃描二維碼和更多小伙伴組團學習