轉自:51CTO部落格-俊偉祺i
https://blog。51cto。com/14156658/2461907
一、Ansible 概述
Ansible 是近年來越來越火的一款開源運維自動化工具,透過Ansible可以實現運維自動化,提高運維工程師的工作效率,減少人為失誤。
Ansible 透過本身整合的非常豐富的模組可以實現各種管理任務,其自帶模組超過上千個。更為重要的是,它操作非常簡單,即使小白也可以輕鬆上手,但它提供的功能又非常豐富,在運維領域,幾乎可以做任何事。
1、Ansible 特點
Ansible 自 2012 年釋出以來,很快在全球流行,其特點如下:
Ansible 基於 Python 開發,運維工程師對其二次開發相對比較容易;
Ansible 豐富的內建模組,幾乎可以滿足一切要求;
管理模式非常簡單,一條命令可以影響上千臺主機;
無客戶端模式,底層透過 SSH 通訊;
Ansible釋出後,也陸續被 AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter 等大公司接納並投入使用;
二、Ansible的角色
使用者:如何使用 Ansible 實現自動化運維?
Ansible 工具集:Ansible 可以實現的功能?
作用物件:Ansible 可以影響哪些主機?
1、使用者
如下圖所示:Ansible 使用者可以採用多種方式和 Ansible 互動,圖中展示了四種方式:
CMDB:CMDB 儲存和管理者企業IT架構中的各項配置資訊,是構建 ITIL 專案的核心工具,運維人員可以組合 CMDB 和 Ansible,透過 CMDB 直接下發指令呼叫Ansible 工具集完成操作者所希望達到的目標;
PUBLIC/PRIVATE 方式:Ansible 除了豐富的內建模組外,同時還提供豐富的 API語言介面,如PHP、Python、PERL 等多種流行語言,基於 PUBLIC/PRIVATE,Ansible 以 API 呼叫的方式執行;
Ad-Hoc 命令集:Users直接透過Ad-Hoc命令集呼叫Ansible工具集來完成任務;
Playbooks:Users 預先編寫好 Ansible Playbooks,透過執行
Playbooks 中預先編排好的任務集,按序執行任務;
2、Ansible 工具集
Ansible 工具集包含 Inventory、Modules、Plugins 和 API。
其中:Inventory:用來管理裝置列表,可以透過分組實現,對組的呼叫直接影響組內的所有主機;Modules:是各種執行模組,幾乎所有的管理任務都是透過模組執行的;Plugins:提供了各種附加功能;API:為程式設計人員提供一個介面,可以基於此做 Ansible的二次開發;具體表現如下:
Ansible Playbooks:任務指令碼,編排定義Ansible任務及的配置檔案,由Ansible按序依次執行,通常是JSON格式的YML檔案;
Inventory:Ansible 管理主機清單;
Modules:Ansible 執行命令功能模組,多數為內建的核心模組,也可自定義;
Plugins:模組功能的補充,如連線型別外掛、迴圈外掛、變數外掛、過濾外掛等,該功能不太常用;
API:供第三方程式呼叫的應用程式程式設計介面;
Ansible:該部分圖中表現得不太明顯,組合 Inventory、API、Modules、Plugins可以理解為是 Ansible 命令工具,其為核心執行工具;
3、作用物件
Ansible 的作用物件不僅僅是 Linux 和非 Linux 作業系統的主機,也可以作用於各類PUBLIC/PRIVATE、商業和非商業裝置的網路設施。
使用者使用 Ansible 或 Ansible-Playbooks 時,在伺服器終端輸入 Ansible 的 Ad-Hoc命令集或 Playbooks 後,Ansible 會遵循預選安排的規則將 Playbooks 逐步拆解為Play,再將 Play 組織成 Ansible 可以識別的任務,隨後呼叫任務涉及的所有模組和外掛,根據 Inventory 中定義的主機列表透過 SSH 將任務集以臨時檔案或命令的形式傳輸到遠端客戶端執行並返回執行結果,如果是臨時檔案則執行完畢後自動刪除。
三、Ansible的配置
1、Ansible安裝
Ansible的安裝部署非常簡單,以RPM安裝為例,其依賴軟體只有Python和SSH,且系統預設均已安裝。Ansible的管理端只能是Linux,如Redhat、Debian、Centos。
1)透過YUM安裝Ansible
可以自行從網際網路上直接下載Ansible所需軟體包,本篇部落格提供安裝Ansible自動化運維工具所需的依賴軟體包
2)驗證安裝結果
3)建立 SSH 免互動登入
Ansible 透過 SSH 對裝置進行管理,而 SSH 包含兩種認證方式:一種是透過密碼認證,另一種是透過金鑰對驗證。前者必須和系統互動,而後者是免互動登入。如果希望透過 Ansible 自動管理裝置,應該配置為免互動登入被管理裝置。
至此,已經完成 Ansible 的部署,接下來就可以透過 Ansible 對裝置進行管理了。
2、Ansible 配置
Inventory 是 Ansible 管理主機資訊的配置檔案,相當於系統 Hosts 檔案的功能,預設存放在 /etc/ansible/hosts。
在 hosts 檔案中,透過分組來組織裝置,Ansible 透過 Inventory 來定義主機和分組,透過在 ansible 命令中使用選項或來指定 Inventory。
如果使用預設的 Inventory檔案(/etc/ansible/hosts),也可以不指定 Inventory 檔案,例如:
Ansible 透過裝置列表以分組的方式新增到 /etc/ansible/hosts 檔案來實現對裝置的管理,所以在正式管理之前,首先要編寫好 hosts 檔案。hosts 檔案中,以[ ]包含的部分代表組名,裝置列表支援主機名和IP地址。
預設情況下,透過訪問22埠(SSH)來管理裝置。若目標主機使用了非預設的SSH埠,還可以在主機名稱之後使用冒號加埠標明,以行為單位分隔配置。另外,hosts檔案還支援萬用字元。
可以將一個主機同時歸置在不同的組中。
配置完成之後,可以針對hosts定義的組進行遠端操作,也可以針對組中的某一個或多個主機操作。例如:
1)只對web組中192。168。1。2主機操作,透過—limit引數限定主機的變更。
2)只對192。168。100。20主機操作。透過IP限定主機的變更。
3)只對192。168。100。0網段主機操作,這就需要使用到萬用字元來限定主機的變更了。
3、Ansible 命令
Ansible 的維護命令大多數是以 ansible 開頭,在終端輸入 ansible 後連續按兩次Tab鍵,會補全所有跟 ansible 相關的命令。
1)ansible
ansible 是生產環境中使用非常頻繁的命令之一,主要在以下場景使用:
非固化需求;
臨時一次性操作;
二次開發介面呼叫;
非固化需求是指臨時性的維護,如檢視web伺服器組磁碟使用情況、複製一個檔案到其他機器等。類似這些沒有規律的、臨時需要做的任務,我們成為非固化需求,臨時一次性操作,語法如下:
-v(—verbose):輸出詳細的執行過程資訊,可以得到執行過程所有資訊;
-i PATH(—inventory=PATH):指定inventory資訊,預設為/etc/ansible/hosts;
-f NUM(—forks=NUM):併發執行緒數,預設為5個執行緒;
—private-key=PRIVATE_KEY_FILE:指定金鑰檔案;
-m NAME,—module-name=NAME:指定執行使用的模組;
-M DIRECTORY(—module-path=DIRECTORY) :指定模組存放路徑,預設為/usr/share/ansible;
-a ARGUMENTS(—args=ARGUMENTS):指定模組引數;
-u USERNAME(—user=USERNAME):指定遠端主機以USERNAME執行命令;
-l subset(—limit=SUBSET):限制執行主機;
①檢查所有主機是否存活,執行命令如下:
②列出web組所有的主機列表,執行命令如下:
③批次顯示web組中的磁碟使用空間,執行命令如下:
web關鍵字需要提前在/etc/ansible/hosts檔案中定義組。
Ansible的返回結果非常友好,一般會用三種顏色來表示執行結果:
紅色:表示執行過程出現異常;
橘黃顏色:表示命令執行後目標有狀態變化;
綠色:表示執行成功且沒有目標機器做修改;
2)Ansible-doc
Ansible-doc用來查詢ansible模組文件的說明,類似於man命令,針對每個模組都有詳細的用法說明及應用案例介紹,語法如下:
列出支援的模組:
查詢ping模組的說明資訊:
3)Ansible-playbook
Ansible-playbook是日常應用中使用頻率最高的命令,類似於Linux中的sh或source命令,用來執行系列任務。
其工作機制:透過讀取預先編寫好的playbook檔案實現集中處理任務。Ansible-playbook命令後跟yml格式的playbook檔案,playbook檔案存放了要執行的任務程式碼,命令使用方式如下:
4)Ansible-console
Ansible-console是Ansible為使用者提供的一款互動式工具,類似於Windows的cmd或者是Linux中shell。使用者可以在ansible-console虛擬出來的終端上像shell一樣使用Ansible內建的各種命令,這為習慣於使用shell互動式方式的使用者提供了良好的使用體驗。在終端輸入ansible-console命令後,顯示如下:
4、Ansible模組
1)command模組
command模組在遠端主機執行命令,不支援管道、重定向等shell的特性。常用的引數如下:
chdir:在遠端主機上執行命令前要提前進入的目錄;
creates:在命令執行時建立一個檔案,如果檔案已存在,則不會執行建立任務;
removes:在命令執行時移除一個檔案,如果檔案不存在,則不會執行移除任務;
executeable:指明執行命令的shell程式;
在所有主機上執行“ls 。/”命令,執行前切換到/home目錄下。操作如下:
2)shell模組
shell模組在遠端主機執行命令,相當於呼叫遠端主機的Shell程序,然後在該Shell下開啟一個子Shell執行命令。和command模組的區別是它支援Shell特性:如管道、重定向等。
示例如下:
3)copy模組
copy模組用於複製指定主機檔案到遠端主機的指定位置。常見的引數如下:
dest:指出複製檔案的目標目錄位置,使用絕對路徑。如果源是目錄,則目標也要是目錄,如果目標檔案已存在,會覆蓋原有內容;
src:指出原始檔的路徑,可以使用相對路徑和絕對路徑,支援直接指定目錄。如果源是目錄,則目標也要是目錄;
mode:指出複製時,目標檔案的許可權,可選;
owner:指出複製時,目標檔案的屬主,可選;
group:指出複製時目標檔案的屬組,可選;
content:指出複製到目標主機上的內容,不能和src一起使用,相當於複製content指明的資料到目標檔案中;
示例如下:
4)hostname模組
hostname模組用於管理遠端主機上的主機名。常用的引數如下:
name:
指明主機名;
示例如下:
5)yum模組
yum模組基於yum機制,對遠端主機管理程式包。常用的引數如下:
name:程式包名稱,可以帶上版本號。若不指明版本,則預設為最新版本;
state=present|atest|absent:指明對程式包執行的操作:present表明安裝程式包,latest表示安裝最新版本的程式包,absent表示解除安裝程式包;
disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID;
enablerepo:在用yum安裝時,臨時啟用某個倉庫的ID;
conf_file:yum執行時的配置檔案,而不是使用預設的配置檔案;
disable_gpg_check=yes|no:是否啟用完整性校驗功能;
示例如下:
管理端只是傳送yum指令到被管理端,被管理端要存在可用的yum倉庫才可以成功安裝。
6)service模組
service模組為用來管理遠端主機上的服務的模組。常見的引數如下:
name:被管理的服務名稱;
state=started|stopped|restarted:動作包含啟動,關閉或重啟;
enable=yes|no:表示是否設定該服務開機自啟動;
runlevel:如果設定了enabled開機自啟動,則要定義在哪些執行目標下自動啟動;
示例如下:
7)user模組
user模組主要用於管理遠端主機上的使用者賬號。常見的引數如下:
name:必選引數,賬號名稱;
state=present|absent:建立賬號或者刪除賬號,present表示建立,absent表示刪除;
system=yes|no:是否為系統賬戶;
uid:使用者UID;
group:使用者的基本組
groups:使用者的附加組;
shell:預設使用的shell;
home:使用者的家目錄;
mve_home=yes|no:
如果設定的家目錄已經存在,是否將已存在的家目錄進行移動;
pssword:使用者的密碼,建議使用加密後的字串;
comment:
使用者的註釋資訊;
remore=yes|no:
當state=absent時,是否要刪除使用者的家目錄;
建立使用者示例如下:
四、playbook配置檔案
1、執行配置檔案
playbook配置檔案使用YAML語法,具有簡潔明瞭、結構清晰等特點。playbook配置檔案類似於shell指令碼,是一個YAML格式的檔案,用於儲存針對特定需求的任務列表。上面介紹的ansible命令雖然可以完成各種任務,但是當配置一些複雜任務時,逐條輸入就顯得效率非常低下。
更有效的方案是在playbook配置檔案中放置所有的任務程式碼,利用ansible-playbook命令執行該檔案,可以實現自動化運維。YAML檔案的副檔名通常為。yaml或。yml。
YAML語法與其他高階語言類似,其結構透過縮排來展示,透過“-”來代表項;“:”用來分隔鍵和值;整個檔案以“—-”開頭並以“…”結尾,如下所示:
所有的“-”和“:”後面均有空格,而且注意縮排和對齊,如下圖所示:
playbook的核心元素包含:
hosts:任務的目標主機,多個主機用冒號分隔,一般呼叫/etc/ansible/hosts中的分組資訊;
remote_user:遠端主機上,執行此任務的預設身份為root;
tasks:任務,即定義的具體任務,由模組定義的操作列表;
handlers:觸發器,類似tasks,只是在特定的條件下才會觸發的任務。
某任務的狀態在執行後為changed時,可透過“notify”通知給相應的handlers進行觸發執行;
roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合;
playbook檔案定義的任務需要透過ansible-playbook命令進行呼叫並執行。ansible-playbook命令用法如下:
其中,[option]部分的功能包括:
—syntax-check:檢測yaml檔案的語法;
-C(—check):預測試,不會改變目標主機的任何設定;
—list-hosts:列出yaml檔案影響的主機列表;
—list-tasks:列出yaml檔案的任務列表;
—list-tags:列出yaml檔案中的標籤;
-t TAGS(—tags=TAGS):表示只執行指定標籤的任務;
—skip-tags=SKIP_TAGS:表示除了指定標籤的任務,執行其他任務;
—start-at-task=START_AT:從指定的任務開始往下執行;
執行playbook的示例如下:
通常情況下先執行 ansible-playbook -C /PATH/TO/PLAYBOOK。yaml 命令進行測試,測試沒問題後再執行 ansible-playbook /PATH/TO/PLAYBOOK。yml 命令。
2、觸發器
需要觸發才能執行的任務,當之前定義在tasks中的任務執行成功後,若希望在此基礎上觸發其他任務,這時就需要定義handlers。例如,當透過ansible的模組對目標主機的配置檔案進行修改之後,如果任務執行成功,可以觸發一個觸發器,在觸發器中定義目標主機的服務重啟操作,以使配置檔案生效。handlers觸發器具有以下特點:
handlers是Ansible提供的條件機制之一。
handlers和task很類似,但是它只在被task通知的時候才會觸發執行。
handlers只會在所有任務執行完成後執行。
而且即使被通知了很多次,它也只會執行一次。
handlers按照定義的順序依次執行。
handlers觸發器的使用示例如下:
3、角色
將多種不同的tasks的檔案集中儲存在某個目錄下,則該目錄就是角色。角色一般存放在 /etc/ansible/roles/ 目錄,可透過ansible的配置檔案來調整預設的角色目錄,/etc/ansible/roles/ 目錄下有很多子目錄,其中每一個子目錄對應一個角色,每個角色也有自己的目錄結構,如下圖所示:
/etc/ansible/roles/為角色集合,該目錄下有自定義的各個子目錄:
mariadb:mysql角色;
Apache:httpd角色;
Nginx:Nginx角色;
每個角色的定義,以特定的層級目錄結構進行組織。以mariadb(mysql角色)為例:
files:存放由copy或script等模組呼叫的檔案;
templates:存放template模組查詢所需要的模板檔案的目錄,如mysql配置檔案模板;
tasks:任務存放的目錄;
handlers:存放相關觸發執行的目錄;
vars:變數存放的目錄;
meta:用於存放此角色元資料;
default:預設變數存放的目錄,檔案中定義了此角色使用的預設變數;
上述目錄中,tasks、handlers、vars、meta、default至少應該包含一個main。yml檔案,該目錄下也可以有其他。yml檔案,但是需要在main。yml檔案中用include指令將其他。yml檔案包含進來。
有了角色後,可以直接在yaml檔案(playbook配置檔案)中呼叫角色,示例如下:
可以只調用一個角色,也可以呼叫多個角色,當定義了角色後,用ansible-playbook PALYBOOK檔案執行即可。
此時ansible會到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,然後依次執行mysql和httpd目錄下的所有程式碼。
下面來個安裝及配置mariadb資料庫的例項
需求分析:
要求被管理主機上自動安裝mariadb,安裝完成後上傳提前準備好的配置檔案至遠端主機,重啟服務,然後新建testdb資料庫,並允許test使用者對其擁有所有許可權。
被管理主機配置yum倉庫,自行配置,若被管理端可以連線網際網路,那麼直接將yum倉庫指向網際網路即可。
END