返回文章列表

Ansible 與 Vagrant 建立多機器測試環境與伺服器管理

本文將探討如何結合 Ansible 和 Vagrant 建立多機器測試環境,並使用 Ansible 的 ad-hoc 命令和 playbook 進行伺服器管理,涵蓋套件安裝、資源監控、日誌檢查、使用者管理等導向,同時提供 Vagrantfile 範例和 Ansible 組態技巧,有效提升測試和佈署效率。

DevOps 系統管理

Ansible 作為自動化工具,能有效簡化系統管理流程,搭配 Vagrant 建立可控的測試環境,更能確保變更的可靠性。透過 Ansible 的 ad-hoc 命令,可以快速執行單次任務,例如安裝套件、檢查系統資源或檢視日誌等。而 Vagrant 則能快速建立和管理多台虛擬機器,模擬真實的伺服器環境,讓開發者和系統管理員在佈署前進行充分的測試和驗證,避免直接影響生產環境。此方法尤其適用於需要頻繁測試和佈署的複雜系統,能有效降低錯誤風險並提升工作效率。此外,文中也提供 Vagrantfile 的範例,方便讀者快速上手,並搭配 Ansible 的最佳實踐,讓讀者能更有效率地管理多台伺服器。

使用 Ansible 與 Vagrant 進行基礎設施測試與管理

Ansible 是一個強大的自動化工具,能夠幫助系統管理員高效地管理多台伺服器。透過與 Vagrant 的結合,可以輕鬆建立測試環境,進行各種實驗和除錯,而不會影響生產環境。接下來,玄貓將探討如何使用 Ansible 的 ad-hoc 命令來快速執行常見任務,並介紹如何利用 Vagrant 建立多機器測試環境。

使用 Ansible ad-hoc 命令進行伺服器管理

Ansible 的 ad-hoc 命令允許管理員在一台或多台伺服器上執行單次命令。這些命令通常用於快速執行某些任務或收集資料,而不需要撰寫完整的 playbook。以下是一些常見的 ad-hoc 命令應用場景:

安裝與更新套件

系統管理員經常需要在伺服器上安裝或更新套件。Ansible 支援多種套件管理工具,如 dnfapt。例如,要在所有伺服器上安裝 chrony 套件,可以使用以下命令:

ansible all -m yum -a "name=chrony state=present" -b

檢查資源使用情況

檢查伺服器的資源使用情況(如磁碟空間、記憶體、CPU 和網路)是維護伺服器健康狀況的重要步驟。Ansible 提供了多種模組來檢查這些資源:

ansible all -m shell -a "free -m"

檢查日誌檔案

日誌檔案是診斷和解決問題的重要資源。可以使用 Ansible 來檢查特定日誌檔案的內容:

ansible all -m shell -a "tail -n 20 /var/log/messages"

管理系統使用者與群組

系統管理員經常需要建立或刪除使用者和群組。Ansible 提供了 usergroup 模組來處理這些任務:

ansible all -m user -a "name=testuser state=present"

使用 Vagrant 建立測試環境

為了進行實驗而不影響生產環境,可以使用 Vagrant 建立虛擬機器測試環境。Vagrant 支援多機器組態,允許管理員同時啟動和管理多台虛擬機器。

範例:建立多機器環境

以下是一個簡單的 Vagrantfile 檔案範例,展示如何建立兩台 Rocky Linux 虛擬機器:

Vagrant.configure("2") do |config|
  config.vm.box = "rockylinux/8"

  config.vm.define "server1" do |server1|
    server1.vm.hostname = "server1"
    server1.vm.network "private_network", type: "dhcp"
  end

  config.vm.define "server2" do |server2|
    server2.vm.hostname = "server2"
    server2.vm.network "private_network", type: "dhcp"
  end
end

啟動這些虛擬機器後,可以使用 Ansible ad-hoc 命令來管理它們:

vagrant up
ansible all -i Vagrantfile -m ping

此圖示

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Ansible 與 Vagrant 建立多機器測試環境與伺服器管理

package "Ansible 架構" {
    component [Control Node] as control

    package "Ansible 組件" {
        component [Inventory] as inventory
        component [Playbooks] as playbooks
        component [Roles] as roles
        component [Modules] as modules
    }

    package "Managed Nodes" {
        component [Web Server] as web
        component [DB Server] as db
        component [App Server] as app
    }
}

control --> inventory : 主機清單
control --> playbooks : 任務定義
playbooks --> roles : 引用角色
roles --> modules : 使用模組
control --> web : SSH 連線
control --> db : SSH 連線
control --> app : SSH 連線

note right of control
  無需在目標主機安裝 Agent
  透過 SSH 執行任務
end note

@enduml

