ansible基礎-模組

米康莉發表於2020-10-17

ansible 簡介

ansible首次釋出於2012年,作者michael DeHaan,michael DeHaan也是cobbler的作者,於2015年被redhat收購
ansible是一款自動化運維工具,給予python開發
批量系統配置
批量程式部署
批量執行命令等動能
ansible產品特色:
基於ssh架構        模組豐富
社群活躍           支援自定義模組
支援異構IT架構     部署簡單,容易上手

部署Ansible

ansible原理:
控制端主機自帶很多模組(模組就是指令碼);
ansible通過ssh遠端被管理主機,將控制端的模組(指令碼)或命令傳輸到被管理主機;
在被管理端主機執行模組(指令碼)或命令,執行不同的模組或命令可以實現不同的功能;
最後ansible退出ssh遠端。
絕大多數模組(指令碼)都需要引數才能執行成功!!!類似於shell指令碼的位置變數!

問題:要求先快速搭建好一個Ansible平臺,並測試環境,要求如下:
   建立實驗主機(控制端和被控制端)
   配置SSH實驗環境
   安裝Ansible自動化軟體
   修改Ansible配置

方案:
實驗環境,作業系統為RHEL8,配置主機名稱、IP地址、YUM源。

在這裡插入圖片描述

步驟一:準備基礎環境
(1)域名解析(為了方便後期操作,可以不做)
(2)配置SSH金鑰(ansible是基於ssh實現遠端控制)
(3)安裝Ansible軟體(僅在control主機操作)
# tar -xf   ansible_soft.tar.gz
# cd ansible_soft
# dnf  -y  install   *
注意:
被控制節點要求:
Ansible預設通過SSH協議管理機器
被管理主機要開啟SSH服務,並允許控制主機登入
被管理主機需要安裝有Python

步驟二:修改配置檔案
主配置檔案說明:
主配置檔案ansible.cfg(主配置檔案的內容可以參考/etc/ansible/ansible.cfg)
ansible配置檔案查詢順序
首先檢測ANSIBLE_CONFIG變數定義的配置檔案(預設沒有這個變數)
其次檢查當前目錄下的./ansible.cfg檔案
再次檢查當前使用者家目錄下~/ansible.cfg檔案
最後檢查/etc/ansible/ansible.cfg檔案
(1)修改主配置檔案。
# mkdir  ~/ansible
# vim  ~/ansible/ansible.cfg
[defaults]
inventory = ~/ansible/inventory            
#主機清單配置檔案(inventory可以是任意檔名),英語詞彙:inventory(清單、財產清單)
#forks = 5          #ssh併發數量
#ask_pass = True        #使用金鑰還是密碼遠端,True代表使用密碼
#host_key_checking = False      #是否校驗金鑰(第一次ssh時是否提示yes/no)
(2)修改主機清單檔案(清單檔名必須與主配置檔案inventory定義的一致)
# vim  ~/ansible/inventory
[test]        #定義主機組(組名稱任意)
node1         #定義組中的具體主機,組中包括一臺主機node1
[proxy]         #定義主機組(組名稱任意),英語詞彙:proxy(代理人,委託人)
node2          #proxy組中包括一臺主機node2
[webserver]
node[3:4]        #這裡的node[3:4]等同於node3和node4
[database]
node5
[cluster:children]      #巢狀組(children為關鍵字),不需要也可以不建立巢狀組
webserver            #巢狀組可以在組中包含其他組
database

Ansible ad-hoc具體應用

測試主機列表中的主機是否可以ping通
檢視被管理主機的伺服器資訊(如時間、版本、記憶體等)
學習ansible-doc命令的用法
測試command與shell模組的區別
使用script模組在遠端主機執行指令碼(裝軟體包、啟服務)

通過ansible-doc獲取幫助
# ansible-doc  -l      #列出所有模組
# ansible-doc -l | grep yum      #在所有模組中過濾關鍵詞
# ansible-doc yum        #檢視模組幫助

