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