目錄
Ansible
ansible任務執行模式
ansible執行流程
ansible命令執行過程(背會)
ansible的安裝方式
ansible的程序結構(yum安裝為例)
ansible的配置文件查找順序(背會)
核心配置文件
ansible的配置文件
Ansible常用命令
ansible-doc命令
部署ansible管理集群
實驗環境
實驗步驟
????????安裝ansible
????????核心配置文件
????????添加主機清單
????????ansible的主機清單
免密設置
ansible配置公私鑰
? ? ? ? 配置公私鑰
? ? ? ? copy一份公私鑰給web主機
主機連通性測試
命令測試是否正常
Ansible常用模塊
Ansible
ansible任務執行模式
-
ansible系統由控制主機被管節點的操作方式可以分為兩類,即adhoc和playbook
-
ad-hoc模式(點對點模式)
使用單個模塊,支持批量執行單條命令。ad-hoc命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當于bash中的一句話shell
-
playbook模式(劇本模式)
劇本模式是Ansible的主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task(任務)集合完成一類功能,比如web服務的安裝部署、數據庫服務的批量備份等。可以簡單地把playbook理解為通過組合多條ad-hoc操作的配置文件
ansible執行流程
-
簡單理解就是Ansible在運行時,首先讀取ansible.cfg中的配置,根據規則獲取Inventory中的管理主機列表,并行的在這些主機中執行配置的任務,最后等待執行返回結果。
ansible命令執行過程(背會)
-
加載自己的配置文件,默認為/etc/ansible/ansible.cfg;
-
查找對應的主機配置文件,找到要執行的主機或者組;
-
加載自己對應的模塊文件,如command;
-
通過ansible將模塊或者命令生成對應的py文件(python腳本),并且將該文件傳輸到遠程服務器;
-
對應執行用戶的家目錄.ansible/tmp/xxx/xxx.py文件;
-
給文件添加執行權限;
-
執行并且返回結果;
-
刪除臨時的py文件, sleep 0退出;
ansible的安裝方式
使用yum安裝
yum安裝是我們比較熟悉的安裝方式。我們需要先安裝一個epel-release包,然后再安裝ansible即可。
yum install epel-release -y
yum install ansible -y
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install ansible -y
ansible的程序結構(yum安裝為例)
-
配置文件目錄:/etc/ansible/
-
執行文件目錄:/usr/bin/
-
Lib庫依賴目錄:/usr/lib/pyhtonX.X/site-packages/ansible/
-
Help文檔目錄:/usr/share/doc/ansible-X.X.X/
-
Man文檔目錄:/usr/share/man/man1/
ansible的配置文件查找順序(背會)
-
ansible與我們其他的服務在這一點上又很大的不同,這里的配置文件查找是從多個地方找的,順序如下:
1.檢查環境變量 ANSIBLE_CONFIG 指向的路徑文件(export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg);
2. ~/.ansible.cfg,檢查當前目錄下的ansible.cfg配置文件;
3./etc/ansible.cfg檢查etc目錄的配置文件。
核心配置文件
? ? ? ? 可用文件里命令生成一個
[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg ?hosts ?roles
[root@localhost ansible]# vim ansible.cfg?[root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
[root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
[root@localhost ansible]# vim ansible.cfg
ansible的配置文件
-
ansible的配置文件路徑是/etc/ansible/ansible.cfg,ansible許多參數,下面我們列出一些常見的參數:
vim /etc/ansible/ansible.cfg
inventory = /etc/ansible/hoste #這個參數表示資源清單inventory文件的位置
library = /usr/share/ansible #指向存放ansible模塊的目錄,支持多個目錄方式,只要用冒號(:)隔開就行。fbrks = 5 #并發連接數,默認為5
sudo_user = root #設置默認執行命令的用戶 ,2.14版本中是:become_user=root
remote_port = 22 #指定連接被管理節點的端口,默認為22端口,為安全考慮,建議修改
host_key_checking = False #設置是否檢查SSH主機的密鑰,值為True/False,關閉后第一次連接不會提示配置實例
timeout = 60 #設置SSH連接的超時時間,單位為秒
log_path = /var/log/ansible.cfg #指定一個存儲ansible日志的文件(默認不記錄日志)
[defaults]
inventory = /etc/ansible/hosts #主機清單文件路徑。Ansible 通過此文件定義目標主機/組。
library = /usr/share/ansible/modules #Ansible 內置模塊的搜索路徑。若需加載自定義模塊,可添加路徑
modules_dir = /usr/share/ansible/modules #與 library 類似,但僅用于查找模塊
remote_user = root #遠程主機的登錄用戶。默認以 root 身份登錄目標主機(生產環境建議改為普通用戶,配合 become 提權)。
ask_pass = False ## 是否提示輸入登錄密碼。若 remote_user 非免密登錄,設為 True 會交互式詢問密碼(不安全,推薦用 SSH 密鑰免密)。
private_key_file = None ##SSH 私鑰文件路徑。用于免密登錄(如 private_key_file = ~/.ssh/id_rsa)。
remote_port = 22 ## 遠程 SSH 端口。若目標主機 SSH 非默認端口(如 2222),需修改此值(remote_port = 2222)。
timeout=10 #SSH 連接超時時間(秒)。網絡不穩定時可調大(如 timeout = 30)。
log_path=None #Ansible 操作日志路徑。設為 /var/log/ansible.log 可記錄詳細執行日志(需確保文件可寫)。
module_name = command #未指定模塊時的默認模塊。例如 ansible host -m shell 可省略 -m shell(不推薦,易混淆)。
executable= /bin/sh #命令執行的 Shell 解釋器。若目標主機默認 Shell 非 /bin/sh(如 /bin/bash),可修改(executable = /bin/bash)
prompt= \# ##特權用戶提示符匹配規則。用于判斷是否已提權(如 prompt = \$ 可識別 $ 或 #)。
fact_caching=False #是否啟用事實緩存(Facts Caching)。設為 True 可緩存主機信息(如 fact_caching = jsonfile,配合 fact_caching_connection 指定存儲路徑
fact_caching_timeout=86400 #事實緩存過期時間(秒)。默認 24 小時(86400 秒),可根據需求調整(如 fact_caching_timeout = 3600 緩存 1 小時)。
deprecation_warnings=True #是否顯示已棄用警告。生產環境可設為 False 減少冗余輸出(deprecation_warnings = False)。
display_skipped_hosts=True #是否顯示跳過的主機。若任務因條件不滿足跳過某些主機,設為 False 可隱藏這些主機的輸出(display_skipped_hosts = False)。
host_key_checking=True #是否檢查 SSH 主機密鑰。首次連接新主機時會提示確認指紋,設為 False 可跳過(生產環境不建議,存在中間人攻擊風險)。
inventory_ignore_extensions=['.pyc', '.pyo', '.swp', '.swo'] # 忽略的清單文件擴展名。避免誤加載臨時文件(如 inventory_ignore_extensions = ['.bak'])。
action_plugins=/usr/share/ansible/plugins/action # Action 插件搜索路徑。自定義 Action 插件可添加至此(如 action_plugins = /opt/my_plugins/action)。
callback_plugins=/usr/share/ansible/plugins/callback #Callback 插件搜索路徑。用于自定義輸出格式(如集成 Jenkins、Slack 等)。
filter_plugins=/usr/share/ansible/plugins/filter # Filter 插件搜索路徑。自定義變量過濾邏輯(如 filter_plugins = /opt/my_plugins/filter)
test_plugins= /usr/share/ansible/plugins/test # Test 插件搜索路徑。用于測試變量或文件(如 test_plugins = /opt/my_plugins/test)
vars_plugins = /usr/sha
Ansible常用命令
[root@localhost ansible]# ls /usr/bin/| grep ansible
ansible
ansible-community
ansible-config
ansible-connection
ansible-console
ansible-doc
ansible-galaxy
ansible-inventory
ansible-playbook
ansible-pull
ansible-vault
#### ansible命令集解釋* /usr/bin/ansible,Ansible AD-Hoc臨時命令執行工具,常用于臨時命令的執行
* /usr/bin/ansible-doc,Ansible模塊功能查看工具(document)
* /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-doc命令
ansible-doc命令常用于獲取模板塊信息及其適用幫助,一般用法如下:
ansible-doc -l ##獲取全部模塊信息
ansible-doc -s MOD_NAME #獲取指定模塊的使用幫助
部署ansible管理集群
全程是只需要,在ansible上面操作就行!!!
實驗環境
主機名 IP地址 安裝包 ansible 192.168.158.164 epel-release、ansible node1 192.168.158.159 - node2 192.168.158.160 -
實驗步驟
????????安裝ansible
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# su
[root@ansible ~]# yum install epel-release -y
[root@ansible ~]# yum install ansible -y
????????核心配置文件
????????可用文件里命令生成一個
[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg ?hosts ?roles
[root@localhost ansible]# vim ansible.cfg?[root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
????????添加主機清單
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg hosts roles
[root@ansible ansible]# vi hosts [web] ##添加到最后一行
192.168.158.159
192.168.158.160
????????ansible的主機清單
-
在配置文件中,我們提到了資源清單,這個清單就是主機清單,里面保存的是一些ansible需要連接管理的主機列表。
-
如下是ansible主機清單的定義方式:
-
vim /etc/ansible/hosts
(直接在末尾添加)
例如:
1.直接指明主機地址或者主機名: #green.example.com# #bule.example.com# # 192.168.115.101 # 192.168.115.1022.定義一個主機組(組名)把地址或者主機名加進去 [mysql_test] 192.168.115.101 192.168.115.102 192.168.115.103
-
需要注意的是,這里的組成員可以使用通配符來匹配,這樣對于一些標準化管理就比較方便。我們可以根據實際情況來配置我們的主機列表,具體的操作如下:
vi /etc/ansible/hosts ?#定義一組web主機組[web] 192.168.158.159 192.168.158.160
免密設置
ansible配置公私鑰
? ? ? ? 配置公私鑰
? ? ? ? copy一份公私鑰給web主機
[root@localhost ansible]# ssh-keygen -N '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/fwy5SFyKfwKf61esKQk57v7ok2gruFMyf1tncudYKA root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
| |
| |
| |
| . |
| S.= o. |
| . o . B+*+oo |
| = o E +***.. |
| + o . *o+B=o. |
| +.. ooOO*=+ |
+----[SHA256]-----+
[root@localhost ansible]# ssh-copy-id 192.168.158.159
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.158.159 (192.168.158.159)' can't be established.
ED25519 key fingerprint is SHA256:T18Ri2Kqfht/W/As6DBvSPOqvDBUhgWq5aORE9E4CPQ.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.158.159's password: Number of key(s) added: 1Now try logging into the machine, with: "ssh '192.168.158.159'"
and check to make sure that only the key(s) you wanted were added.[root@localhost ansible]# ssh-copy-id 192.168.158.160
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.158.160 (192.168.158.160)' can't be established.
ED25519 key fingerprint is SHA256:T18Ri2Kqfht/W/As6DBvSPOqvDBUhgWq5aORE9E4CPQ.
This host key is known by the following other names/addresses:~/.ssh/known_hosts:1: 192.168.158.159
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.158.160's password: Number of key(s) added: 1Now try logging into the machine, with: "ssh '192.168.158.160'"
and check to make sure that only the key(s) you wanted were added.
主機連通性測試
命令測試是否正常
[root@localhost ansible]# ansible 192.168.158.159 -m ping
192.168.158.159 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"
}
[root@localhost ansible]# ansible 192.168.158.160 -m ping
192.168.158.160 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"
}
Ansible常用模塊
-
- ?**
command
?&?shell
:?**? (執行命令)- ?作用:?? 讓你的“小機器人”在被管服務器上運行命令。就像你打開服務器的命令行窗口輸入指令一樣。
- ?區別:??
command
:只運行簡單命令,不支持管道符(|
)、重定向(>
?<
)、環境變量($HOME
)這些復雜操作。shell
:可以運行任何你在命令行能運行的復雜命令,支持管道、重定向、變量。 ?注意:?? 能用?command
?就用?command
,更安全、結果更穩定;實在需要復雜操作再用?shell
。
- ?**
copy
?&?fetch
:?? (文件傳輸) - ?方向相反!?**?- ?**
copy
:?? 作用是把你本地的文件或者Playbook目錄下的文件**,?復制到被管服務器上。就像你讓管家把你電腦里的文件A拿到服務器B上去放好。 - ?**
fetch
:?? 作用是從被管服務器上把文件拉取(下載)到你運行Playbook的電腦**?(控制節點)。就像你讓管家去服務器B上把某個重要的日志文件C拿回來給你看。
- ?**
- ?**
file
:?**? (文件/目錄管理)- ?作用:?? 操作文件和目錄本身(不是內容)。讓管家去創建文件、目錄、設置權限(讀、寫、執行)、更改所有者、創建軟鏈接/硬鏈接等。比如:在服務器上創建目錄?
/data
,權限設為?755
,所有者是?www-data
。
- ?作用:?? 操作文件和目錄本身(不是內容)。讓管家去創建文件、目錄、設置權限(讀、寫、執行)、更改所有者、創建軟鏈接/硬鏈接等。比如:在服務器上創建目錄?
- ?**
fetch
:?**? (上面已介紹) - ?**
cron
:?**? (定時任務)- ?作用:?? 讓管家在服務器上設置(添加、修改、刪除)定時任務(cron job)?。就像配置“服務器上的鬧鐘”,讓它定期執行某個命令或腳本(比如每天凌晨備份數據庫)。
- ?**
yum
?(CentOS/RHEL) /?apt
?(Ubuntu/Debian):?? (軟件包管理) - ?圖片是?yum
,注意你的系統!?**?- ?作用:?? 讓管家在服務器上安裝、更新、卸載、查看軟件包。就像用手機上的“應用商店”裝/卸載APP一樣。
- ?**
service
:?**? (服務管理)- ?作用:?? 讓管家啟動、停止、重啟、重新加載、查看系統服務的狀態。比如啟動Nginx網站服務(
nginx
)、停止MySQL數據庫服務(mysqld
)。
- ?作用:?? 讓管家啟動、停止、重啟、重新加載、查看系統服務的狀態。比如啟動Nginx網站服務(
- ?**
user
?&?group
:?**? (用戶/組管理)- ?作用:??
user
:讓管家創建、修改、刪除用戶賬號,設置密碼、家目錄、Shell、所屬組等。group
:讓管家創建、修改、刪除用戶組,管理組成員。
- ?作用:??
- ?**
script
:?**? (運行腳本)- ?作用:?? 讓管家把你寫在本地的Shell腳本、Python腳本等復制到被管服務器上去執行。比如你寫了一個?
backup.sh
?的備份腳本,用這個模塊傳到服務器上并運行它。
- ?作用:?? 讓管家把你寫在本地的Shell腳本、Python腳本等復制到被管服務器上去執行。比如你寫了一個?
- ?**
setup
?(或?gather_facts
):?**? (收集信息)- ?作用:?? Ansible管家在執行任何任務前,會自動收集被管服務器的各種信息(主機名、IP地址、操作系統版本、內存大小、磁盤空間等)。你可以在任務中直接使用這些信息(稱為?
facts
),實現更智能的自動化(比如根據內存大小設置不同的軟件參數)。這個模塊就是負責收集這些信息的,默認會自動運行。
- ?作用:?? Ansible管家在執行任何任務前,會自動收集被管服務器的各種信息(主機名、IP地址、操作系統版本、內存大小、磁盤空間等)。你可以在任務中直接使用這些信息(稱為?
- ?**
????????