Ansible-企業級自動化運維工具應用實戰
自動化運維的精髓所在
所謂的運維自動化實際上就是某些運維過程的自動化,比如初始化自動化、測試/部署自動化,監控自動化,簡單報警處理自動化,業務降級/恢復自動化...,慢慢的讓系統可以承擔更多的重複勞動,減少人力投入和學習成本。
企業級自動化運維工具應用實戰-ansible
使用場景:
公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同學儘快實現,當你接到這個任務時,有沒有更快的解決方式?
(要在短時間內快速的擴充業務容量的最快方法就是橫向擴充套件
目前多數公司遇到的運維問題現狀:
1、硬體選型多樣化
2、系統多版本並存
3、目錄結構混亂
4、運維人員水平參差不齊
5、歷史遺留問題多
6、同一軟體出現多個版本
7、無法批量化操作
8、工作效率低,故障率高
9、專案上線操作繁瑣
日常運維工作中的重要事件:
1、新增監控,收集系統指標
2、對日誌進行歸檔以及管理
3、資料備份於恢復
4、對計劃任務進行管理
5、對軟體包進行部署和管理
6、對指令碼進行批量執行
7、對檔案進行批量複製和移動
8、設定檔案或者目錄對應的許可權
9、關閉和啟動服務
10、對程式碼程式進行上下線
ansible是什麼
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。
ansible是基於 paramiko 開發的,並且基於模組化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所執行的模組,ansible只是提供一種框架。ansible不需要在遠端主機上安裝client/agents,因為它們是基於ssh來和遠端主機通訊的。ansible目前已經已經被紅帽官方收購,是
自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
ansible特點
1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、預設使用SSH協議對裝置進行管理;
3、有大量常規運維操作模組,可實現日常絕大部分操作。
4、配置簡單、功能強大、擴充套件性強;
5、支援API及自定義模組,可通過Python輕鬆擴充套件;
6、通過Playbooks來定製強大的配置、狀態管理;
7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理介面和REST API介面 ——AWX平臺。(目前這個應該是付費專案)
ansible架構圖
Ansible:Ansible核心程式。
HostInventory:記錄由Ansible管理的主機資訊,包括埠、密碼、ip等。
(一般埠都是預設埠不用指定也行,基於ssh私鑰登入的話密碼也不用了,就指定個ip地址或者主機名就成,主機名要能被解析)
Playbooks:“劇本”YAML格式檔案,多個任務定義在一個檔案中,定義主機需要呼叫哪些模組來完成的功能。
(類似於shell指令碼,多條ansible命令的集合,十分注意格式。)
CoreModules:核心模組,主要操作是通過呼叫核心模組來完成管理任務。
(現在已經內嵌了多個模組,已經可以滿足我們日常運維的工作了,有特別需要了再自己定義模組)
CustomModules:自定義模組,完成核心模組無法完成的功能,支援多種語言。
ConnectionPlugins:連線外掛,Ansible和Host通訊使用
ansible任務執行模式
Ansible系統由控制主機對被管節點的操作方式可分為兩類,即ad- hoc和playbook:
·ad-hoc模式使用單個模組,支援批量執行單條命令。 ad****-hoc 命令是一種可以快速輸入的命令,而且不需要儲存起來的命令。就相當於bash中的一句話shell。
·playbook模式是Ansible主要管理方式,playbook通過多個task集合完成一類功能,如Web服務的安裝部署、資料庫伺服器的批量備份等。可以簡單地把playbook理解為通過組合多條ad-hoc操作作的配置檔案。
Ansible命令執行過程
1、載入自己的配置檔案 預設/etc/ansible/ansible.cfg
2、查詢對應的主機配置檔案,找到要執行的主機或者組
3、載入自己對應的模組檔案,如command
4、通過ansible將模組或命令生成對應的臨時py檔案,並將該檔案傳輸至遠端伺服器的對應的目錄下
5、對應執行使用者的家目錄下的.ansible/tmp/XXX/XXX.PY檔案
6、給檔案+x執行
7、執行並返回結果
8、刪除臨時py檔案,sleep 0退出
ansible安裝方式
ansible安裝常用兩種方式,yum安裝和pip程式安裝
這裡提供二種安裝方式,任選一種即可
1使用yum安裝
yum install epel-release -y
yum install ansible –y
2 使用pip(python的包管理模組)安裝
(與perl的cpanm模式安裝類似)
pip install ansible
如果沒pip,需先安裝pip.yum可直接安裝:
yum install python-pip
pip3 install ansible
ansible程式結構
安裝目錄
配置檔案目錄:/etc/ansible/
執行檔案目錄:/usr/bin/
Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help文件目錄:/usr/share/doc/ansible-X.X.X/
Man文件目錄:/usr/share/man/man1/
Ansible配置檔案
設定ansible.cfg配置引數,ansible有許多引數,下面列出常用的引數:
inventory: #這個引數表示資源清單inventory檔案的位置,資源清單就是
一些Ansible需要連線管理的主 機列表。這個引數的配置例項如下:
inventory = /etc/ansible/hosts 放可管理連結主機的地方
library:這個library引數就是指向存放Ansible模組的目錄。配置例項如下:
library = /usr/share/ansible 放ansible平時用的模組的地方(自定義模組)
Ansible支援多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄。
forks: 設定預設情況下Ansible最多能有多少個程序同時工作, 從Ansible 1.3開始,
fork數量預設自動設定為主機數量或者潛在的主機數量,預設設定最多5個程序並行處理。
具體需要設定多少個,可以根據控制主機的效能和被管節點的數量來確定,可能是 50或100。預設值5是非常保守的值,
配置例項如下:
forks = 5 ansible能一下管理連結多少臺機器,預設5臺偏保守
sudo_user:
這是設定預設執行命令的使用者,也可以在playbook中重新設定這個引數。配置例項如下:
sudo_user = root
remote_port:
這是指定連線被管節點的管理埠,預設是22。除非設定了特殊的SSH埠,不然這個引數一般是 不需要修改的。
配置例項如下:
remote_port = 22
host_key_checking:
這是設定是否檢查SSH主機的金鑰。可以設定為True或False,關閉後第一次連線沒有提示配置例項
host_key_checking = False
timeout:
這是設定SSH連線的超時間隔,單位是秒。配置例項如下:
timeout = 60
log_path:Ansible系統預設是不記錄日誌的,如果想把Ansible系統的輸出記錄到日誌檔案中,需要設定log_path
來指定一個儲存Ansible日誌的檔案。配置例項如下:
log_path = /var/log/ansible.log 建議開啟日誌
另外需要注意,執行Ansible的使用者需要有寫入日誌的許可權,模組將會呼叫被管節點的syslog來記錄
Ansible主機清單
可以直接定義一個主機資訊,也可以把多個主機放到一個機器組中,起個組名。格式如下(主機匹配還支援統配符來匹配)
1、直接指明主機地址或主機名:
## green.example.com#
# blue.example.com#
# 192.168.100.1
# 192.168.100.10
2、定義一個主機組[組名]把地址或主機名加進去
[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153
#組成員可以使用萬用字元來匹配,如下 192.168.2.[1:6]
#表示匹配從192.168.2.1——192.168.2.6的主機
Ansible常用命令
/usr/bin/ansible # Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命令的執行
/usr/bin/ansible-doc # Ansible 模組功能檢視工具
/usr/bin/ansible-galaxy # 下載/上傳優秀程式碼或Roles模組 的官網平臺,基於網路的
/usr/bin/ansible-playbook # Ansible 定製自動化的任務集編排工具
/usr/bin/ansible-pull # Ansible遠端執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)
/usr/bin/ansible-vault # Ansible 檔案加密工具
/usr/bin/ansible-console # Ansible基於Linux Consoble介面可與使用者互動的命令執行工具
Ansible配置公私鑰
配置ansible使用公鑰驗證
雖然ansible支援其他主機認證方式,但是我們最常用的的還是基於祕
鑰的認證:
1、首先生成祕鑰
ssh-keygen -t rsa -P ‘’
2、然後向主機分發祕鑰:
ssh-copy-id [email protected] #@後面跟主機名或者IP地址
3、如果出現以下情況:
# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72
-bash: ssh-copy-id: command not found
請嘗試:
yum -y install openssh-clientsansible
ansible常用模組:
ping模組:用於測試主機能否連通
commond模組:用於在主機上執行單條命令
shell模組:可在管理主機上執行一些複雜命令
copy模組:大多用於推送配置檔案
yum模組:批量化安裝服務包
setup模組:獲取管理的主機的配置資訊
fetch模組:從管理主機上拉取檔案
user模組:批量建立使用者
group模組:批量建立組
file模組:建立軟連結目錄什麼的
script模組:在管理機上執行指令碼,在被管理機上執行
service服務模組:服務的啟動和過載等等
cron計劃任務模組:新增計劃任務
Ansible playbook簡介
playbook是ansible用於配置,部署,和管理被控節點的劇本。
通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。
Ansible playbook使用場景
執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於複雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。
就像執行shell命令與寫shell指令碼一樣,也可以理解為批處理任務,不過playbook有自己的語法格式。
使用playbook你可以方便的重用這些程式碼,可以移植到不同的機器上面,像函式一樣,最大化的利用程式碼。。
Ansible playbook格式
對我們後面書寫playbook很有幫助。以下為playbook常用到的YMAL格式。
檔案的第一行應該以 ”-” (三個連字元)開始,表明YMAL檔案的開始。
在同一行中,#之後的內容表示註釋,類似於shell,python和ruby。
YMAL中的列表元素以”-”開頭然後緊跟著一個空格,後面為元素內容。就像這樣
在mysql.yml中,主要由三個部分組成。
hosts部分:使用hosts指示使用哪個主機或主機組來執行下面的tasks,每個playbook都必須指定hosts,
remote_user:指定遠端主機中的哪個使用者來登入遠端系統,在遠端系統執行task的使用者,可以任意指定,也可以使用sudo,但是使用者必須要有執行相應task的許可權。
tasks:指定遠端主機將要執行的一系列動作。tasks的核心為ansible的模組,前面已經提到模組的用法。tasks包含name和要執行的模組,name是可選的,只是為了便於使用者閱讀,不過還是建議加上去,模組是必
須的,同時也要給予模組相應的引數。
Playbook的核心元素
Hosts:主機
Tasks:任務列表
Variables 設定方式有4種
Templates:包含了模板語法的文字檔案;
Handlers:由特定條件觸發的任務;
Playbooks配置檔案的基礎元件:
Hosts:執行指定任務的目標主機;
remoute_user: 在遠端主機上執行任務的使用者;
sudo_user:
tasks:任務列表
模組,模組引數;
Host Inventory:主機清單,也就是被管理的主機列表
Playbooks:ansible的劇本,可想象為將多個任務放置在一起,一塊執行
Core Modules:ansible的核心模組
Custom Modules:自定義模組
Connection Plugins:連線外掛,用於與被管控主機之間基於SSH建立連線關係
Plugins:其他外掛,包括記錄日誌等
2、ansible的特性
<1>模組化:呼叫特定的模組,完成特定任務
<2>基於python語言實現,由Paramiko(完成基於ssh的連線),PyYAML(對YAML檔案的支援),jinja2(python的模板庫)三個關鍵的模組
<3>部署簡單:是沒有客戶端的
<4>支援自定義模組,使用任意程式語言
<5>支援強大的playbook
<6>具有冪等性:一個操作在一個主機上執行一遍和執行N遍的結果是一樣的
第二章 ansible的基礎應用
1、ansible管理端的安裝
在EPEL源中,有包含ansible的軟體包安裝只需要配置好EPEL的yum源,yum安裝即可
安裝生成的檔案
2、ansible被管控主機的定義
對希望被管控的主機的定義需要實現在ansible管理端的針對被管理主機的配置檔案(/etc/ansible/hosts)中進行定義
3、配置管理節點可以基於ssh祕鑰登入被管理節點
4、ansible命令的用法介紹
ansible HOST-PATTERN [-f FORKS] [-m MOD_NAME] [-a MOD_ARGS]
HOST_PATTERN:指明對哪些被管控主機進行操作
-f FORKS:表示一批處理幾臺主機,也就是當被管控主機很多時,ansible不是對所有主機同時發起管理操作,而是一批處理幾臺,然後再換一批,直到所有主機被處理完成,如果不指定,則預設是5臺
-m MOD_NAME:指明呼叫哪個模組執行操作,各個模組所能實現的功能不同,如果不指定,預設是用-m command模組
-a MOD_ARGS:指明使用該模組的執行操作時的引數
第三章 ansible常用模組介紹
1、獲取常用模組的列表和對應模組的使用幫助資訊
可用ansible-doc -l 來檢視所有可用的模組列表
可用ansible-doc -s MOD_NAME 來檢視對應模組的幫助資訊
2、command模組
在遠端主機執行命令,不支援管道,重定向等shell的特性
常用引數有:
chdir= 表示指明命令在遠端主機上哪個目錄下執行,也就是在命令執行前切換到哪個目錄下
creates= 在命令執行時建立一個檔案,如果檔案已存在,則不會執行建立任務
removes= 在命令執行時移除一個檔案,如果檔案不存在,則不會執行移除任務
executeble= 指明執行命令的shell程式
3、shell模組
在遠端主機執行命令,相當於呼叫遠端主機的shell程序,然後在該shell下開啟一個子shell執行命令
支援shell特性,如管道,重定向等
注意:command和shell模組的核心引數直接為命令本身,而其他模組的核心引數一般是"key=value"格式
常見引數有:
chdir= 表示指明命令在遠端主機上哪個目錄下執行
creates= 在命令執行時建立一個檔案,如果檔案已存在,則不會執行建立任務
removes= 在命令執行時移除一個檔案,如果檔案不存在,則不會執行移除任務
executeble= 指明執行命令的shell程式
4、copy模組
拷貝ansible管理端的檔案到遠端主機的指定位置
常見引數有:
dest= 指明拷貝檔案的目標目錄位置,使用絕對路徑,如果源是目錄,則目標也要是目錄,如果目標檔案已存在,會覆蓋原有內容
src= 指明本地路徑下的某個檔案,可以使用相對路徑和絕對路徑,支援直接指定目錄,如果源是目錄,則目標也要是目錄
mode= 指明覆制時,目標檔案的許可權
owner= 指明覆制時,目標檔案的屬主
group= 指明覆制時,目標檔案的屬組
content= 指明覆制到目標主機上的內容,不能與src一起使用,相當於複製content指明的資料,到目標檔案中
5、cron模組
管理計劃任務的模組
常見引數有:
minute= 指明計劃任務的分鐘,支援格式:0-59,*,*/2等,與正常cron任務定義的一樣的語法,省略時,預設為*,也就是每分鐘都執行
hour= 指明計劃任務的小時,支援的語法:0-23,*,*/2等,省略時,預設為*,也就是每小時都執行
day= 指明計劃任務的天,支援的語法:1-31,*,*/2等,省略時,預設為*,也就是每天都執行
month= 指明計劃任務的月,支援的語法為:1-12,*,*/2等,省略時,預設為*,也就是每月都執行
weekday= 指明計劃任務的星期幾,支援的語法為:0-6,*等,省略時,預設為*,也就是每星期幾都執行
reboot 指明計劃任務執行的時間為每次重啟之後
name= 給該計劃任務取個名稱,必須要給明。每個任務的名稱不能一樣。刪除任務時,只需要給明任務的名稱即可
job= 執行的任務是什麼,當state=present時才有意義
state=present|absent 表示這個任務是建立還是刪除,present表示建立,absent表示刪除,預設是present
6、fetch模組
從遠端主機拉取檔案到本地
一般情況下,只會從一個遠端節點拉取資料
常見引數有:
dest= 從遠端主機上拉取的檔案存放在本地的位置,一般只能是目錄
src= 指明遠端主機上要拉取的檔案,只能是檔案,不能是目錄
7、file模組
用於設定遠端主機上的檔案屬性
常見引數有:
path= 指明對哪個檔案修改其屬性
src= 指明path=指明的檔案是軟連結檔案,其對應的原始檔是誰,必須要在state=link時才有用
state=directory|link|absent 表示建立的檔案是目錄還是軟連結
owner= 指明檔案的屬主
group= 指明檔案的屬組
mode= 指明檔案的許可權
建立軟連結的用法:
src= path= state=link
修改檔案屬性的用法:
path= owner= mode= group=
建立目錄的用法:
path= state=directory
刪除檔案:
path= state=absent
8、hostname模組
管理遠端主機上的主機名
常用引數有
name= 指明主機名
9、yum模組
基於yum機制,對遠端主機管理程式包
常用引數有:
name= 指明程式包的名稱,可以帶上版本號,不指明版本,就是預設最新版本。
state=present|latest|absent 指明對程式包執行的操作,present表示安裝程式包,latest表示安裝最新版本的程式包,absent表示解除安裝程式包
disablerepo= 在用yum安裝時,臨時禁用某個倉庫,倉庫的ID
enablerepo= 在用yum安裝時,臨時啟用某個倉庫,倉庫的ID
conf_file= 指明yum執行時採用哪個配置檔案,而不是使用預設的配置檔案
diable_gpg_check=yes|no 是否啟用gpg-check
10、service模組
用來管理遠端主機上的服務的模組
常見引數有:
name= 被管理的服務名稱
state=started|stopped|restarted 表示啟動或關閉或重啟
enabled=yes|no 表示要不要設定該服務開機自啟動
runlevel= 如果設定了enabled開機自動啟動,則要定義在哪些執行級別下自動啟動
11、uri模組
如果遠端是web伺服器,可以利用ansible直接請求某個網頁
常見引數有:
url= 指明請求的url的路徑,如:http://10.1.32.68/test.jpg
user= 如果請求的url需要認證,則認證的使用者名稱是什麼
password= 如果請求的url需要認證,則認證的密碼是什麼
method= 指明請求的方法,如GET、POST…
body= 指明報文中實體部分的內容,一般是POST方法或PUT方法時用到
HEADER_ 自定義請求報文中的新增的首部
12、user模組
管理遠端主機上的使用者的賬號
常見引數有:
name= 指明要管理的賬號名稱
state=present|absent 指明是建立賬號還是刪除賬號,present表示建立,absent表示刪除
system=yes|no 指明是否為系統賬號
uid= 指明使用者UID
group= 指明使用者的基本組
groups= 指明使用者的附加組
shell= 指明預設的shell
home= 指明使用者的家目錄
move_home=yes|no 當home設定了家目錄,如果要建立的家目錄已存在,是否將已存在的家目錄進行移動
password= 指明使用者的密碼,最好使用加密好的字串
comment= 指明使用者的註釋資訊
remove=yes|no 當state=absent時,也就是刪除使用者時,是否要刪除使用者的而家目錄
13、group模組
用來新增或刪除遠端主機的使用者組
常見引數有:
name= 被管理的組名
state=present|absent 是新增還是刪除,不指名預設為新增
gid= 指明GID
system=yes|no 是否為系統組
14、script模組
將管理端的某個指令碼,移動到遠端主機(不需要指明傳遞到遠端主機的哪個路徑下,系統會自動移動,然後執行),然後執行