目錄
3.1基本 Shell 指令
3.2變數和資料類型
3.3條件語句
3.4循環
在 DevOps 領域,自動化是管理複雜系統、簡化工作流程和加快開發週期的關鍵。 Shell 腳本是一種多功能且功能強大的工具,可讓 DevOps 工程師自動執行日常任務,減少手動工作並確保跨流程的可靠性。在本指南中,我們將透過 shell 腳本介紹 DevOps 自動化的基礎知識,探索各種用例、技術和最佳實踐。
Shell 腳本廣泛用於自動化,因為:
它們是輕量級的,並且可以在幾乎任何具有 shell 的系統上快速執行(例如 Linux 上的 Bash)。
它們可以與 DevOps 中的其他自動化工具集成,例如 Jenkins、Ansible 和 Kubernetes。
與較繁重的程式語言相比,Shell 腳本通常可以更快地實現簡單的自動化任務。
在深入研究特定用例之前,我們先回顧一下對於任何 DevOps 自動化專案都至關重要的 shell 腳本編寫基礎知識。
您應該熟悉的一些基本 shell 命令包括:
echo
:將文字列印到終端。
cat
、 tail
、 head
:處理文件內容。
grep
:搜尋檔案中的模式。
awk
、 sed
:用於文字處理。
curl
、 wget
:從網路取得資料。
例子:
echo "Hello, DevOps!"
cat /etc/passwd | grep "user_name"
Shell 腳本具有基本的變數支援。宣告變數如下:
NAME="DevOpsEngineer"
echo "Hello, $NAME"
建立變數時沒有明確類型,但您可以使用declare
來指定特定類型(例如-i
表示整數)。
使用export
使變數可供子流程存取。
使用if
、 elif
和else
建立條件語句。
if [ $USER == "devops" ]; then
echo "Welcome, DevOps Engineer!"
else
echo "Access denied."
fi
==
和!=
用於字串比較。
-eq
、 -ne
、 -gt
、 -lt
等用於整數比較。
循環對於自動化重複任務至關重要。
for
迴圈: for i in {1..5}; do
echo "Number $i"
done
while
循環: count=1
while [ $count -le 5 ]; do
echo "Count $count"
((count++))
done
確保您有合適的環境:
Shell :通常是 Linux 上的 Bash ( /bin/bash
)。
文字編輯器:使用 Vim、Nano 或任何首選編輯器來編寫腳本。
權限:使用chmod +x script.sh
授予腳本可執行權限。
現在,讓我們回顧一下可以使用 shell 腳本自動化的特定 DevOps 任務。
可以自動監控 CPU、記憶體和磁碟使用等系統資源,以便在資源超過閾值時向 DevOps 團隊發出警報。
CPU 使用率監控範例腳本:
#!/bin/bash
THRESHOLD=80
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if (( $(echo "$cpu_usage > $THRESHOLD" |bc -l) )); then
echo "CPU usage is above $THRESHOLD%. Current usage: $cpu_usage%" | mail -s "CPU Alert" [email protected]
fi
Shell 腳本可以透過提取最新程式碼、建置並將其部署到伺服器來簡化部署。
部署腳本範例:
#!/bin/bash
echo "Starting deployment..."
git pull origin main
docker build -t myapp:latest .
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp -p 80:80 myapp:latest
echo "Deployment completed."
定期備份資料至關重要。 Shell 腳本可以自動執行備份任務並儲存在安全位置。
MySQL資料庫備份範例:
#!/bin/bash
DATE=$(date +%F)
DB_BACKUP_PATH='/backup/dbbackup'
DB_USER='root'
DB_PASS='password'
DB_NAME='mydb'
mkdir -p ${DB_BACKUP_PATH}/${DATE}
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${DB_BACKUP_PATH}/${DATE}/${DB_NAME}.sql
echo "Backup completed for database ${DB_NAME}."
日誌檔案會隨著時間的推移而變大。 Shell 腳本可以歸檔、輪換或刪除舊日誌以節省空間。
歸檔日誌範例:
#!/bin/bash
LOG_DIR="/var/log/myapp/"
ARCHIVE_DIR="/var/log/myapp/archive/"
find $LOG_DIR -name "*.log" -mtime +30 -exec mv {} $ARCHIVE_DIR \;
gzip $ARCHIVE_DIR/*.log
echo "Log files older than 30 days archived and compressed."
進階 shell 腳本可以使腳本更加強大和適應性更強。這裡有一些技巧:
function backup() {
echo "Performing backup..."
# Backup logic here
}
backup
錯誤處理:在開始時使用set -e
來在錯誤時退出或使用陷阱來優雅地處理錯誤。
解析參數:透過解析命令列參數來提供靈活性。
while getopts u:p: flag
do
case "${flag}" in
u) user=${OPTARG};;
p) pass=${OPTARG};;
esac
done
echo "User: $user"
echo "Password: $pass"
以下最佳實踐將提高腳本的可讀性、可靠性和效能:
使用註釋:為清晰起見,對您的程式碼進行註解。
使用描述性變數名稱:提高可讀性。
使用函數進行模組化:透過使用函數來保持程式碼的組織性。
錯誤處理:透過條件或陷阱處理潛在錯誤。
限制根存取:以所需的最低權限執行腳本。
以下是一些實作專案,可協助您練習並提升 DevOps shell 腳本編寫技能:
自動伺服器設定:編寫一個腳本,在新的 Linux 實例上設定 Web 伺服器(例如 Apache 或 Nginx)。
CI/CD 管道腳本:編寫 shell 腳本來自動執行 CI/CD 管道的步驟(例如,複製、建置和部署)。
使用者存取管理:自動建立使用者、權限設定和存取日誌記錄。
自動執行狀況檢查:建立腳本來檢查關鍵服務的運作狀況,並在服務發生故障時發送警報。
Shell 腳本編寫是任何 DevOps 工程師的基本技能。透過掌握 shell 腳本,您可以自動執行重複性任務、提高效率並確保流程的一致性和可靠性。無論您是管理部署、備份還是監控,shell 腳本都提供了一種快速有效的方法來自動執行關鍵的 DevOps 任務。繼續練習現實世界的專案,以增強您的腳本編寫技能,並不斷探索先進的技術,將您的 DevOps 自動化提升到一個新的水平。
加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!
原文出處:https://dev.to/prodevopsguytech/devops-automation-with-shell-scripting-1p69