在服務器數量少的時候,手動登錄服務器部署應用、修改配置還能應付,但隨着業務擴張,幾十上百台服務器的運維工作會讓人崩潰——重複執行命令、配置不一致、誤操作風險高,這些問題嚴重拖慢效率。直到用上 Ansible,運維工作才徹底“減負”:它無需在目標服務器安裝客户端,通過 SSH 就能批量管理服務器,用簡單的 YAML 腳本定義運維任務,一鍵完成批量部署、配置管理、服務啓停等操作,成為 DevOps 運維的核心工具。這篇就分享 Ansible 的核心用法和實戰場景,幫你快速上手自動化運維。
一、核心認知:Ansible 為什麼這麼香?
Ansible 是一款開源的自動化運維工具,核心優勢的是“簡單、無Agent、可擴展”:
- 無Agent 架構:無需在目標服務器安裝客户端軟件,僅依賴 SSH 協議(Linux 服務器默認支持),部署零侵入;
- 聲明式語法:用 YAML 編寫 Playbook(任務腳本),語法簡潔易懂,非專業運維也能快速上手;
- 批量執行:支持同時管理成百上千台服務器,按組分類執行任務,效率翻倍;
- 功能全面:覆蓋配置管理、應用部署、任務執行、系統升級等全場景運維需求。
簡單説,Ansible 就像一個“遠程運維機器人”:你提前寫好任務清單(Playbook),它會通過 SSH 登錄所有目標服務器,自動完成你指定的操作,全程無需人工干預。
二、準備工作:環境搭建與基礎配置
1. 安裝 Ansible(控制端)
Ansible 僅需在“控制端”(你的本地機器或專門的運維服務器)安裝,目標服務器無需任何配置。以 CentOS 為例:
# 安裝 EPEL 源(Ansible 不在默認源中)
yum install -y epel-release
# 安裝 Ansible
yum install -y ansible
# 驗證安裝成功(顯示版本即生效)
ansible --version
Ubuntu 系統安裝命令:
apt update && apt install -y ansible
2. 配置目標服務器(被控端)
(1)SSH 免密登錄(關鍵!避免每次輸入密碼)
控制端生成 SSH 密鑰,並拷貝到所有目標服務器:
# 生成 SSH 密鑰(一路回車即可,無需設置密碼)
ssh-keygen -t rsa
# 拷貝密鑰到目標服務器(替換為你的服務器 IP 和用户名)
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
(2)配置主機清單(inventory)
Ansible 通過“主機清單”管理目標服務器,默認路徑為 /etc/ansible/hosts,編輯該文件:
# 定義服務器組([組名] 開頭,方便分類管理)
[web_servers]
192.168.1.101 # Web 服務器 1
192.168.1.102 # Web 服務器 2
[db_servers]
192.168.1.103 # 數據庫服務器
# 可指定端口(默認 22,非默認端口需添加)
# 192.168.1.104:2222
(3)測試連通性
驗證控制端能否正常連接目標服務器:
# 測試 web_servers 組的所有服務器
ansible web_servers -m ping
# 測試所有服務器(all 表示所有組)
ansible all -m ping
輸出 SUCCESS 表示連通成功,若失敗需檢查 SSH 免密配置或服務器網絡。
三、核心實戰:常用運維場景示例
Ansible 的核心是“模塊”和“Playbook”:模塊是單個運維操作(如安裝軟件、複製文件),Playbook 是多個模塊的組合(完成複雜任務)。
1. 單模塊快速執行(臨時任務)
適合臨時執行簡單操作,用 ansible 命令直接調用模塊:
(1)批量執行命令
# 查看 web_servers 組所有服務器的內存使用情況
ansible web_servers -m command -a "free -m"
# 查看 db_servers 組的磁盤空間
ansible db_servers -m command -a "df -h"
(2)批量安裝軟件
# 給 web_servers 組安裝 Nginx(CentOS 系統)
ansible web_servers -m yum -a "name=nginx state=present"
# Ubuntu 系統用 apt 模塊
ansible web_servers -m apt -a "name=nginx state=present update_cache=yes"
(3)批量啓動服務
# 啓動 Nginx 並設置開機自啓
ansible web_servers -m service -a "name=nginx state=started enabled=yes"
(4)批量複製文件
# 把控制端的 /root/nginx.conf 複製到 web_servers 組的 /etc/nginx/nginx.conf
ansible web_servers -m copy -a "src=/root/nginx.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=644"
# 複製後重啓 Nginx
ansible web_servers -m service -a "name=nginx state=restarted"
2. Playbook 實戰(複雜任務自動化)
對於需要多步驟的複雜任務(如部署應用),用 Playbook 編寫任務流程,可重複執行。以“批量部署 Nginx 並配置靜態網站”為例:
(1)創建 Playbook 文件(nginx-deploy.yml)
# Playbook 名稱(描述任務用途)
- name: 批量部署 Nginx 並配置靜態網站
hosts: web_servers # 目標服務器組(對應 inventory 中的組名)
remote_user: root # 登錄目標服務器的用户
gather_facts: yes # 收集目標服務器信息(如系統版本)
# 任務列表(按順序執行)
tasks:
# 任務 1:安裝 Nginx(根據系統版本選擇模塊)
- name: 安裝 Nginx(CentOS)
yum:
name: nginx
state: present
when: ansible_distribution == "CentOS" # 條件判斷:僅 CentOS 執行
- name: 安裝 Nginx(Ubuntu)
apt:
name: nginx
state: present
update_cache: yes
when: ansible_distribution == "Ubuntu" # 僅 Ubuntu 執行
# 任務 2:複製靜態網站文件到目標服務器
- name: 複製網站文件
copy:
src: /root/my-website/ # 控制端的網站文件目錄
dest: /usr/share/nginx/html/ # 目標服務器的 Nginx 網站根目錄
owner: root
group: root
mode: 644
# 任務 3:複製自定義 Nginx 配置文件
- name: 複製 Nginx 配置
copy:
src: /root/nginx.conf
dest: /etc/nginx/nginx.conf
mode: 644
notify: restart nginx # 配置文件變更時,觸發 handlers 中的重啓任務
# 任務 4:確保 Nginx 服務啓動並開機自啓
- name: 啓動 Nginx 服務
service:
name: nginx
state: started
enabled: yes
# 處理器(僅在任務觸發時執行,如配置文件變更後重啓服務)
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
(2)執行 Playbook
# 運行 Playbook(-v 顯示詳細執行過程)
ansible-playbook -v nginx-deploy.yml
執行後,所有 web_servers 組的服務器都會自動完成 Nginx 安裝、網站部署和配置,全程無需手動操作。
3. 變量與模板(動態配置)
實際運維中,不同服務器可能需要不同配置(如端口、目錄),可通過“變量”和“模板”實現動態配置。以 Nginx 端口配置為例:
(1)定義變量(在 inventory 中添加)
[web_servers]
192.168.1.101 nginx_port=80 # 服務器 1 用 80 端口
192.168.1.102 nginx_port=8080 # 服務器 2 用 8080 端口
(2)創建 Jinja2 模板文件(nginx.conf.j2)
模板文件支持變量替換(用 {{ 變量名 }} 表示):
server {
listen {{ nginx_port }}; # 動態替換為服務器的 nginx_port 變量
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
(3)修改 Playbook,使用模板模塊
tasks:
- name: 複製 Nginx 模板配置
template: # 用 template 模塊替換 copy 模塊
src: /root/nginx.conf.j2 # 模板文件
dest: /etc/nginx/nginx.conf
mode: 644
notify: restart nginx
執行 Playbook 後,兩台服務器的 Nginx 會分別使用 80 和 8080 端口,實現動態配置。
四、避坑指南
1. SSH 連接失敗
- 原因:目標服務器 SSH 端口不是默認 22、免密配置錯誤、防火牆攔截;
- 解決:
- 非默認端口在 inventory 中指定:
192.168.1.104:2222; - 手動測試 SSH 連接:
ssh root@192.168.1.101,排查免密問題; - 開放 SSH 端口:
firewall-cmd --add-port=22/tcp --permanent。
2. 模塊執行失敗(如 yum 安裝失敗)
- 原因:系統版本不匹配(如 CentOS 用了 apt 模塊)、軟件源不可用;
- 解決:
- 用
gather_facts: yes收集系統信息,通過when條件判斷系統版本; - 更換軟件源(如 CentOS 更換阿里雲 EPEL 源)。
3. 變量替換失效
- 原因:模板文件後綴不是
.j2、變量名拼寫錯誤、變量未定義; - 解決:
- 模板文件必須以
.j2結尾; - 用
ansible web_servers -m debug -a "var=nginx_port"驗證變量是否生效。
4. 權限問題(如文件複製後無法訪問)
- 原因:目標文件權限設置錯誤,導致服務無法讀取;
- 解決:在
copy或template模塊中指定mode(如mode=644),確保服務用户有讀取權限。
總結
Ansible 的核心價值是“自動化、標準化、可複用”,它把重複的運維工作變成可執行的腳本,不僅解放了雙手,還減少了人為誤操作,讓運維工作更高效、更可靠。
核心用法總結:
- 環境搭建:控制端安裝 Ansible,配置目標服務器 SSH 免密登錄;
- 單模塊操作:臨時任務用
ansible命令直接調用模塊,快速批量執行操作; - Playbook:複雜任務用 YAML 編寫 Playbook,實現多步驟自動化;
- 動態配置:通過變量和 Jinja2 模板,適配不同服務器的個性化需求。
無論是中小團隊的日常運維,還是大型企業的 DevOps 流程集成,Ansible 都能輕鬆應對。掌握它後,你可以把更多精力放在業務優化上,而不是重複的服務器操作上,真正實現“一次編寫,處處執行”的運維效率革命。