1.測試環境
(1)檢視主機列表
# cd  ~/ansible          #非常重要
# ansible  all  --list-hosts           #檢視所有主機列表
(2)測試遠端主機是否能ping通。
# ansible  node1  -m  ping              #呼叫ping模組
# ansible  node1,webserver  -m  ping
(3)模組就是指令碼(多數為Python指令碼),多數指令碼都支援引數,預設模組為command。
# ansible  node1  -m  command  -a   "uptime"     #檢視CPU負載
# ansible  node1  -m command -a  "uname -r"      #檢視核心版本
# ansible  node1   -a   "ip a s"                  #檢視網路卡資訊
# ansible  all   -a   "date"                      #檢視時間
(4)Shell模組。
command和shell模組的區別,command不支援bash的特性(bash有哪些特性可以參考Shell課程第一天的PPT),如管道和重定向等功能,但是shell模組可以支援。
不可以使用shell模組執行互動命令,如vim、top等。
# ansible test -m command -a "ps | wc -l"      #報錯
# ansible test -m command -a  "ls &"        #報錯
# ansible test -m shell -a  "ps aux | wc -l"       #程式數量
# ansible test -m shell -a  "who"                   #登陸資訊
ansible test -m shell -a  "touch /tmp/txt.txt"  
#使用shell模組建立檔案會有Warning警告提示,正常!!!
(5)script模組
script模組會把-a後面的指令碼拷貝到被管理端主機,然後執行這個指令碼。
# vim  ~/ansible/test.sh  
#!/bin/bash
dnf -y install httpd
systemctl start httpd
# ansible  test  -m script  -a  "./test.sh" 
#test是主機組的名稱,-m呼叫script模組,-a後面的./test.sh是上面建立指令碼的相對路徑和檔名
#./是當前目錄的意思,在當前目錄下有個指令碼叫test.sh
(6)file模組
file模組可以建立檔案、目錄、連結;修改許可權與屬性等(ansible-doc file)
# ansible  test  -m  file  -a  "path=/tmp/file.txt state=touch"         #遠端test組中所有主機,新建檔案,path後面指定要建立的檔案或目錄的名稱
#state=touch是建立檔案,state=directory是建立目錄
## 驗證: 到node1主機,使用ls /tmp/file.txt看看檔案是否被建立成功
(7)copy模組
copy模組可以將檔案拷貝到遠端主機 (ansible-doc copy)。
# echo AAA > ~/a3.txt                   #新建測試檔案
# ansible test -m copy -a "src=~/a3.txt dest=/root/"
#把管理端本機的a3.txt檔案,拷貝到test組中所有主機的/root/目錄
#src代表原始檔,dest代表目標檔案
## 驗證:到node1主機使用ls /root/a3.txt檢視是否有該檔案
(8)fetch模組
fetch模組與copy類似,但是作用相反,可以將其他主機的檔案拷貝到本地(ansible-doc fetch)。
#將遠端test組中所有主機的hostname檔案下載到本地家目錄
#src代表原始檔,dest代表目標檔案
# ls  ~/          #使用ls檢視下是否下載成功
#不能下載目錄,如果需要下載目錄,可以先打包後再下載
(9)lineinfile模組
在修改單個檔案的單行內容時可以使用lineinfile模組(ansible-doc lineinfile)。
# ansible test -m lineinfile  -a "path=/etc/issue line='hello world'
#在/etc/issue檔案中新增一行內容hello world,預設新增到最後,line後面跟的是需要新增的檔案內容
## 驗證:到node1主機執行命令cat /etc/issue檢視檔案內容是否正確

# ansible test -m lineinfile -a "path=/etc/issue line='hello world'"
#基於冪等原則,重複執行,不會建立多行內容

# ansible test -m lineinfile -a "path=/etc/issue line='insert' insertafter='Kernel'"
#將line後面的內容插入到/etc/issue檔案中Kernel行的後面
#英語詞彙:insert(插入),after(在…後面)
## 驗證:到node1主機執行命令cat /etc/issue檢視檔案內容是否正確
(10)replace模組
lineinfile會替換一整行,replace可以替換關鍵詞(ansible-doc replace)。
# ansible test -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean"
#將node1主機中/etc/issue.net檔案全文所有的Kernel替換為Ocean
#regexp後面是需要替換的舊內容;replace後面是需要替換的新內容
## 驗證:到node1主機執行命令cat /etc/issue.net檢視檔案內容是否正確
(11)user模組
user模組可以實現Linux系統賬戶管理(ansible-doc user)
# ansible test -m user -a "name=tuser1"
#遠端test組中的所有主機並建立系統賬戶tuser1,預設state的值為present,代表建立使用者
## 驗證:到node1主機執行命令id  tuser1檢視是否有該使用者

# ansible test -m user -a "name=tuser2 uid=1010 group=adm groups=daemon,root home=/home/tuser2"
#建立賬戶並設定對應的賬戶屬性,uid指定使用者ID號,group指定使用者屬於哪個基本組
#groups指定使用者屬於哪些附加組,home指定使用者的家目錄
## 驗證: 到node1主機執行命令id tuser2檢視是否有該使用者

