1. 程式人生 > 實用技巧 >運維工具Ansible淺談playbook講解以及YAML語法和JSON語法的互化

運維工具Ansible淺談playbook講解以及YAML語法和JSON語法的互化

引言:運維發展到今天已經遠遠不是傳統的運維做一些重複性的枯燥工作,面對海量爆發的訪問量,傳統的運維已經很吃力,比如讓你裝三五臺機器的系統,這個so easy,那要是安裝幾百上千臺呢,還easy嗎。我要安裝nginx服務,並提供好相應的埠轉發機制以及location資源訪問機制,但是有多發十幾臺這樣的機制,並且每臺機器轉發機制都不相同,這個對我們來說是一個不小的挑戰,因此運維進入了自動化時代,自動化運維就顯得重要了。因此本文就是圍繞自動化運維工具Ansible來展開的。

一,為什麼要使用Ansible

自動化運維工具發展到如今已經很多了,為什麼要使用Ansible呢,首先Ansible比起其他的自動化運維工具(puppet,saltstack,chef)來說他基於SSH協議,使用python的Jinja2模板,並且使用SSH multiplexing來優化效能,並且相比較puppet和saltstack來說它是輕量級的,遠端主機無須安裝任何依賴,不像puppet和saltstack那樣需要master和agent,並且ansible的配置管理指令碼playbook基於YAML語言,通俗易懂。其次內建大量的模組。

二,Ansible框架和安裝

我們來看看Ansible的框架:

wKiom1gogcTw-jjNAAIztcsfAdM107.png

Ansible是基於大量的模組來工作的,這些模組是Ansible工作的核心

Host Inventory:定義了我們要監控的主機,我們所要操作的主機就在這個裡面

Playbooks:就是我們的劇本,劇本可以執行多個任務

Connection Plugins:連線外掛,負責和被管理節點之間的通訊

Linux下安裝:

(1)使用pip安裝

因為ansible使用python開發,因此使用pip安裝沒問題的

pip install ansible

(2)GitHub安裝

git clone https://github.com/ansible/ansible.git

--recursive

cd ./ansible

source ./hacking/env-setup

(3)yum安裝

使用epel源

yum install ansible

建議使用yum安裝,因為自動解決依賴關係,並且安裝方便,使用前先安裝好epel源的包,yum安裝好了以後,我們來看看他的配置檔案

wKioL1goif7BW1N-AAAN238Cd2Q456.png

/etc/ansible這是他的配置檔案的目錄,ansible-cfg這個檔案是我們的主配置檔案,hosts檔案就是我們需要定義的主機,也就是我們管理哪些主機

三,Ansible用法詳解

Ansible內建了大量的模組,我們正是使用這些模組來管理成千的機器,示例使用的是CentOS6.8的騰訊雲主機,由於ansible是基於SSH協議的,那我們就先來做一次互信吧,負責是不通的

(1)SSH互信wKiom1gojDnhylOHAABI9A4ssLU058.png

完了後會生成下列兩個檔案

wKioL1gojMKixD-vAAAJE1sbCvQ674.png一個是公鑰一個是私鑰

然後我們使用這個命令:

cat id_rsa.pub > authorized_keys ,我們每次使用SSH連線時,互信的公鑰都會在這個公鑰裡面,因為我是要連線本機自身,所以用的是自己的公鑰,這樣我們就可以ssh [email protected]或者ssh [email protected]這樣免密碼登入了。

(2)Ansible使用

Ansible安裝後會產生下列命令 wKiom1gojuSBb2tmAAAMZBhG8kQ494.png 使用的時候,我們現在hosts檔案中定義下我們的管理的主機

wKioL1goj0nDNjFSAAAEqM9RL8w046.png

名字就叫做webservers,這個組裡面有127.0.0.1這個IP,當然我們也可以定義多個

我們使用這個命令來檢視我們的這臺機器IP是否通,使用

wKiom1gokpvggzmMAAAQ5WCHumg889.png

這個說明我們的機器是IP是通的,顯示為"pong",其中-m引數表示我們的模組,使用ping模組,想要看看我們有哪些模組可以使用下面命令:

ansible-doc -l wKioL1gokzywCwLNAACIpqxbsgc376.png

每一個模組是如何使用的我們使用: ansible-doc -s MODULE,例如

我們檢視yum模組:

wKioL1golEHSYM_hAADPoNYymtA018.pngansible預設的模組是command模組,後面可以跟我們的命令,因為是預設的所以可以省略,比如

wKioL1golQOh6_6jAAAT1Jxnvus299.png

-a表示 模組特有的引數

想要看伺服器的一些資訊。我們可以使用:

wKiom1goleHw3A8wAABTqgDHjdM501.png

想要看某個引數可以使用 ansible webservers -m setup -a 'filter=xxxx',比如bios時間 ansible webservers -m setup -a filter='ansible_bios_date'

三,playbook講解和YAML語法講解

playbook也就是我們的劇本,劇本中一折接著一折演出,ansible的playbook就是這麼個意思,一個接著一個的執行,比如我要安裝nginx,並且啟動這個使用ansible就很簡單了,使用ansible webservers -m yum -a "name=nginx state=present"這樣子就成功了,但是我要讓nginx安裝啟動後,並且使用一個我們自定義的配置檔案,並且我們自定義一個h5頁面訪問,這樣的話,一條簡單的命令就無法達到了,我們看就必須得使用playbook了。

playbook和play,host,task和模組(module)之間的關係如下所示

playbook--------play-------host

|

|

task-------module

一個playbook由多個play構成,多個play在哪一個host上操作,每個play有同的task,每個task是由很多模組組成的

