運維工具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的框架:
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
cd ./ansible
source ./hacking/env-setup
(3)yum安裝
使用epel源
yum install ansible
建議使用yum安裝,因為自動解決依賴關係,並且安裝方便,使用前先安裝好epel源的包,yum安裝好了以後,我們來看看他的配置檔案
/etc/ansible這是他的配置檔案的目錄,ansible-cfg這個檔案是我們的主配置檔案,hosts檔案就是我們需要定義的主機,也就是我們管理哪些主機
三,Ansible用法詳解
Ansible內建了大量的模組,我們正是使用這些模組來管理成千的機器,示例使用的是CentOS6.8的騰訊雲主機,由於ansible是基於SSH協議的,那我們就先來做一次互信吧,負責是不通的
完了後會生成下列兩個檔案
然後我們使用這個命令:
cat id_rsa.pub > authorized_keys ,我們每次使用SSH連線時,互信的公鑰都會在這個公鑰裡面,因為我是要連線本機自身,所以用的是自己的公鑰,這樣我們就可以ssh [email protected]或者ssh [email protected]這樣免密碼登入了。
(2)Ansible使用
Ansible安裝後會產生下列命令 使用的時候,我們現在hosts檔案中定義下我們的管理的主機
名字就叫做webservers,這個組裡面有127.0.0.1這個IP,當然我們也可以定義多個
我們使用這個命令來檢視我們的這臺機器IP是否通,使用
這個說明我們的機器是IP是通的,顯示為"pong",其中-m引數表示我們的模組,使用ping模組,想要看看我們有哪些模組可以使用下面命令:
每一個模組是如何使用的我們使用: ansible-doc -s MODULE,例如
我們檢視yum模組:
ansible預設的模組是command模組,後面可以跟我們的命令,因為是預設的所以可以省略,比如
-a表示 模組特有的引數
想要看伺服器的一些資訊。我們可以使用:
想要看某個引數可以使用 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
如果格式不正確就會出現下面的錯誤 這一點是特別坑的,沒什麼特別重要的語法,但是這個格式就不得不吐槽了!!!
如果我們的playbook執行無誤的話會返回每個狀態資訊,如下如所示
playbook中還有事件通知機制,比如,我們安裝好了nginx,將他的配置檔案改變為我們想要的了,但我們可能隨時修改這個配置檔案模板,所以我們還要重啟,要有個通知機制來告訴我,然後觸發某種條件,執行,我們配置支援tls加密的nginx服務,也就是我們的https,編輯nginx-tls.yml如下圖所示: 我們先來說說上面的注意事項(6)也就是那個我遇到的最大的坑
vars和tasks必須要對齊,如果tasks超出了vars的v字母對應的位置那麼就會報錯,很容易發現,但是如果tasks比vars縮排的更多,那麼最大的問題出現了他執行完全沒問題,不會有任何錯誤出現,但是tasks裡面定義的所有的name他一個都不會執行,狀態碼都顯示的是0.
這麼個×××格式,我當初排了很久的錯誤才找到的,切記,切記,切記,重要的事情說三遍。他會顯示這樣資訊,如圖所示。 我們的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執行成功後,我們訪問下看看 因為我們的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