##### Ansible使用環境
- 控制節點
? - 安裝Ansible軟件
? - Python環境支持:Python>=2.6
? - 必要的模塊:如PyYAML等
- 被控節點
? - 啟用SSH服務
? - 允許控制節點登錄,通常設置免密登錄
? - Python環境支持
http://www.ansible.com/
#### 一、環境準備
配置好主機名、IP地址、YUM源。關閉防火墻和SELinux
pubserver掛載rocky鏡像
web1添加兩塊20G硬盤
| 主機名 ? ?| IP地址 ? ? ? ? | 角色 ? ? ? ? ? ? ? ?|
| --------- | -------------- | ------------------- |
| pubserver | 192.168.88.240 | 控制節點 ? ? ? ? ? ?|
| web1 ? ? ?| 192.168.88.11 ?| 被控節點(webserver) |
| web2 ? ? ?| 192.168.88.12 ?| 被控節點(webserver) |
| db1 ? ? ? | 192.168.88.13 ?| 被控節點(database) ?|
#### 二、部署配置、自定義ansible軟件YUM源
> 控制節點==服務端
>
> 被控節點==客戶端
##### 前置部署(控制節點服務端操作):
??? ?安裝vsftpd軟件并設置開機自啟后開啟服務,配置網絡YUM以及開機自動掛載
??? ?刷新網絡YUM源,確保通信正常
```shell
yum clean all; yum repoinfo
```
??? ?從真機上傳ansible相關軟件到pubserver主機
```shell
[root@真機 ~]# scp /linux-soft/s2/zzg/ansible_soft/* root@192.168.88.240:/var/ftp/rpms/
```
##### 開始部署:
??? ?安裝createrepo命令包
```shell
yum -y install createrepo_c
```
??? ?創建軟件倉庫信息
```shell
createrepo /var/ftp/rpms/
```
??? ?驗證軟件倉庫下確保有repodata目錄
??? ?增加自定義YUM源配置,在文件最后追加ansible源
```shell
[ansible-rpms]
name=ansible-rpms
baseurl="ftp://192.168.88.241/rpms"
enabled=1
gpgcheck=0
```
??? ?刷新網絡YUM源
??? ?同步repo文件到所有被控節點
```shell
for i in 192.168.88.1{1..3}
?? ?do
?? ??? ?scp /etc/yum.repos.d/ftp_Yum.repo root@$i:/etc/yum.repos.d/
?? ?done
```
??? ?控制節點安裝Ansible(服務端)
```shell
yum -y install ansible
```
??? ?查看安裝版本
```shell
ansible --version
```
??? ?配置控制節點的hosts本地主機名解析文件,確保控制節點通過主機名訪問到被控節點
```shell
vim /etc/hosts
192.168.88.241 ?pubserver
192.168.88.11 ? web1
192.168.88.12 ? web2
192.168.88.13 ? db1
```
??? ?連接,測試hosts文件配置正確
```shell
for i in pubserver web1 web2 db1
?? ?do
?? ??? ?ping -c 2 $i
?? ?done
```
??? ?配置控制節點免密登錄被控節點
```shell
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N '' ? ?#非交互生成秘鑰對
```
??? ?發送公鑰到被控節點
```shell
for i in web1 web2 db1
?? ?do
?? ??? ?ssh-copy-id root@$i
?? ?done
```
??? ?驗證免密登錄
```shell
for i in web1 web2 db1
?? ?do
?? ??? ?ssh root@$i "hostname"
?? ?done
#結果顯示web1,web2,db1
```
##### 被控節點Ansible管理環境配置
- 配置目標
? - 使用Ansible軟件管理多個環境,如開發環境、測試環境、生產環境
? - 多用戶使用同一個控制節點管理不同主機
? - 每個用戶有屬于自己的配置環境(工作目錄)
- Ansible配置文件查找順序
? - 首先檢測ANSIBLE_CONFIG變量定義的配置文件
? - 其次檢查當前目錄下的./ansible.cfg文件
? - 再次檢查當前用戶家目錄下的~/ansible.cfg文件
? - 最后檢查/etc/ansible/ansible.cfg文件
- 控制節點配置
> 創建自定義Ansible工作目錄,在root家目錄下創建ansible文件夾并進入可以自定義名稱,以后關于ansible操作均在此目錄下進行
??? ?配置ansible工具,在剛創建的工作目錄下創建ansible.cfg配置文件和inventory清單列表文件
??? ?ansible.cfg配置文件修改內容:
```shell
[defaults] ? ? ? ? ? ? ? ? ?#通用配置
inventory = inventory ? ? ? #主機清單列表文件名
host_key_checking = false ? #不檢查主機秘鑰,非交互式ssh連接
```
??? ?inventory清單列表文件修改內容:
```shell
[webservers] ? ? ? ?#定義主機組,名稱自定義
web[1:2] ? ? ? ? ? ?#[1:2]表示從1到2
[dbservers]
db1
[cluster:children] ?#cluster為組名,:children為固定寫法,表示為cluster的子組
webservers
dbservers
```
??? ?在工作目錄下確認配置結果
```shell
ansible all --list-hosts?? ??? ??? ?#查看所有被控主機列表
ansible webservers --list-hosts?? ??? ?#查看webservers組主機列表
ansible dbservers --list-hosts?? ??? ?#查看dbservers組主機列表
ansible cluster --list-hosts?? ??? ?#查看cluster組主機列表
```
#### 三、Ansible使用方法及常用模塊
##### 使用方法
- ad-hoc臨時命令
? - 在命令行下使用ansible命令調用Ansible模塊,實現被控節點遠程管理
? - 通常用于查詢信息或臨時簡易操作
- Playbook劇本
? - 把管理任務以特定的格式編輯在文件中,通過ansible-playbook命令遠程管理被控節點
? - 通常用于復雜任務設計及遠程執行
??? ?ad-hoc命令語法格式:ansible?? ?[主機、組列表或IP]?? ?[參數]
??? ?常用參數
| -m ? | 要執行的模塊,默認為command ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
| ---- | ------------------------------------------------------------ |
| -a ? | 模塊的參數 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| -u ? | ssh連接的用戶名,默認用root,ansible.cfg中可以配置 ? ? ? ? ? |
| -f ? | fork多少進程并發處理,默認為5個 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
| -i ? | 指定hosts主機清單列表文件路徑,默認default=/etc/ansible/hosts |
| -M ? | 要執行的模塊路徑,默認為/usr/share/ansible ? ? ? ? ? ? ? ? ? |
| -t ? | 日志輸出目錄,日志文件名以主機命名 ? ? ? ? ? ? ? ? ? ? ? ? ? |
| -k ? | 使用密碼登錄遠程主機,被控節點未做免密登錄時可用 ? ? ? ? ? ? |
??? ?eg:ansible all -m ping?? ?#ping模塊用于測試是否可以SSH遠程登錄被控節點主機
> 返回結果為綠色的SUCCESS狀態信息則為成功
>
> 返回結果為紅色的UNREACHABLE則為失敗
>
> 需要檢測管理節點與被控節點網絡和是否可以免密登錄
??? ?Playbook劇本:略——詳情看二階段/3.Ansible/3_Day02.md
##### 模塊簡介
- Ansible在使用過程中通過模塊來完成指定任務
- Ansible模塊的本質是一個文件,通常是為實現具體功能的Python腳本
- Ansible已經有很多開發好的模塊,可以直接調用,具備開發能力也可以自行開發
- 多數模塊都支持使用參數,需要使用的時候指定參數
- 主要學習已有的常用模塊的用途及常用參數
> 在Ansible中,模塊的冪等性指的是模塊執行操作時,如果目標狀態已經符合預期,再次執行相同的操作不會產生任何改變,也就是說,模塊的執行結果是可重復的,不會因為多次執行而產生不同的結果。這種特性非常重要,因為它可以確保自動化任務的可靠性,避免不必要的數據更改或資源消耗。
??? ?模塊查詢命令使用方法——ansible-doc
```shell
# 列出目前全部可用Ansible模塊,按空格鍵向下翻頁,按q退出返回命令行
ansible-doc -l
# 統計已有模塊數量,WARNING信息直接忽略即可
ansible-doc -l | wc -l
7214
# 查看包含yum的模塊
ansible-doc -l | grep yum
# 查看指定模塊的幫助文檔,按空格鍵向下翻頁,按q退出返回命令行
ansible-doc yum
```
??? ?相關模塊:
??? ?command模塊
> Ansible的默認模塊,用于在被控節點(客戶端)執行Linux命令,不支持bash特性,如管道、重定向
```shell
ansible web1 -m command -a "hostname" #獲取被控節點主機名
ansible web1 -a "ip a s" ? ? ? ? ? ? ?#獲取被控節點IP地址信息
```
??? ?shell模塊
> 于在被控節點執行Linux命令,支持bash特性
```shell
# 獲取IP信息前兩行
ansible web1 -m shell -a "ip a s | head -2"
# 將IP地址信息重定向保存到指定文件
ansible web1 -m shell -a "ip a s > /opt/ip.txt"
# 確認重定向結果
ansible web1 -m shell -a "cat /opt/ip.txt"
```
??? ?script模塊
> 用于在被控節點執行腳本,不局限于Shell腳本
```shell
ansible webservers -m script -a "test.sh" #執行test.sh腳本
```
-------------------------------------
---------------------
??? ?file模塊
> ?用于在被控節點創建文件、目錄、鏈接文件等,還可以修改權限、歸屬
>
> 冪等性
```shell
## 常用參數
?? ?path:指定文件路徑
? ? owner:設置文件所有者
? ? group:設置文件所屬組
? ? state:狀態
? ? ?? ?touch表示創建文件
? ? ?? ?directory表示創建目錄
? ? ?? ?link表示創建軟鏈接
? ? ?? ?absent表示刪除
? ? mode:設置權限
? ? src:source的簡寫,源
? ? dest:destination的簡寫,目標
#使用file模塊創建文件、目錄、軟鏈接,但touch特殊創建同一文件只會刷新時間戳
ansible webservers -m file -a "path=/tmp/file.txt state=touch"
ansible web1 -m shell -a "ls -l /tmp | grep txt"
ansible webservers -m file -a "path=/tmp/demo state=directory"
ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
#使用file模塊修改文件權限和歸屬
ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode=0777"
#使用file模塊刪除被控節點指定文件、目錄、軟鏈接
ansible webservers -m file -a "path=/tmp/file.txt state=absent"
ansible webservers -m file -a "path=/tmp/demo state=absent"
ansible webservers -m file -a "path=/tmp/hosts.txt state=absent"
```
??? ?copy模塊
> 用于將控制節點指定文件發送被被控節點(服務端上傳、客戶端下載)
```shell
## 常用參數
? ? src:源。控制端的文件路徑
? ? dest:目標。被控制端的文件路徑
? ? content:內容。需要寫到文件中的內容
為
# 使用copy模塊發送控制節點指定文件到被控節點指定目錄并重命名(如果dest指定到目錄則文件名不變)
ansible webservers -m copy -a "src=test.sh dest=/tmp/adduser.sh"
# 使用copy模塊發送指定內容到被控節點并存儲在文件中
ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"
```
??? ?fetch模塊
> 用于將被控節點指定文件發送到控制節點(服務端下載、客戶端上傳)
```shell
## 常用參數
? ? src:源。被控制端的文件路徑
? ? dest:目標。控制端的文件路徑
? ? flat:不生成目錄結構,只保留文件到指定目錄
# 使用fetch模塊收集被控節點指定文件到控制節點(默認在控制節點生成/dest_path/主機名/src_path/file)
ansible webservers -m fetch -a "src=/etc/hostname dest=~/"
# 使用fetch模塊收集被控節點指定文件到控制節點(不生成目錄結構,只保留文件到指定目錄)
ansible web1 -m fetch -a "src=/etc/hosts dest=~/ flat=yes"
```
??? ?lineinfile模塊
> 用于確保被控節點指定文件內有指定行。用于在遠程主機上的文件中插入、替換或刪除行,適用于編輯配置文件、腳本等文本文件,確保某些配置或內容的一致性,如添加環境變量、修改配置項等
```shell
## 常用參數
? ? path:待修改的文件路徑
? ? line:寫入文件的一行內容
? ? regexp:正則表達式,用于查找文件中的內容
# 確保/etc/issue文件中有Hello World行,如果不存在則追加到文件末尾,存在就不會添加
ansible webservers -m lineinfile -a "path=/etc/issue line='Hello World'"
# 替換/etc/issue文件中最后一個帶Hello的整行替換成Hello Linux
ansible webservers -m lineinfile -a "path=/etc/issue regexp='Hello' line='Hello Linux'"
```
??? ?replace模塊
> 用于關鍵詞匹配替換
```shell
## 常用參數
? ? path:待修改的文件路徑
? ? replace:將正則表達式查到的內容,替換成replace的內容
? ? regexp:正則表達式,用于查找文件中的內容
# 替換/etc/issue文件中所有Hello的字符串為Hi
ansible webservers -m replace -a "path=/etc/issue regexp='Hello' replace='Hi'"
```
-----------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------
??? ?user模塊
> 用于實現Linux用戶管理
```shell
## 常用參數
? ? name:待創建的用戶名
? ? uid:用戶ID
? ? group:設置主組
? ? groups:設置附加組
? ? home:設置家目錄
? ? password:設置用戶密碼
? ? state:狀態。present表示創建,它是默認選項。absent表示刪除
? ? remove:刪除家目錄、郵箱等。值為yes或true都可以
# 使用user模塊創建用戶
ansible webservers -m user -a "name=tom"
# 使用user模塊創建用戶并設置用戶屬性,group是屬組,groups是附加組
ansible webservers -m user -a "name=jim uid=1010 group=adm groups=daemon,root home=/home/jim"
# {{}}是固定格式,表示執行命令
# password_hash()是函數,sha512是加密算法
ansible webservers -m user -a "name=tom password={{'123456'|password_hash('sha512')}}"
ansible webservers -m user -a "name=tom state=absent"
ansible webservers -m user -a "name=jim state=absent remove=true"
```
??? ?group模塊
> 用于實現Linux組管理
```shell
## 常用參數
? ? name:待創建的組名
? ? gid:組的ID號
? ? state:present表示創建,它是默認選項。absent表示刪除
# 使用group模塊創建devops組
ansible webservers -m group -a "name=devops"
# 使用group模塊刪除devops組
ansible webservers -m group -a "name=devops state=absent"
```