在服務器數量少的時候,手動登錄服務器部署應用、修改配置還能應付,但隨着業務擴張,幾十上百台服務器的運維工作會讓人崩潰——重複執行命令、配置不一致、誤操作風險高,這些問題嚴重拖慢效率。直到用上 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、免密配置錯誤、防火牆攔截;
  • 解決:
  1. 非默認端口在 inventory 中指定:192.168.1.104:2222
  2. 手動測試 SSH 連接:ssh root@192.168.1.101,排查免密問題;
  3. 開放 SSH 端口:firewall-cmd --add-port=22/tcp --permanent

2. 模塊執行失敗(如 yum 安裝失敗)

  • 原因:系統版本不匹配(如 CentOS 用了 apt 模塊)、軟件源不可用;
  • 解決:
  1. gather_facts: yes 收集系統信息,通過 when 條件判斷系統版本;
  2. 更換軟件源(如 CentOS 更換阿里雲 EPEL 源)。

3. 變量替換失效

  • 原因:模板文件後綴不是 .j2、變量名拼寫錯誤、變量未定義;
  • 解決:
  1. 模板文件必須以 .j2 結尾;
  2. ansible web_servers -m debug -a "var=nginx_port" 驗證變量是否生效。

4. 權限問題(如文件複製後無法訪問)

  • 原因:目標文件權限設置錯誤,導致服務無法讀取;
  • 解決:在 copytemplate 模塊中指定 mode(如 mode=644),確保服務用户有讀取權限。

總結

Ansible 的核心價值是“自動化、標準化、可複用”,它把重複的運維工作變成可執行的腳本,不僅解放了雙手,還減少了人為誤操作,讓運維工作更高效、更可靠。

核心用法總結:

  1. 環境搭建:控制端安裝 Ansible,配置目標服務器 SSH 免密登錄;
  2. 單模塊操作:臨時任務用 ansible 命令直接調用模塊,快速批量執行操作;
  3. Playbook:複雜任務用 YAML 編寫 Playbook,實現多步驟自動化;
  4. 動態配置:通過變量和 Jinja2 模板,適配不同服務器的個性化需求。

無論是中小團隊的日常運維,還是大型企業的 DevOps 流程集成,Ansible 都能輕鬆應對。掌握它後,你可以把更多精力放在業務優化上,而不是重複的服務器操作上,真正實現“一次編寫,處處執行”的運維效率革命。