Ansible 對於現代 IT 基礎設施管理至關重要,尤其在多伺服器環境中,它能有效簡化複雜的組態和維護工作。本文除了基本的時間同步設定、應用程式和資料函式庫伺服器組態外,更探討了 Ansible 的一些進階用法,例如何使用 --limit 引數限定操作目標、如何管理使用者和群組、如何使用不同的套件管理模組,以及如何有效地管理檔案和目錄。這些技巧能幫助工程師更精準地控制 Ansible 的行為,提升自動化效率。此外,文章也示範瞭如何利用 Ansible 進行背景操作,這對於需要長時間執行的任務非常實用,並搭配 async_status 模組查詢任務狀態,讓管理者能掌握任務進度。最後,文章也提及了 Ansible 在日誌檔案檢查方面的應用,這對於故障排除和問題診斷至關重要,並簡要介紹了其他實用的 Ansible 模組,例如 lineinfile、ini_file 和 unarchive,鼓勵讀者進一步探索 Ansible 的更多功能。
其他注意事項
在實際應用中,玄貓建議根據具體需求調整平行數量和其他引數。同時,確保所有伺服器的時間一致是維持系統穩定性的重要因素之一。
使用 Ansible 管理多伺服器環境
在現代的 IT 環境中,管理多台伺服器是一項常見且必要的任務。Ansible 是一個強大的自動化工具,能夠幫助我們高效地管理和組態多台伺服器。這篇文章將介紹如何使用 Ansible 來管理多台伺服器,包括時間同步、應用程式伺服器組態以及資料函式庫伺服器的設定。
時間同步
首先,我們需要確保所有伺服器的時間都同步。這對於日誌檢查和應用程式正常執行非常重要。Ansible 提供了 service 模組,可以輕鬆地啟動和啟用 Chrony 時鐘守護程式。
ansible multi -b -m service -a "name=chronyd state=started enabled=yes"
內容解密:
ansible multi:這裡的multi是一個清單,包含了所有需要組態的伺服器。-b:這個選項等同於--become,意思是以 root 身份執行命令(類別似於sudo)。-m service:使用 Ansible 的service模組來管理服務。-a "name=chronyd state=started enabled=yes":指定要管理的服務名稱為chronyd,並且要啟動(started)並設定為開機啟動(enabled)。
執行上述命令後,所有伺服器應該都會顯示成功訊息,顯示 Chrony 守護程式已經啟動並設定為開機啟動。
檢查時間同步狀態
接下來,我們需要檢查所有伺服器是否已經成功同步時間。
ansible multi -b -a "chronyc tracking"
內容解密:
ansible multi -b:以 root 身份在multi清單中的所有伺服器上執行命令。-a "chronyc tracking":使用chronyc tracking命令來檢查時間同步狀態。
組態應用程式伺服器
我們的假設性 Web 應用程式使用 Django 作為後端框架,因此需要確保 Django 和其相依套件已經安裝。Django 不在官方 Rocky Linux 的 DNF 儲存函式庫中,但我們可以使用 Pip 來安裝它。
ansible app -b -m dnf -a "name=python3-pip state=present"
ansible app -b -m pip -a "executable=pip3 name=django<4 state=present"
內容解密:
ansible app:這裡的app是一個清單,包含了所有應用程式伺服器。-b -m dnf:以 root 身份使用 Ansible 的dnf模組來管理套件。-a "name=python3-pip state=present":確保python3-pip已經安裝。-m pip -a "executable=pip3 name=django<4 state=present":使用 Pip 安裝 Django。
檢查 Django 安裝狀態
確保 Django 已經安裝並正常執行。
ansible app -a "python3 -m django --version"
內容解密:
ansible app:在app清單中的所有應用程式伺服器上執行命令。-a "python3 -m django --version":使用 Python 命令檢查 Django 的版本。
組態資料函式庫伺服器
接下來,我們需要組態資料函式庫伺服器。這裡我們使用 MariaDB 作為資料函式庫系統。
ansible db -b -m dnf -a "name=mariadb-server state=present"
ansible db -b -m service -a "name=mariadb state=started enabled=yes"
內容解密:
ansible db:這裡的db是一個清單,包含了所有資料函式庫伺服器。-b -m dnf:以 root 身份使用 Ansible 的dnf模組來管理套件。-a "name=mariadb-server state=present":確保 MariaDB 資料函式庫伺服器已經安裝。-m service -a "name=mariadb state=started enabled=yes":啟動並設定 MariaDB 資料函式庫為開機啟動。
組態防火牆
接下來,我們需要組態防火牆,以確保只有應用程式伺服器可以存取資料函式庫。
ansible db -b -m dnf -a "name=firewalld state=present"
ansible db -b -m service -a "name=firewalld state=started enabled=yes"
ansible db -b -m firewalld -a "zone=database state=present permanent=yes"
ansible db -b -m firewalld -a "source=192.168.60.0/24 zone=database state=enabled permanent=yes"
ansible db -b -m firewalld -a "port=3306/tcp zone=database state=enabled permanent=yes"
內容解密:
ansible db:在db清單中的所有資料函式庫伺服器上執行命令。-b:以 root 身份執行命令。-m dnf、service、firewalld:分別使用 Ansible 的 DNF、Service 和 Firewall 模組來管理套件、服務和防火牆規則。- 各個
-a ... permanent=true陳述式都用來確保防火牆規則在重啟後仍然生效。
安裝 PyMySQL 模組
Ansible 的 MySQL 模組需要 PyMySQL 模組來與 MariaDB 溝通。因此,我們需要先安裝 PyMySQL。
ansible db -b -m dnf -a "name=python3-PyMySQL state=present"
內容解密:
ansible db:在db清單中的所有資料函式庫伺服器上執行命令。-b: 以 root 身份執行命令。-m dnf: 使用 Ansible 的 DNF 模組來管理套件。-a "name=python3-PyMySQL state=present": 安裝 Python 的 PyMySQL 模組。
組態 MySQL 帳戶
最後,我們需要為 Django 應用程式組態一個 MySQL 帳戶。這裡我們建立了一個名為 django 的使用者,並設定相關許可權。
ansible db -b -m mysql_user \
-a "name=django host=% password=<YOUR_PASSWORD> priv='*.*:ALL' state=present"
內容解密:
ansible db: 在「db」清單中的所有資料函式庫伺服器上執行命令。-b: 以 root 身份執行命令。-m mysql_user: 使用 Ansible 的 MySQL User 模組建立和管理 MySQL 帳戶。"name=django host=% password=<YOUR_PASSWORD> priv='*.*:ALL' state"": present: 建立名為「django」的 MySQL 帳戶並設定相關許可權,「<YOUR_PASSWORD>」需更換為實際密碼。
Ansible 實戰:管理與維護伺服器
在現代資料中心和雲端環境中,伺服器管理是一項關鍵任務。Ansible 作為一個強大的自動化工具,能夠幫助我們有效地管理和維護伺服器。以下,玄貓將詳細介紹如何使用 Ansible 的各種功能來管理伺服器的組態、使用者、套件以及檔案。
使用 Ansible 確認與重啟服務
在使用 Ansible 進行伺服器管理時,常見的操作包括檢查服務狀態並進行重啟。假設你的應用伺服器中有時鐘同步問題,你可以使用以下指令來檢查 chronyd 服務的狀態:
$ ansible app -b -a "systemctl status chronyd"
如果發現 chronyd 服務已停止,你可以限定在特定主機上重啟該服務:
$ ansible app -b -a "service chronyd restart" --limit "192.168.60.4"
這裡使用了 --limit 引數來限定命令僅在特定主機上執行。這個引數可以比對精確的字串或正規表示式(以 ~ 為字首)。如果你想要更簡單的表達方式,可以使用萬用字元或正規表示式:
# 使用萬用字元限定主機
$ ansible app -b -a "service chronyd restart" --limit "*.4"
# 使用正規表示式限定主機
$ ansible app -b -a "service chronyd restart" --limit ~".*\.4"
在實際應用中,你可能會使用主機名稱而不是 IP 地址。能夠比對正規表示式對於這些情況非常有幫助。
使用者與群組管理
使用者和群組管理是 Ansible 日常操作中最常見的任務之一。Ansible 的 user 和 group 模組使這些操作變得簡單且標準化。以下是一些常見的操作:
-
新增群組: 在應用伺服器上新增一個名為
admin的群組:$ ansible app -b -m group -a "name=admin state=present" -
新增使用者: 在應用伺服器上新增一個名為
johndoe的使用者,並將其加入admin群組,同時建立家目錄:$ ansible app -b -m user -a "name=johndoe group=admin createhome=yes" -
刪除使用者: 如果需要刪除某個使用者,可以使用以下命令:
$ ansible app -b -m user -a "name=johndoe state=absent remove=yes"
套件管理
Ansible 提供了多種套件管理模組,適用於不同的 Linux 發行版。例如,你可以使用 package 模組來安裝 git 套件:
$ ansible app -b -m package -a "name=git state=present"
這個模組與 dnf、apt 和其他包管理模組的操作方式相似。後續章節將探討如何處理多平台套件管理,其中包名在不同作業系統之間可能會有所不同。
檔案與目錄管理
Ansible 的檔案和目錄管理功能使得遠端檔案的操作變得簡單。以下是一些常見的操作:
-
取得檔案資訊: 檢查遠端檔案的許可權、MD5 值或擁有者資訊:
$ ansible multi -m stat -a "path=/etc/environment" -
複製檔案到伺服器: 使用
copy模組將本地檔案複製到遠端伺服器:$ ansible multi -m copy -a "src=/etc/hosts dest=/tmp/hosts" -
從伺服器取得檔案: 使用
fetch模組從遠端伺服器取得檔案到本地目錄:$ ansible multi -b -m fetch -a "src=/etc/hosts dest=/tmp"
此圖示展示了 Ansible 的基本工作流程:
graph TD;
A[本地控制機] --> B[編寫 Ansible Playbook];
B --> C[連線遠端伺服器];
C --> D[執行命令];
D --> E[更新伺服器狀態];
內容解密:
- 本地控制機:這是執行 Ansible 的主機。
- 編寫 Ansible Playbook:這是包含所有 Ansible 命令和任務的指令碼。
- 連線遠端伺服器:Ansible 透過 SSH 或其他協定連線到遠端伺服器。
- 執行命令:根據 Playbook 中的指令,Ansible 在遠端伺服器上執行相應的命令。
- 更新伺服器狀態:遠端伺服器根據命令更新其狀態。
管理遠端伺服器檔案:Ansible 的實戰技巧
Ansible 是一個強大的自動化工具,能夠有效地管理遠端伺服器上的檔案。透過 Ansible,你可以輕鬆地複製檔案、建立目錄、刪除檔案以及檢查日誌檔案。以下是一些實戰技巧,幫助你更好地使用 Ansible 來管理遠端伺服器的檔案。
檔案複製與檔案管理
Ansible 提供了多種模組來管理遠端伺服器上的檔案。其中,copy 模組是最常用的一個,用於將本地檔案複製到遠端伺服器。
使用 copy 模組
以下是使用 copy 模組將本地檔案複製到遠端伺服器的命令:
$ ansible multi -m copy -a "src=/path/to/local/file dest=/path/to/remote/file"
這個命令會將本地的 /path/to/local/file 檔案複製到遠端伺服器的 /path/to/remote/file。
使用 fetch 模組
如果你需要從遠端伺服器下載檔案到本地,可以使用 fetch 模組:
$ ansible multi -m fetch -a "src=/path/to/remote/file dest=/path/to/local/dir"
這個命令會將遠端伺服器的 /path/to/remote/file 檔案下載到本地的 /path/to/local/dir 目錄中。
內容解密:
- src:指定要下載的遠端檔案路徑。
- dest:指定下載後儲存的本地目錄路徑。這裡的目錄必須存在,且必須以斜槓結尾。
- flat=yes:如果設定了這個引數,Ansible 會直接將檔案下載到指定的目錄中,而不是儲存在子目錄中。這樣做的好處是可以簡化檔案管理,但缺點是檔名必須唯一,否則會覆寫掉已存在的同名檔案。
建立目錄與檔案
Ansible 的 file 模組可以用來建立目錄、管理許可權和擁有者、修改 SELinux 屬性以及建立符號連結。
建立目錄
以下是使用 file 模組建立目錄的命令:
$ ansible multi -m file -a "dest=/tmp/test mode=644 state=directory"
這個命令會在 /tmp/test 路徑下建立一個新的目錄,並設定其許可權為 644。
建立符號連結
如果你需要建立符號連結,可以使用以下命令:
$ ansible multi -m file -a "src=/src/file dest=/dest/symlink state=link"
這個命令會在 /dest/symlink 路徑下建立一個符號連結,指向 /src/file。
內容解密:
- dest:指定符號連結的路徑。
- src:指定符號連結所指向的實際檔案路徑。
- state=link:指定要建立的是一個符號連結。
刪除目錄與檔案
如果你需要刪除遠端伺服器上的目錄或檔案,可以使用 file 模組並設定 state 為 absent。
$ ansible multi -m file -a "dest=/tmp/test state=absent"
這個命令會刪除 /tmp/test 路徑下的所有內容。
背景執行操作
有些操作可能需要較長時間才能完成,例如系統更新或大型資料轉移。這時候,你可以讓 Ansible 在背景執行這些操作。
強制背景執行
以下是如何讓 Ansible 在背景執行系統更新操作:
$ ansible multi -b -B 3600 -P 0 -a "dnf -y update"
這個命令會在所有伺服器上同時啟動系統更新操作,並且不等待每個操作完成即離開。
內容解密:
- -B
:指定最大執行時間(以秒為單位)。 - -P
:指定每次輪詢間隔時間(以秒為單位)。設為 0表示不等待任何輪詢。 - -b:表示以 sudo 模式執行命令。
- dnf -y update:實際執行的系統更新命令。
查詢背景任務狀態
當你在背景執行任務時,可以使用 async_status 模組來查詢任務狀態:
$ ansible multi -b -m async_status -a "jid=169825235950.3572"
這個命令會顯示指定任務 ID 的狀態資訊。
檢查日誌檔案
在排查應用程式錯誤或診斷故障時,檢查日誌檔案是非常重要的。Ansible 支援常見的日誌操作命令,如 tail, cat, 和 grep。
檢視日誌最後幾行
以下是如何檢視每台伺服器上的 /var/log/messages 日誌最後幾行:
$ ansible multi -b -a "tail /var/log/messages"
這個命令會在每台伺服器上執行 tail /var/log/messages 命令,並顯示結果。
與其他模組結合
除了上述提到的模組外,Ansible 還有許多其他強大的模組可以用來管理檔案。例如:
- lineinfile:用於在特定行插入或更新內容。
- ini_file:用於管理
.ini組態檔案。 - unarchive:用於解壓縮壓縮檔。