返回文章列表

容器化技術應用與Ansible自動化

本文探討容器化技術的應用,包含使用 Docker 建立 Hello App 映像檔,並將其佈署至 Kubernetes 叢集。同時,文章詳細介紹了 Ansible 的核心概念、架構、優勢以及與 Kubernetes 的整合,如何實作基礎設施即程式碼(IaC)和自動化佈署,並提供程式碼範例和實務操作,涵蓋

容器化 自動化

容器化技術已成為現代軟體開發和佈署的根本。本文從建構簡單的 Hello App 開始,逐步引導讀者瞭解 Docker 映像檔的建立、容器的執行,以及如何將應用程式佈署到 Kubernetes 叢集。實務操作涵蓋了 Docker 常用指令,例如 buildrunps,並輔以圖表說明容器建構和執行的流程。接著,文章探討 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 的三個主要應用場景

  1. 組態管理:Ansible 能夠確保系統和軟體保持在所需的狀態,協調滾動更新和排程停機時間。
  2. 應用程式佈署:Ansible 可以自動化軟體在測試、預生產和生產環境之間的佈署流程。
  3. 資源調配: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 PlaybookInventory 來定義和管理自動化流程。

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

內容解密:

  1. ansible_connection: winrm 指定使用 WinRM 連線到 Windows 主機。
  2. ansible_winrm_transport: basic 設定使用基本驗證方式。
  3. ansible_useransible_password 分別指定用於連線的使用者名稱和密碼。
  4. 在使用證書驗證時,需指定公開金鑰和私鑰的路徑。

Ansible 安裝

Ansible 只需要在控制節點上安裝。有兩種主要的 Ansible 安裝包:ansible-coreansibleansible-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

內容解密:

  1. yum install ansibleapt-get install ansible 分別用於在根據 RPM 和 DEB 的 Linux 發行版上安裝 Ansible。
  2. pip install ansible 使用 Python 的包管理工具 pip 安裝 Ansible。
  3. 安裝完成後,可以使用 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:以樹狀圖形式顯示主機。