Ansible 介紹與實(shí)戰(zhàn)操作演示
一、概述
Ansible是新出現(xiàn)的自動化運(yùn)維工具,基于Python開發(fā),集合了眾多運(yùn)維工具(puppet、cfengine、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
Ansible 特點(diǎn):
- 部署簡單,只需要在主控端部署Ansible環(huán)境,被控端無需作任何操作
- 默認(rèn)使用SSH協(xié)議對設(shè)備進(jìn)行管理
- 主從集中化管理
- 配置簡單、功能強(qiáng)大、擴(kuò)展性強(qiáng)
- 支持API及自定義模塊、可以通過Python輕松擴(kuò)展
- 通過Playbooks來定制強(qiáng)大的配置、狀態(tài)管理
- 對云計(jì)算平臺、大數(shù)據(jù)都有很好的支持
官方文檔:https://docs.ansible.com/ansible/latest/GitHub地址:https://github.com/ansible/ansible
二、Ansible 架構(gòu)
上圖為ansible的基本架構(gòu),從上圖可以了解到其由以下部分組成:
- 核心:ansible
- 核心模塊(Core Modules):這些都是ansible自帶的模塊
- 擴(kuò)展模塊(Custom Modules):如果核心模塊不足以完成某種功能,可以添加擴(kuò)展模塊
- 插件(Plugins):完成模塊功能的補(bǔ)充
- 劇本(Playbooks):ansible的任務(wù)配置文件,將多個任務(wù)定義在劇本中,由ansible自動執(zhí)行
- 連接插件(Connectior Plugins):ansible基于連接插件連接到各個主機(jī)上,雖然ansible是使用ssh連接到各個主機(jī)的,但是它還支持其他的連接方法,所以需要有連接插件
- 主機(jī)清單(Host Inventory):定義ansible管理的主機(jī)
三、Ansible 工作原理
從上面的圖上可以了解到:
- 管理端支持local 、ssh、zeromq 三種方式連接被管理端,默認(rèn)使用基于ssh的連接,這部分對應(yīng)上面架構(gòu)圖中的連接模塊;
- 可以按應(yīng)用類型等方式進(jìn)行Host Inventory(主機(jī)清單)分類,管理節(jié)點(diǎn)通過各類模塊實(shí)現(xiàn)相應(yīng)的操作,單個模塊,單條命令的批量執(zhí)行,我們可以稱之為ad-hoc;
- 管理節(jié)點(diǎn)可以通過playbooks 實(shí)現(xiàn)多個task的集合實(shí)現(xiàn)一類功能,如web服務(wù)的安裝部署、數(shù)據(jù)庫服務(wù)器的批量備份等。playbooks我們可以簡單的理解為,系統(tǒng)通過組合多條ad-hoc操作的配置文件 。
四、Ansible 安裝與基礎(chǔ)配置
1)開啟記錄日志
配置文件:/etc/ansible/ansible.cfg
2)去掉第一次連接ssh ask確認(rèn)
五、Ansible 的七個命令
安裝完ansible后,發(fā)現(xiàn)ansible一共為我們提供了七個指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault。這里我們只查看usage部分,詳細(xì)部分可以通過 "指令 -h" 的方式獲取。
1)ansible
ansible是指令核心部分,其主要用于執(zhí)行ad-hoc命令,即單條命令。默認(rèn)后面需要跟主機(jī)和選項(xiàng)部分,默認(rèn)不指定模塊時,使用的是command?模塊。不過默認(rèn)使用的模塊是可以在/etc/ansible/ansible.cfg? 中進(jìn)行修改的#module_name = command。
2)ansible-doc
該指令用于查看模塊信息,常用參數(shù)有兩個-l 和 -s
3)ansible-playbook
ansible-playbook 命令是使用最多的指令,其通過讀取playbook 文件后,執(zhí)行相應(yīng)的動作,這個后面會做為一個重點(diǎn)來講。
4)ansible-galaxy
ansible-galaxy 指令用于方便的從https://galaxy.ansible.com/ 站點(diǎn)下載第三方擴(kuò)展模塊,我們可以形象的理解其類似于centos下的yum、python下的pip或easy_install 。如下示例:
5)ansible-lint
ansible-lint是對playbook的語法進(jìn)行檢查的一個工具。用法如下:
6)ansible-pull
該指令使用需要談到ansible的另一種模式,pull 模式,這和我們平常經(jīng)常用的push模式剛好相反,其適用于以下場景:你有數(shù)量巨大的機(jī)器需要配置,即使使用非常高的線程還是要花費(fèi)很多時間;你要在一個沒有網(wǎng)絡(luò)連接的機(jī)器上運(yùn)行Anisble,比如在啟動之后安裝。
7)ansible-vault
- ansible-vault 主要應(yīng)用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以幫你加密/解密這個配置文件,屬高級用法。
- 主要對于playbooks里比如涉及到配置密碼或其他變量時,可以通過該指令加密,這樣我們通過cat看到的會是一個密碼串類的文件,編輯的時候需要輸入事先設(shè)定的密碼才能打開。
- 這種playbook文件在執(zhí)行時,需要加上 --ask-vault-pass參數(shù),同樣需要輸入密碼后才能正常執(zhí)行。
六、Ansible 主要組成部分
1)ansible 命令執(zhí)行來源
- USER,普通用戶,即system administrator
- USER -> ansile playbook -> ansible
- CMDB,(配置管理數(shù)據(jù)庫)API調(diào)用
- PUBLIC / PRIVATE CLOUD API調(diào)用
2)ansible 管理方式
- Ad-Hoc,即ansible命令,主要用于臨時命令使用場景
- Ansible-playbook?,主要用于長期規(guī)劃好的,大型項(xiàng)目的場景,需要有前提的規(guī)劃ansible-playbook(劇本)執(zhí)行過程:
- 將已有編排好的任務(wù)集寫入ansible-playbook
- 通過ansible-playbook命令分拆任務(wù)集至逐條ansible命令,按預(yù)定規(guī)則逐條執(zhí)行
3)ansible主要操作對象
- HOSTS:主機(jī)
- NETWORKING:網(wǎng)絡(luò)設(shè)備
注意事項(xiàng):
- 執(zhí)行ansible的主機(jī)一般稱為主控端,中控,master或堡壘機(jī)
- 主控端python版本需要在2.6或以上
- 被控端python版本小于2.4需要安裝python-simplejson
- 被控端如開啟SELinux需要安裝libselinux-python
- windows不能作為主控端
七、Ansible 連接被控端方式
1)ssh 密鑰
2)賬號密碼
1、命令行配置
2、配置文件中配置
常用的配置參數(shù)如下:
八、Host Inventory(主機(jī)清單)
主機(jī)清單配置(默認(rèn)配置文件:/etc/ansible/hosts)
1)添加被管控節(jié)點(diǎn)
示例:
2)配置主機(jī)組
示例:
3)配置連接用戶名和密碼
常用配置參數(shù)如下:
示例:
4)子分組
示例:
5)自定義主機(jī)列表文件
示例:
九、Ad-Hoc(點(diǎn)對點(diǎn)模式)
官方文檔:https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html
1)簡介
ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令,一般測試調(diào)試時用的多,ad-hoc簡而言之,就是"臨時命令"。
2)常用模塊
1、command 模塊(默認(rèn)模塊)
默認(rèn)模塊,沒有shell強(qiáng)大,基本上shell模塊都可以支持command模塊的功能。
【1】幫助
【2】參數(shù)解釋
- free_form——必須參數(shù),指定需要遠(yuǎn)程執(zhí)行的命令。需要說明一點(diǎn),free_form 參數(shù)與其他參數(shù)(如果想要使用一個參數(shù),那么則需要為這個參數(shù)賦值,也就是name=value模式)并不相同。比如,當(dāng)我們想要在遠(yuǎn)程主機(jī)上執(zhí)行 ls 命令時,我們并不需要寫成”free_form=ls” ,這樣寫反而是錯誤的,因?yàn)椴]有任何參數(shù)的名字是 free_form,當(dāng)我們想要在遠(yuǎn)程主機(jī)中執(zhí)行 ls 命令時,直接寫成 ls 即可。因?yàn)?command 模塊的作用是執(zhí)行命令,所以,任何一個可以在遠(yuǎn)程主機(jī)上執(zhí)行的命令都可以被稱為 free_form。
- chdir——此參數(shù)的作用就是指定一個目錄,在執(zhí)行對應(yīng)的命令之前,會先進(jìn)入到 chdir 參數(shù)指定的目錄中。
- creates——看到 creates,你可能會從字面上理解這個參數(shù),但是使用這個參數(shù)并不會幫助我們創(chuàng)建文件,它的作用是當(dāng)指定的文件存在時,就不執(zhí)行對應(yīng)命令,比如,如果 /testdir/test文件存在,就不執(zhí)行我們指定的命令。
- removes——與 creates 參數(shù)的作用正好相反,它的作用是當(dāng)指定的文件不存在時,就不執(zhí)行對應(yīng)命令,比如,如果 /testdir/tests 文件不存在,就不執(zhí)行我們指定的命令,此參數(shù)并不會幫助我們刪除文件。
【3】示例演示
2、shell 模塊
shell模塊 [執(zhí)行遠(yuǎn)程主機(jī)的shell/python等腳本]。
【1】查看幫助
【2】示例演示
3、script 模塊
script模塊 [在遠(yuǎn)程主機(jī)執(zhí)行主控端的shell/python等腳本 ]。
【1】查看幫助
【2】參數(shù)解釋
- free_form——必須參數(shù),指定需要執(zhí)行的腳本,腳本位于 ansible 管理主機(jī)本地,并沒有具體的一個參數(shù)名叫 free_form,具體解釋請參考 command 模塊。
- chdir——此參數(shù)的作用就是指定一個遠(yuǎn)程主機(jī)中的目錄,在執(zhí)行對應(yīng)的腳本之前,會先進(jìn)入到 chdir 參數(shù)指定的目錄中。
- creates——使用此參數(shù)指定一個遠(yuǎn)程主機(jī)中的文件,當(dāng)指定的文件存在時,就不執(zhí)行對應(yīng)腳本,可參考 command 模塊中的解釋。
- removes——使用此參數(shù)指定一個遠(yuǎn)程主機(jī)中的文件,當(dāng)指定的文件不存在時,就不執(zhí)行對應(yīng)腳本,可參考 command 模塊中的解釋。
【3】示例演示
4、raw 模塊
raw模塊 [類似于command模塊、支持管道傳遞]。
【1】查看幫助
【2】示例演示
5、copy 模塊
copy 模塊 從主控端復(fù)制文件到被控端。
【1】查看幫助
【2】示例演示
6、fetch 模塊
copy 模塊從被控端復(fù)制文件到主控端,正好跟copy相反。
【1】查看幫助
【2】示例演示
7、unarchive 模塊(解包模塊)
unarchive 模塊是解包模塊。
【1】查看幫助
【2】參數(shù)解釋
- copy——默認(rèn)為yes,當(dāng)copy=yes,那么拷貝的文件是從ansible主機(jī)復(fù)制到遠(yuǎn)程主機(jī)上的,如果設(shè)置為copy=no,那么會在遠(yuǎn)程主機(jī)上尋找src源文件。
- src——源路徑,可以是ansible主機(jī)上的路徑,也可以是遠(yuǎn)程主機(jī)上的路徑,如果是遠(yuǎn)程主機(jī)上的路徑,則需要設(shè)置copy=no。
- dest——遠(yuǎn)程主機(jī)上的目標(biāo)路徑。
- mode——設(shè)置解壓縮后的文件權(quán)限。
【3】示例演示
8、archive模塊(打包模塊)
unarchive 模塊是打包模塊。
【1】查看幫助
【2】示例演示
9、user 模塊
【1】查看幫助
【2】示例演示
10、group 模塊
【1】查看幫助
【2】示例演示
11、yum 模塊
【1】查看幫助
【2】示例演示
12、service 模塊
【1】查看幫助
【2】示例演示
13、file 模塊
【1】查看幫助
【2】示例演示
14、setup 模塊
【1】查看幫助
【2】示例演示
15、cron 模塊
【1】查看幫助
【2】示例演示
16、hostname 模塊
【1】查看幫助
【2】示例演示
Ansible 的介紹和簡單使用就先到這里了,還有一個ansible-playbook是非常重要,內(nèi)容也是比較多,就放到下篇文章介紹了。