容器化技術已成為現代軟體開發和佈署的根本。本文從建構簡單的 Hello App 開始,逐步引導讀者瞭解 Docker 映像檔的建立、容器的執行,以及如何將應用程式佈署到 Kubernetes 叢集。實務操作涵蓋了 Docker 常用指令,例如 build、run 和 ps,並輔以圖表說明容器建構和執行的流程。接著,文章探討 Ansible 的自動化能力,闡述其在組態管理、應用程式佈署和資源調配方面的應用。從 Ansible 的基本架構、控制節點與目標節點的設定、Inventory 檔案的管理,到 Playbook 的撰寫和執行,文章提供了完整的實務,並輔以程式碼範例,幫助讀者快速上手。此外,文章也涵蓋了 Ansible 與 Kubernetes 的整合,展現其在現代 IT 基礎設施自動化和 DevOps 實踐中的重要性。
建構 Hello App 與容器化技術的應用
在執行容器之前,需要建立二進位映像檔,如圖 1-6 所示。這個過程需要一些時間,但它是完全自動化的。一旦你實踐過後,就會變得簡單明瞭。
容器建構流程
圖表翻譯: 此圖示呈現了容器建構的流程,從 Dockerfile 或 Containerfile 開始,最終建立出映像檔(Image),並透過 build 指令完成建構。
使用終端機中的 docker 指令的 build 引數,可以請求建構容器,並使用 -t 引數指定映像檔名稱為 hello-world-python:
$ docker build -t hello-world-python .
Docker 在背景下載基礎映像檔 Python 並選擇標籤 3。接著,Docker 將 helloworld.py 檔案新增到新容器的檔案系統中,並下載所需的 Python 相依性套件。
最終結果是在你的工作站上建立了一個名為 hello-world-python 的容器。這個容器的大小大約為 1GB。
在 Docker 中執行 Hello App
一旦容器映像檔成功建立,你可以根據需要多次執行它,或將其上傳到容器登入檔(例如 Docker Hub、Quay.io、Google 的 Container Registry 等)。圖 1-7 說明瞭容器執行的流程。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 容器化技術應用與Ansible自動化
package "Kubernetes Cluster" {
package "Control Plane" {
component [API Server] as api
component [Controller Manager] as cm
component [Scheduler] as sched
database [etcd] as etcd
}
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2
note right of api
核心 API 入口
所有操作經由此處
end note
@enduml
圖表翻譯: 此圖示描述了容器執行的過程,從映像檔(Image)開始,建立容器(Container),並透過 run 指令執行。
你可以透過指定埠號對映來執行容器,將本機的 8080 埠號對映到容器的 8080 埠號:
$ docker run -p 8080:8080 hello-world-python
使用 docker 指令的 ps 引數,可以檢查 Docker 執行的狀態:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c66d0efcbd4 hello-world-python "/bin/sh -c 'python …" 1 second ago Up Less than a second 0.0.0.0:8080->8080/tcp keen_wiles
電腦產生的字串 2c66d0efcbd4 代表了你工作站上執行中的容器的 ID。
你可以使用命令列瀏覽器 cURL 驗證執行結果:
$ curl http://localhost:8080
內容解密:
此命令使用 cURL 工具向本機的 8080 埠號傳送 HTTP 請求,以驗證 Hello App 是否正常執行。如果一切正常,你應該會看到預期的輸出結果。
或者,你也可以在瀏覽器的網址列中輸入 localhost:8080,如圖 1-8 所示。
將 Hello App 部屬到 Kubernetes
要將映像檔部屬到 Kubernetes,你需要建立一個名為 hello.yml 的 manifest 檔案。Manifest 檔案採用 YAML 程式碼撰寫,人類很容易理解。如清單 1-5 所示。
# hello.yml
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- name: hello-container01
image: hello-world-python:latest
ports:
- containerPort: 8080
內容解密:
此 YAML 檔案定義了一個 Kubernetes Pod,包含一個名為 hello-container01 的容器,使用 hello-world-python:latest 映像檔,並將容器的 8080 埠號暴露出來。
建立 hello.yml manifest 檔案後,你可以將 Hello App 部屬到 Kubernetes 群集。群集會自動擷取映像檔並開始執行,等待新的連線:
$ kubectl create -f hello.yml
pod/hello-container01 created
你可以使用以下指令驗證 Kubernetes 群集是否成功初始化所有 Hello App 資源:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-python 1/1 Running 1 11h
重點摘錄:
本章節介紹瞭如何建構 Hello App、使用 Docker 建立容器映像檔、以及將映像檔部屬到 Kubernetes 群集。這些步驟展示了現代 IT 基礎設施和容器化技術的應用。Kubernetes 平台能夠精確高效地協調容器叢集,結合 Ansible 可以實作強大的自動化和自我修復基礎設施。
重點回顧
- IT基礎設施對於業務使命至關重要,需要提供最佳服務給利害關係人。
- Kubernetes平台能夠精確且高效地協調容器叢集。
- 結合Ansible與Kubernetes可以實作強大的自動化與自我修復基礎設施,支援DevSecOps與Infrastructure as Code等實踐。
Ansible 語言程式碼
Ansible是一種IT自動化工具,能夠實作Infrastructure as Code(IaC)。Michael DeHaan啟動了Ansible專案,第一個版本於2012年2月20日發布。Ansible具有模組化架構和無代理(agentless)方法等獨特屬性,在開源世界中迅速獲得關注。
為什麼選擇Ansible?
Ansible被歸類別為基礎設施自動化工具,能夠快速自動化系統管理員任務。Infrastructure as Code透過機器可讀的定義檔案來管理和提供電腦資料中心,而不是物理硬體組態或互動式組態工具。使用Ansible,可以在本地和知名的公有雲端服務提供商上佈署Infrastructure as Code。
Ansible用於在全球組織中應用DevOps原則。DevOps是一種結合軟體開發(Dev)和IT營運(Ops)的實踐。DevOps是一種跨功能的工作模式,從業者使用不同的工具,稱為“工具鏈”,而不是單一工具。這些工具鏈適用於開發和交付過程的關鍵方面。
使用Ansible的好處
使用Ansible有六大好處:
- 簡單:程式碼採用YAML語言,一種人類可讀的資料序列化語言,易於學習和理解。
- 無代理:不需要在被管理的節點上安裝代理程式。
- 跨平台:支援多種作業系統和雲端平台。
- 可擴充套件:能夠管理大量的節點和複雜的環境。
- 安全:提供多種安全功能,如加密和存取控制。
- 社群支援:擁有活躍的社群和豐富的資源。
總之,Ansible是一種強大的IT自動化工具,能夠簡化系統管理任務,提高效率和可靠性。結合Kubernetes,可以實作更強大的自動化和自我修復基礎設施,支援DevSecOps和Infrastructure as Code等實踐。
Ansible 自動化技術深度解析
強大的自動化工具:Ansible 的優勢與應用
Ansible 是一種強大且經過戰鬥測試的組態管理、流程協調和應用程式佈署工具。它具備跨平台的特性,支援所有主要作業系統,包括實體機、虛擬機器、雲端和網路供應商。由於其無代理(agentless)的架構,Ansible 能夠無縫地與現有工具整合,簡化當前環境的管理。
主要特點
- 跨平台支援:Ansible 支援多種作業系統和環境,包括實體機、虛擬機器、雲端和網路裝置。
- 無代理架構:無需在目標節點上安裝代理程式,降低了管理的複雜度。
- 豐富的模組函式庫:Ansible 提供了超過 750 個模組,涵蓋了從雲端管理到系統組態的廣泛任務。
- 社群驅動:Ansible 擁有活躍的社群,每月下載量超過 25 萬次,平均有 3500 名貢獻者。
Ansible 的三個主要應用場景
- 組態管理:Ansible 能夠確保系統和軟體保持在所需的狀態,協調滾動更新和排程停機時間。
- 應用程式佈署:Ansible 可以自動化軟體在測試、預生產和生產環境之間的佈署流程。
- 資源調配:Ansible 能夠自動化 IT 基礎設施的設定和管理,減少手動操作的需求。
Ansible 開源與商業版本
Ansible 是一個由社群驅動的開源專案,Red Hat 收購 Ansible Inc. 後,將其整合到 Red Hat Ansible Automation Platform 中,提供商業支援和更多企業級功能。
- Red Hat Ansible Automation Platform:提供了一個商業框架,包括 Web 使用者介面、API、命令列介面和 Ansible 集合,能夠更好地管理基礎設施。
- Ansible Tower(現稱為 Ansible Automation Controller):是一個 REST API、Web 服務和根據 Web 的控制檯,使 Ansible 更易於被不同技術水平和技能的 IT 團隊使用。
Ansible 的架構
Ansible 的架構通常涉及兩個或多個主機:一台執行自動化的 Ansible 控制節點 和一台或多台接收操作的 目標節點。
Ansible 控制節點
控制節點負責執行自動化任務,需要完整安裝 Ansible。它使用 Ansible Playbook 和 Inventory 來定義和管理自動化流程。
Ansible Playbook 和 Inventory
- Ansible Playbook 是自動化的藍圖,以 YAML 語言編寫,易於撰寫和閱讀。
- Ansible Inventory 是目標主機的列表,可以使用 INI、YAML 或 JSON 格式定義。
---
- name: example
hosts: all
tasks:
- name: hello
ansible.builtin.debug:
msg: Hello
...
圖表翻譯:
此圖示展示了 Ansible 的基本架構,包括控制節點、目標節點、Playbook 和 Inventory 之間的關係。控制節點使用 Playbook 定義自動化任務,並根據 Inventory 中的主機列表執行這些任務。
UNIX 目標節點組態
Ansible 可以在多種 UNIX 目標節點上執行,包括 Linux 發行版、macOS 和其他 UNIX 系統(如 FreeBSD 和 OpenBSD)。
內容解密:
此段落描述了 Ansible 在不同 UNIX 系統上的組態和使用。由於 Ansible 的無代理架構,它能夠在多種 UNIX 環境中靈活佈署和執行。
Ansible 控制節點與目標節點的架構與安裝
Ansible 控制節點與支援的作業系統
Ansible 控制節點(Control Node)是執行 Ansible 指令的主要節點,可以安裝在多種 UNIX 作業系統上,包括 Linux 發行版、macOS 和 UNIX 系統如 FreeBSD、OpenBSD 等。Ansible 的控制節點負責執行所有的 Ansible 指令,並透過 SSH 或 WinRM 與目標節點進行通訊。
目標節點的支援
UNIX 目標節點
Ansible 支援多種 UNIX 相容的桌面和伺服器系統作為目標節點(Target Node)。在目標節點上,只需要安裝 OpenSSH 和 Python,Ansible 便可透過 SSH 連線並使用本地的 Python 直譯器執行指令。建議使用 SSH 金鑰而非密碼進行驗證,以提高安全性。
Windows 目標節點
對於 Windows 系統,Ansible 支援現代的 Windows 桌面和伺服器版本,包括 Windows 7、8.1、10 和 11,以及 Windows Server 2008 至 2022。Windows 目標節點需要 PowerShell 3.0 或更新版本,以及至少 .NET 4.0。WinRM(Windows Remote Management)監聽器負責接收和執行來自 Ansible 控制節點的指令。Ansible 2.8 之後,對於 Windows 10+ 使用者端和 Windows Server 2019+,也支援實驗性的 SSH 連線。
WinRM 認證方法
對於 Windows 目標節點,Ansible 提供多種 WinRM 認證方法,包括 Basic、Certificate、NTLM、Kerberos 和 CredSSP。這些認證方法支援不同的驗證需求,例如本地帳戶、Active Directory 帳戶、憑證委派和 HTTP 加密。
# 基本驗證範例
ansible_connection: winrm
ansible_winrm_transport: basic
ansible_user: LocalUsername
ansible_password: Password
# 證書驗證範例
ansible_connection: winrm
ansible_winrm_transport: certificate
ansible_winrm_cert_pem: /path/to/certificate/public/key.pem
ansible_winrm_cert_key_pem: /path/to/certificate/private/key.pem
內容解密:
ansible_connection: winrm指定使用 WinRM 連線到 Windows 主機。ansible_winrm_transport: basic設定使用基本驗證方式。ansible_user和ansible_password分別指定用於連線的使用者名稱和密碼。- 在使用證書驗證時,需指定公開金鑰和私鑰的路徑。
Ansible 安裝
Ansible 只需要在控制節點上安裝。有兩種主要的 Ansible 安裝包:ansible-core 和 ansible。ansible-core 包包含基本的 Ansible 語言和執行環境,而 ansible 包則額外包含了大量社群企劃的集合(Collections),提供了更多的模組和外掛。
安裝指令範例
# 在 Red Hat Enterprise Linux、Fedora、CentOS 等系統上安裝 Ansible
yum install ansible
# 在 Debian 和 Ubuntu 系統上安裝 Ansible
apt-get install ansible
# 使用 pip 安裝 Ansible
pip install ansible
內容解密:
yum install ansible和apt-get install ansible分別用於在根據 RPM 和 DEB 的 Linux 發行版上安裝 Ansible。pip install ansible使用 Python 的包管理工具 pip 安裝 Ansible。- 安裝完成後,可以使用
ansible --version命令檢查 Ansible 版本。
Ansible基礎與執行初探
瞭解Ansible版本資訊
執行ansible --version指令時,第一行輸出顯示了Ansible的完整版本資訊。例如:ansible [core 2.13.4]。在Ansible的術語中,完整版本號2.13.4中,2代表主要版本,13代表次要版本,4代表修訂版本。
執行第一個Ansible Ad Hoc指令
每個指令都由ansible命令列工具執行,該工具隨Ansible安裝在系統上。嘗試執行Ansible的ping指令是一個測試控制器與目標節點之間連線的好方法。預期的結果是在螢幕上列印出"ping: pong"的訊息。如果看到這條訊息,代表連線成功,且Ansible程式碼執行正常。當連線不成功時,會在螢幕上顯示錯誤訊息。
預期輸出
$ ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
程式碼解密:
ansible localhost -m ping:這條指令對localhost執行ping模組,測試連線。"changed": false:表示執行該任務沒有改變任何東西。"ping": "pong":表示ping成功,傳回pong。
以Root使用者執行指令
有時需要以root或管理使用者身份執行指令。Ansible整合了適當的許可權提升機制。在命令列中新增額外引數,可以指定連線使用者devops並指示需要使用sudo機制提升至root許可權。
ansible localhost -m ping -u devops --become
程式碼解密:
-u devops:指定連線使用者為devops。--become:表示需要提升許可權,通常是到root使用者。
建立基本Inventory
每次執行都需要目標主機的列表。Ansible需要知道針對哪些節點執行。你可以在命令列中指定目標主機列表或在inventory檔案中定義。預設的Ansible inventory檔案是/etc/ansible/hosts,它是一個簡單的文字檔案,包含主機名稱或IP位址列表,遵循INI格式。
範例Inventory檔案內容
localhost ansible_connection=local
web1.example.com ansible_connection=ssh ansible_user=devops ansible_ssh_private_key_file=~/.ssh/id_rsa
程式碼解密:
localhost ansible_connection=local:指定對localhost使用本地連線。web1.example.com ...:定義了另一台主機,使用SSH連線,並指定了使用者和私鑰檔案。
Ansible語言特性
Ansible是一種宣告式語言,關注的是執行的結果而非達到結果的步驟。程式碼組織成Ansible Playbook,當你想執行多於一個指令時,就像在Ansible Ad Hoc中一樣。
重點特性
- 模組化:Ansible使用模組來完成特定任務。可以將模組視為自動化的Lego藍圖。
- 冪等性:某些模組具有冪等性,即僅在需要時對目標主機執行某些操作,若無需則跳過執行。
Ansible Inventory詳解
Ansible Inventory是受管主機的列表,可以組織成群組或模式來選擇主機或群組。ansible-inventory命令列工具可用於顯示目前的Ansible inventory資訊。
使用範例
ansible-inventory --list
ansible-inventory --graph
程式碼解密:
--list:以列表形式顯示主機。--graph:以樹狀圖形式顯示主機。