內容解密:

  • Vagrantfile:這是一個組態檔案,用於定義和啟動虛擬機器。該檔案中包含了虛擬機器的基本組態,如作業系統、網路設定等。
  • Vagrant 虛擬機器:透過 Vagrantfile 組態啟動的虛擬機器例項。
  • Ansible ad-hoc 命令:這些命令用於在虛擬機器上執行單次任務或收集資料。
  • 管理多台伺服器:透過 Ansible 的 ad-hoc 命令可以高效地在多台伺服器上執行操作。

這張圖示展示了 Vagrant 和 Ansible 在基礎設施自動化中的協同工作方式。首先透過 Vagrantfile 組態並啟動虛擬機器,然後利用 Ansible ad-hoc 命令來進行各種操作和資料收集,從而實作對多台伺服器的高效管理。

佈署及管理多伺服器環境

在現代軟體開發中,常見的架構包括多個伺服器進行分工合作,以提高系統的穩定性和可擴充套件性。本文將介紹如何使用 Vagrant 和 Ansible 來管理三個虛擬機器(VM),其中包括兩個應用伺服器和一個資料函式庫伺服器。這種架構雖然簡單,但足以展示 Ansible 在伺服器管理中的強大能力。

準備環境

首先,我們需要準備三個 VM:兩個應用伺服器和一個資料函式庫伺服器。這些 VM 將會執行 Rocky Linux 8 作業系統。

建立 Vagrantfile

在本地磁碟的任意位置建立一個新資料夾(例如 ~/VMs/[dir]),並在其中建立一個名為 Vagrantfile 的空白檔案。這個檔案將用來描述我們的虛擬機器組態。開啟這個檔案,新增以下內容並儲存:

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # 一般 Vagrant VM 組態。
  config.vm.box = "geerlingguy/rockylinux8"
  config.ssh.insert_key = false
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.provider :virtualbox do |v|
    v.memory = 512
    v.linked_clone = true
  end

  # 應用伺服器 1。
  config.vm.define "app1" do |app|
    app.vm.hostname = "orc-app1.test"
    app.vm.network :private_network, ip: "192.168.60.4"
  end

  # 應用伺服器 2。
  config.vm.define "app2" do |app|
    app.vm.hostname = "orc-app2.test"
    app.vm.network :private_network, ip: "192.168.60.5"
  end

  # 資料函式庫伺服器。
  config.vm.define "db" do |db|
    db.vm.hostname = "orc-db.test"
    db.vm.network :private_network, ip: "192.168.60.6"
  end
end

Vagrantfile 組態了我們要管理的三台伺服器,並為每台伺服器指定了獨特的主機名稱、機器名稱和 IP 地址。為了簡單起見,這些伺服器都會執行 Rocky Linux 8。

啟動 Vagrant

開啟終端視窗,進入剛剛建立 Vagrantfile 的資料夾,並執行以下命令:

vagrant up

這將開始建立三台虛擬機器。如果你之前已經下載過相關的基礎映像檔,這個過程應該只需要幾分鐘。

組態 Ansible

在 Vagrant 建立虛擬機器的同時,我們可以開始組態 Ansible,使其能夠管理這些伺服器。

建立清單檔案

Ansible 的清單檔案是用來告知 Ansible 需要管理哪些伺服器的。最簡單的方法是將伺服器新增到清單檔案中。

在專案的根目錄中建立一個名為 ansible.cfg 的檔案,並新增以下內容:

[defaults]
inventory = hosts.ini

接著,在同一目錄中建立一個名為 hosts.ini 的檔案,並新增以下內容:

# 應用伺服器
[app]
192.168.60.4
192.168.60.5

# 資料函式庫伺服器
[db]
192.168.60.6

# 構成群組 'multi' 包含所有伺服器
[multi:children]
app
db

# 應用於所有伺服器的變數
[multi:vars]
ansible_user=vagrant
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

此清單檔案定義了三組伺服器:應用伺服器組、資料函式庫伺服器組以及包含所有伺服器的 multi 構成群組。此外還定義了一些變數,這些變數將應用於所有伺服器。

執行初始 Ad-hoc 命令

在開始使用 Ansible 進行自動化管理之前,我們可以先使用一些 Ad-hoc 命令來檢查伺服器的狀態。

檢查主機名稱

首先,我們需要確認 Vagrant 是否正確組態了 VM 的主機名稱。使用以下命令:

ansible multi -a "hostname"

此命令將在所有三台伺服器上執行 hostname 命令,並傳回結果。如果 Ansible 無法連線到某台伺服器,它會顯示該伺服器的錯誤訊息,但會繼續在其他伺服器上執行命令。

推薦的監控工具

玄貓推薦使用一些監控工具來確保你的生產環境中的資源使用情況正常。例如 Munin、Nagios、Cacti 和 Hyperic 等工具可以幫助你監控資源使用情況。如果你正在執行一個導向網際網路的網站或網頁應用程式,還可以考慮使用 Pingdom 或 Uptime Robot 號外部監控解決方案。