playbook的語法是使用YAML(Yet Another Markup Language)來配置的,yaml自身通俗易懂我們理解起來很簡單。下面就例項安裝nginx,並且使用我們自定義的配置檔案,自定義的H5頁面。一般playbook我們都是以yam結尾命名,我們編輯一個web-nginx.yml的檔案,寫入

- name: Configuration webserver with nginx

hosts: webservers

tasks:

- name: install nginx

yum: name=nginx state=present


- name: copy nginx config file

copy: src=/root/files/nginx.conf dest=/etc/nginx/


- name: enable configuration

file: >

dest=/etc/nginx/default.d/nginx.conf.bak

src=/etc/nginx/nginx.conf

state=link

- name: copy index.html

template: src=/root/template/index.html.j2 dest=/usr/share/nginx/html/index.html

mode=0644


- name: restart nginx

service: name=nginx state=restarted

name:表示每一齣劇本的名字

hosts:表示的是我們管理的主機組

tasks:就是我們的任務

yum,copy,file,template,service表示我們的模組名字,後面跟的表示他的一些用法,具體怎麼用就按照上面ansible-doc -s MUDULE來檢視

注意事項:這是個人使用過程中遇到的大坑,因此總結出來的。切記

(1)所有的-和name之間都必須要有一個空格,否則是錯誤無法執行的

(2)所有的:後面都必須要空一格否則是錯誤的

(3)task的開頭字母必須要比下面的-超出,否則仍然是錯誤的

(4)task裡面定義的- name中,每個- name必須縮排相同的空格,否則是錯誤的(有例外,等會說)

(5)- name的下一行首字母必須要和name的n字母對齊

(6)稍後講解,這是我遇到最大的一個坑

執行playbook我們使用這個命令: ansible-playbookweb-nginx.yml

如果格式不正確就會出現下面的錯誤wKiom1goo1DTGo3yAAAvxfwT6fg227.png 這一點是特別坑的,沒什麼特別重要的語法,但是這個格式就不得不吐槽了!!!

如果我們的playbook執行無誤的話會返回每個狀態資訊,如下如所示

wKiom1gorMmy6dasAABP0AULTzA041.png我們會看到他一折一折的演,也就是一個接一個的執行

playbook中還有事件通知機制,比如,我們安裝好了nginx,將他的配置檔案改變為我們想要的了,但我們可能隨時修改這個配置檔案模板,所以我們還要重啟,要有個通知機制來告訴我,然後觸發某種條件,執行,我們配置支援tls加密的nginx服務,也就是我們的https,編輯nginx-tls.yml如下圖所示: wKioL1gorkSxUjBEAAB5xwxlt2A545.png 我們先來說說上面的注意事項(6)也就是那個我遇到的最大的坑

vars和tasks必須要對齊,如果tasks超出了vars的v字母對應的位置那麼就會報錯,很容易發現,但如果tasks比vars縮排的更多,那麼最大的問題出現了他執行完全沒問題,不會有任何錯誤出現,但是tasks裡面定義的所有的name他一個都不會執行,狀態碼都顯示的是0.

這麼個×××格式,我當初排了很久的錯誤才找到的,切記,切記,切記,重要的事情說三遍。他會顯示這樣資訊,如圖所示。 wKioL1gosLOiE9MPAAAng3w7bWg033.png 我們的task一個都沒有執行,沒有任何錯誤

上面注意事項(4)說的例外就是,我們handlers裡面的- name可以不用和tasks裡面的- name對齊

現在我們來說說上面多出來代表的意思了:

handlers:他和tasks很相像,但是他只有task通知的時候才會執行,如果task改變了系統的狀態,那麼就需要觸發通知機制

notify:就是我們的通知機制

vars:就類似於我們在shell中定義了一個變數,後面頻繁的引用這個變數,這個是同理的,我們定義了很多變數來儲存,後面只需要引用變數即可。

關於handlers只會在所有的任務執行完成後執行,而且即使被多次通知,他也只會執行一次,他是按照play中定義的順序執行不是通知順序。

至於怎麼建立nginx.key和nginx.crt這裡就不再贅述,怎麼使用可以看看openssl這個強大的命令

一個playbook必須包含下面兩項:

(1) host:需要配置的一組主機

(2) task:需要在這些主機上所做的任務

將上述的playbook執行成功後,我們訪問下看看 wKiom1gouxjyQCG8AAAt7OHJya8940.png 因為我們的TLS證書不是網際網路中流通的證書,因此前面那樣顯示。

四,YAML語法和JSON語法互化

相比較JSON格式的資料,我想大家看到YAML格式的資料更加易懂吧,因為JSON首先就是一種機器互動格式的,YAML是便於人類讀寫識別,下面我們就來介紹下之間的轉化

很多看了playbook的肯定都是一頭霧水,為什麼是那樣子寫,為什麼name前面有個"-"之類的。

檔案的起始

YAML檔案已三個減號開頭表示標記文章的開始:

---

但是我們的playbook中並沒出現,這是因為我們缺少,並不影響我們的執行

字串

YAML格式的字串: Ihave a pen i have an apple

等價的JSON格式:"Ihave a pen i have an apple"

布林型

YAML的布林型:True

等價的JSON格式:true


列表

YAML中的列表就像是python中的列表一樣,不過他是使用"-"作為分隔符的,就像下面這樣

- My Fair Lady

- Houston

- Doctor Strange

等價的JSON格式:

[

"My Fair Lady",

"Houston",

"Doctor Strange"

]

字典

YAML中的字典就像是python中的字典了,就是個對映對應關係,

YAML格式的字典:

address:742 Evergreeen Terrace

city:Las Vegas

state:United states

等價的JSON格式為:

{

"address":"742 Evergreeen Terrace"

"city":"Las Vegas"

"state": "United states"

}

轉載於:https://blog.51cto.com/berniem2m/1872502