Ansible 藉由 SSH 連線管理遠端伺服器,不需在目標伺服器安裝額外軟體,提升佈署效率。相較於早期版本使用 Paramiko 函式庫,Ansible 現已改用 OpenSSH 作為預設連線方式,速度更快且更安全。OpenSSH 的 ControlPersist 功能還能讓 SSH 連線持久化,減少頻繁連線的延遲。Ansible Playbook 以 YAML 格式撰寫,定義一系列任務,讓伺服器自動達到預期狀態。Playbook 中的每個任務都使用 Ansible 模組執行特定操作,例如安裝軟體、複製檔案、啟動服務等。透過 Playbook,我們可以將複雜的佈署流程簡化成易於管理的程式碼,並確保每次佈署的一致性。以下將以 Apache 伺服器佈署為例,示範如何撰寫和執行 Ansible Playbook。
Ansible 自動化技術應用及其實務案例
Ansible 管理 cron 工作
在管理 Linux 系統中,定期任務通常透過 cron 來執行。傳統上,更改 cron 工作設定需要登入伺服器並編輯 crontab 檔案。然而,Ansible 提供了更簡單的方法來管理 cron 工作。
設定定期任務
假設我們希望在每天早上 4 點在所有伺服器上執行一個 shell 指令碼,可以使用以下命令:
$ ansible multi -b -m cron -a "name='daily-cron-all-servers' hour=4 job='/path/to/daily-script.sh'"
這個命令會在每台伺服器的 crontab 中新增一個名為 daily-cron-all-servers 的工作,並在每天早上 4 點執行指定的指令碼。
移除 cron 工作
如果需要移除先前設定的 cron 工作,可以使用以下命令:
$ ansible multi -b -m cron -a "name='daily-cron-all-servers' state=absent"
這樣會從所有伺服器的 crontab 中刪除名為 daily-cron-all-servers 的工作。
自訂 crontab 檔案
Ansible 還支援管理自訂的 crontab 檔案。可以指定位於 /etc/cron.d 的自訂 crontab 檔案來管理工作。例如:
$ ansible multi -b -m cron -a "name='custom-cron' hour=4 job='/path/to/custom-script.sh' cron_file=/etc/cron.d/custom-cron"
這樣會在 /etc/cron.d/custom-cron 檔案中新增一個名為 custom-cron 的工作。
內容解密:
- name:指定 cron 工作的名稱,便於識別和管理。
- hour:指定工作執行的小時。
- job:指定要執行的命令或指令碼路徑。
- state:用於指定狀態,
absent表示移除工作。 - cron_file:指定自訂 crontab 檔案的位置。
Ansible 會在 crontab 檔案中新增一行註解來標記是由 Ansible 管理的,例如 #Ansible: daily-cron-all-servers。這樣可以避免手動修改 crontab 檔案時意外刪除 Ansible 管理的工作。
自動化應用佈署
對於簡單的應用佈署,可以使用 Ansible 的 ad-hoc 模式來更新 git 簽出版本或複製新的程式碼到伺服器,然後執行更新指令碼。例如,假設我們有一個簡單的應用執行在 /opt/myapp 目錄中,這個目錄是從中央伺服器或 GitHub 上克隆的一個 git 儲存函式庫。
更新 git 簽出版本
首先,更新 git 簽出版本到新的分支或標籤:
$ ansible app -b -m git -a "repo=git://example.com/path/to/repo.git dest=/opt/myapp update=yes version=1.2.4"
這個命令會將 /opt/myapp 的 git 儲存函式庫更新到標籤 1.2.4。
執行更新指令碼
然後,執行應用的更新指令碼:
$ ansible app -b -a "/opt/myapp/scripts/update.sh"
這樣就完成了應用的更新佈署。
內容解密:
- repo:指定 git 儲存函式庫的 URL。
- dest:指定 git 儲存函式庫簽出到的目標目錄。
- update:指定是否強制更新儲存函式庫。
- version:指定要簽出的分支、標籤或提交雜湊值。
- ad-hoc 模式:適合簡單佈署情況,但對於複雜佈署需求應該使用 Ansible playbook 和滾動更新功能。
如果在執行過程中遇到錯誤,例如缺少 git 執行檔或 Git Server 有未知主機鍵問題,可以分別透過安裝 git 或新增 accept_hostkey=yes 選項來解決。
Ansible 的 SSH 連線歷史
Ansible 的核心功能之一是透過標準且安全的 SSH 連線來管理伺服器,而不需要在被管理伺服器上執行額外的應用程式或守護程式。這使得 Ansible 在效能和安全性方面都有很大優勢。
paramiko
早期 Ansible 僅使用 paramiko 做為 SSH 實作。然而,由於 paramiko 是專門為 Python 語言設計的單一函式庫,其開發速度無法跟上 OpenSSH 的更新步伐。因此,在某些情況下可能會有效能和安全性問題。
OpenSSH (預設)
從 Ansible 1.3 引入 OpenSSH 作為預設 SSH 連線方式。OpenSSH 比 paramiko 快且可靠。此外,OpenSSH 支援 ControlPersist 功能,可以讓 SSH 連線持久化以減少頻繁連線所需的初始握手時間。
加速 OpenSSH
現代版本的 Ansible 支援多種方式來加速 SSH 連線。例如,使用管道模式(pipelining)可以顯著提高效能。這些技術確保了 Ansible 的 SSH 連線既快速又安全。
快速且穩定的 SSH 是成功之鑰
無論是透過 paramiko 或 OpenSSH 與伺服器進行通訊,Ansible 均依賴於快速且穩定的 SSH 連線。只有這樣才能確保命令和檔案在伺服器之間成功傳輸和執行。
Ansible Playbook 基本使用與最佳化
Ansible 是一種強大的自動化工具,能夠幫助我們管理和組態多台伺服器。在這篇文章中,我們將探討 Ansible 的 Playbook 功能,並學習如何將傳統的 Shell 指令轉換為 Ansible Playbook,從而提升自動化流程的效率和可靠性。
什麼是 Ansible Playbook?
Playbook 是 Ansible 的核心概念之一,它類別似於劇本(script),列出了一系列任務(plays),這些任務會依序執行以達到特定的伺服器組態狀態。Playbook 使用 YAML 語法編寫,這是一種簡單且易讀的格式。
基本的 Ansible Playbook 範例
假設我們有一個簡單的 Shell 指令,用來在 RHEL/CentOS 伺服器上安裝 Apache 並組態其相關檔案:
# 安裝 Apache
yum install --quiet -y httpd httpd-devel
# 複製組態檔案
cp httpd.conf /etc/httpd/conf/httpd.conf
cp httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
# 啟動 Apache 並設定開機自動啟動
service httpd start
chkconfig httpd on
我們可以將這些指令轉換為 Ansible Playbook:
---
- hosts: all
tasks:
- name: 安裝 Apache
command: yum install --quiet -y httpd httpd-devel
- name: 複製組態檔案
command: >
cp httpd.conf /etc/httpd/conf/httpd.conf
command: >
cp httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
- name: 啟動 Apache 並設定開機自動啟動
command: service httpd start
command: chkconfig httpd on
這個 Playbook 與原先的 Shell 指令功能相同,但在執行時會提供更好的可讀性和管理性。
內容解密:
在這個範例中,我們使用了 command 模組來執行原始的 Shell 指令。每個任務都有一個 name 屬性,這樣在執行 Playbook 時會有更友好的輸出。command 模組還有一些其他特性(例如:idempotence),但目前我們只需要知道它可以直接轉換 Shell 指令即可。
最佳化 Playbook:使用內建模組
雖然上面的範例能夠正常運作,但我們可以進一步最佳化它來利用 Ansible 的內建模組。這些模組不僅能提升效率,還能確保任務的冪等性(idempotence)。
---
- hosts: all
become: yes
tasks:
- name: 安裝 Apache
yum:
name:
- httpd
- httpd-devel
state: present
- name: 複製組態檔案
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: '0644'
with_items:
- { src: 'httpd.conf', dest: '/etc/httpd/conf/httpd.conf' }
- { src: 'httpd-vhosts.conf', dest: '/etc/httpd/conf/httpd-vhosts.conf' }
- name: 啟動 Apache 並設定開機自動啟動
service:
name: httpd
state: started
enabled: yes
內容解密:
在這個最佳化版本中,我們使用了 yum、copy 和 service 模組來取代原本的 command 模組。這些模組不僅簡化了指令的編寫,還確保了每次執行時都會檢查目標狀態,從而避免重複操作(冪等性)。
yum模組用來管理套件安裝,確保指定的套件存在且為最新版本。copy模組用來複製檔案,並且可以設定所有權和許可權。service模組用來管理服務狀態,確保服務在啟動後會自動設定為開機啟動。
YAML 語法最佳實踐
在編寫 Playbook 的過程中,YAML 語法的正確使用非常重要。以下是一些最佳實踐:
- 縮排一致:YAML 對縮排非常敏感,請確保每個層級的縮排一致。
- 使用引號:對於包含特殊字元或空格的字串,應該使用引號包裹。
- 長字串處理:對於長字串或多行字串,可以使用
>或|處理。
擴充套件與進階應用
Ansible 的 Playbook 不僅可以簡單地轉換 Shell 指令,還可以利用其豐富的模組和特性來實作更複雜的自動化流程。例如:
- 變數管理:透過
vars或外部變數檔案來管理不同環境中的引數。 - 條件判斷:使用
when指令來根據條件執行不同的任務。 - 迴圈處理:使用
with_items或其他迴圈語法來處理多個元素。
使用 Ansible 自動化 Apache 伺服器佈署
在現代的 DevOps 環境中,自動化工具已成為必不可少的工具,能夠大幅提升佈署效率與穩定性。其中,Ansible 是一個非常受歡迎的自動化工具,因為它簡單易用且功能強大。今天,玄貓將帶你深入瞭解如何使用 Ansible 自動化佈署 Apache 伺服器。
Ansible Playbook 基本介紹
Ansible Playbook 是一個 YAML 格式的檔案,用於定義要執行的任務。以下是一個簡單的 Ansible Playbook 範例,用於在所有伺服器上安裝並啟動 Apache:
---
- hosts: all
become: yes
tasks:
- name: 安裝 Apache
yum:
name: httpd
state: present
- name: 複製組態檔案到伺服器
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
with_items:
- src: httpd.conf
dest: /etc/httpd/conf/httpd.conf
- src: httpd-vhosts.conf
dest: /etc/httpd/conf/httpd-vhosts.conf
- name: 確保 Apache 啟動並且開機自動啟動
service:
name: httpd
state: started
enabled: yes
內容解密:
-
YAML 語法標記:第一行
---表示這個檔案使用 YAML 語法。這就像在 HTML 或 PHP 中使用<html>或<?php一樣,標記了檔案的開始。 -
Play 定義:第二行
- hosts: all定義了一個 Play,並告訴 Ansible 將這個 Play 做用在所有已知的主機上。 -
sudo 模式:第三行
become: yes告訴 Ansible 所有命令都要透過 sudo 執行,以 root 身份執行。 -
任務列表:第四行
tasks:告訴 Ansible 接下來的是一個任務列表,這些任務將作為這個 Play 的一部分執行。 -
第一個任務:安裝 Apache:使用
yum模組來安裝 Apache。name屬性提供了一個人類可讀的描述,而state: present告訴 yum 模組確保 Apache 已經安裝。 -
第二個任務:複製組態檔案:使用
copy模組將本地組態檔案複製到伺服器上。with_items用於遍歷一個專案列表,每個專案都會被作為變數傳入。 -
第三個任務:啟動並啟用 Apache:使用
service模組來確保 Apache 在開機時啟動並立即啟動。
玄貓如何使用 Mermaid 搭配圖示解說
下面這張圖示說明瞭這些步驟之間的邏輯關係:
graph TD;
A[開始] --> B[定義 Play];
B --> C[設定 sudo 模式];
C --> D[列出任務];
D --> E[安裝 Apache];
D --> F[複製組態檔案];
D --> G[啟動並啟用 Apache];
E --> H[確認 Apache 安裝];
F --> I[確認組態檔案已複製];
G --> J[確認 Apache 啟動];
J --> K[結束];
此圖示展示了 Ansible Playbook 的基本邏輯流程。從開始到結束,每一步都有其明確的目的和作用。
自動化佈署的優勢
- 一致性:無論是佈署一台還是上千台伺服器,所有組態都會保持一致。
- 效率:自動化可以大幅減少手動操作所需的時間和精力。
- 可重複性:只要修改 Playbook,就可以立即應用到所有伺服器上。
- 監控與維護:Ansible 能夠持續監控伺服器狀態,並告知任何變更。
限制與範圍控制
你可以透過修改 hosts: 屬性來限制 Playbook 的執行範圍。例如:
- hosts: webservers
或者在命令列中使用 --limit 處理:
ansible-playbook playbook.yml --limit webservers
這樣只會在 webservers 群組中的主機上執行 Playbook。你也可以使用 --list-hosts 處理來預覽會受影響的主機:
ansible-playbook playbook.yml --list-hosts
未來趨勢與改進建議
隨著技術的進步,Ansible 的功能也在不斷擴充套件。未來可能會看到更多整合和自動化選項,例如與 Kubernetes、Docker 等容器技術的更深度整合。對於現有的佈署流程,可以考慮引入更多的測試和驗證步驟,以確保每次佈署都能平穩進行。