下一步

接下來,玄貓將深入介紹如何使用 Ansible 組態和管理這些虛擬機器。具體內容包括如何安裝必要的軟體、組態資料函式庫以及佈署應用程式等。

希望這些步驟能夠幫助你順利佈署和管理多伺服器環境。如果有任何問題或需要進一步的幫助,歡迎隨時聯絡玄貓!

Ansible 使用技巧與最佳實踐

解決常見問題

在使用 Ansible 進行自動化時,可能會遇到一些常見的問題,例如主機無法比對或庫存檔案相關錯誤。這些問題通常是由 ansible.cfg 檔案位置不正確或語法錯誤所引起。可以嘗試明確設定 ANSIBLE_INVENTORY 環境變數來覆寫庫存檔案路徑,例如:

export ANSIBLE_INVENTORY=hosts.ini

另一個常見問題是 SSH 驗證主機金鑰時出現的錯誤。由於 SSH 的安全特性,第一次連線時需要確認伺服器的「主機金鑰」。可以在命令列輸入 yes 來接受主機金鑰,或者設定環境變數 ANSIBLE_HOST_KEY_CHECKING=False 來忽略這個警告:

export ANSIBLE_HOST_KEY_CHECKING=False

控制執行順序

在執行 Ansible 命令時,可能會發現命令並不是按照預期的順序在每台伺服器上執行。Ansible 預設會平行執行命令以加快完成時間。如果需要按照特定順序執行,可以使用 -f 引數來控制平行數量:

$ ansible multi -a "hostname" -f 1

這樣可以確保命令按順序在每台伺服器上執行。不過,通常情況下並不需要這樣做,反而會希望增加平行數量來加快處理速度,例如 -f 10-f 25

探索環境

在信任 Vagrant 設定主機名稱後,還需要確保其他環境設定正常。首先,檢查每台伺服器是否有足夠的磁碟空間:

$ ansible multi -a "df -h"

結果顯示每台伺服器的磁碟使用情況。接著檢查記憶體使用情況:

$ ansible multi -a "free -m"

記憶體使用情況顯示出來後,可以進一步檢查每台伺服器的日期和時間是否同步:

$ ansible multi -a "date"

大多數應用程式允許一定程度的時間偏差,但最好保持所有伺服器的時間一致,可以使用網路時間協定 (NTP) 來進行同步。

取得詳細環境資訊

如果需要取得某台或多台伺服器的詳細環境資訊(Ansible 中稱為「facts」),可以使用以下命令:

$ ansible [host-or-group] -m setup

這個命令會提供關於伺服器的詳細資訊,包括檔案系統、記憶體、作業系統和網路介面等。

安裝 chrony 時間同步服務

為了保持時間同步,可以使用 chrony 時間同步服務。而不是在每台伺服器上手動執行安裝命令,玄貓推薦使用 Ansible 的 dnf 模組來進行安裝:

$ ansible multi -b -m dnf -a "name=chrony state=present"

這樣可以確保 chrony 在所有指定的伺服器上都被正確安裝。

內容解密:

  • ansible multi -b -m dnf -a "name=chrony state=present":這個命令使用 Ansible 的 dnf 模組在多個目標主機上安裝 chrony 工具。

    • -b:表示以 sudo 模式執行命令。
    • -m dnf:指定要使用的模組是 dnf。
    • -a "name=chrony state=present":模組引數,表示要確保 chrony 工具存在於目標主機上。
  • export ANSIBLE_INVENTORY=hosts.ini:這個命令設定了 ANSIBLE_INVENTORY 環境變數,指定 Ansible 底下要用哪個 hosts 檔案。

    • export:將變數設定為環境變數。
    • ANSIBLE_INVENTORY:環境變數名稱。
    • hosts.ini:指定的 hosts 檔案名稱。
  • export ANSIBLE_HOST_KEY_CHECKING=False:這個命令設定了 ANSIBLE_HOST_KEY_CHECKING 環境變數,禁止 SSH 主機金鑰驗證。

    • export:將變數設定為環境變數。
    • ANSIBLE_HOST_KEY_CHECKING:環境變數名稱。
    • False:設定為不進行主機金鑰驗證。
  • $ ansible multi -a "hostname" -f 1:這個命令在多個目標主機上依序執行 hostname 指令。

    • ansible multi:指定目標主機群組為 multi。
    • -a "hostname":指定要執行的命令為 hostname。
    • -f 1:指定平行執行的最大執行緒數為 1。
  • $ ansible [host-or-group] -m setup:這個命令會將目標主機群組中的所有主機詳細資料列出。

    • -m setup:指定模組名稱為 setup ,用以收集目標主機系統資料。