# ansible test -m user -a "name=tuser1 password={{'abc'| password_hash('sha512')}}"
#修改賬戶密碼,使用者名稱是tuser1,密碼是abc,密碼經過sha512加密

# ansible test -m user -a "name=tuser1 state=absent"
#刪除賬戶tuser1,state=absent代表刪除賬戶的意思,name指定要刪除的使用者名稱是什麼
#賬戶的家目錄不會被刪除,相當於執行userdel tuser1

# ansible test -m user -a "name=tuser2 state=absent remove=true"
#刪除tuser2賬戶同時刪除家目錄、郵箱,相當於執行userdel  -r  tuser2
(12)yum_repository模組
使用yum_repository可以建立或修改yum源配置檔案(ansible-doc yum_repository)。
# ansible test -m yum_repository -a "name=myyum description=hello baseurl=ftp://192.168.4.254/centos gpgcheck=no"
#新建一個yum源配置檔案/etc/yum.repos.d/myyum.repo
#yum原始檔名為myyum,該檔案的內容如下:
[myyum]
baseurl = ftp://192.168.4.254/centos
gpgcheck = 0
name = hello
## 驗證:到node1主機ls /etc/yum.repos.d/檢視該目錄下是否有新的yum檔案

# ansible test -m yum_repository -a "name=myyum description=test baseurl=ftp://192.168.4.254/centos gpgcheck=yes gpgkey=…"
#修改yum原始檔內容

# ansible test -m yum_repository -a "name=myyum state=absent"
#刪除yum原始檔myyum
(13)yum模組
使用yum模組可以安裝、解除安裝、升級軟體包(ansible-doc yum),
state: present(安裝)|absent(解除安裝)|latest(升級)。
# ansible test -m yum -a "name=unzip state=present"
#安裝unzip軟體包,state預設為present,也可以不寫
## 驗證:到node1主機執行命令rpm -q unzip檢視是否有該軟體

# ansible test -m yum -a "name=unzip state=latest"
#升級unzip軟體包,軟體名稱可以是*,代表升級所有軟體包

# ansible test -m yum -a "name=unzip state=absent"
#呼叫yum模組,解除安裝unzip軟體包,state=absent代表解除安裝軟體
## 驗證:到node1主機執行命令rpm -q unzip檢視該軟體是否已經被解除安裝
(14)service模組(ansible-doc service)
service為服務管理模組(啟動、關閉、重啟服務等),
state:started|stopped|restarted,
enabled:yes設定開機啟動。

# ansible test -m yum -a "name=httpd"
#呼叫yum模組,安裝httpd軟體包
## 驗證:到node1主機執行命令rpm -q httpd檢視該軟體是否被安裝

# ansible test -m service -a "name=httpd state=started"
#呼叫service模組,啟動httpd服務
## 驗證:到node1主機執行命令systemctl  status  httpd檢視服務狀態

# ansible test -m service -a "name=httpd state=stopped"
#呼叫service模組,關閉httpd服務
## 驗證:到node1主機執行命令systemctl  status  httpd檢視服務狀態

# ansible test -m service -a "name=httpd state=restarted"
#呼叫service模組,重啟httpd服務

# ansible test -m service -a "name=httpd enabled=yes"
#呼叫service模組,設定httpd服務開機自啟
(15)lvg模組
建立、刪除卷組(VG),修改卷組大小,
state:present(建立)|absent(刪除)。
# ansible test -m yum -a "name=lvm2"
#安裝lvm2軟體包,安裝了lvm2軟體後,才有pvcreate、vgcreate、lvcreate等命令

# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1"
#建立名稱為myvg的卷組,該卷組由/dev/sdb1組成
#注意:這裡的磁碟名稱要根據實際情況填寫
## 驗證:到node1主機執行命令pvs和vgs檢視是否有對應的PV和VG

# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1,/dev/sdb2"
#修改卷組大小,往卷組中新增一個裝置/dev/sdb2
(16)lvol模組
建立、刪除邏輯卷(LV),修改邏輯卷大小,
state:present(建立)|absent(刪除)。
# ansible test -m lvol -a "lv=mylv vg=myvg size=2G"
#使用myvg這個卷組建立一個名稱為mylv的邏輯卷,大小為2G
## 驗證:到node1主機執行命令lvs檢視是否有對應的LV邏輯卷

# ansible test -m lvol -a "lv=mylv vg=myvg size=4G"
#修改LV邏輯卷大小

# ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"
#刪除邏輯卷,force=yes是強制刪除

# ansible test -m lvg -a "vg=myvg state=absent"
#刪除卷組myvg

相關文章