Ansible 在現代軟體開發流程中扮演著重要的自動化角色,尤其在容器化技術的應用上,更能展現其強大的效率和靈活性。本文除了介紹 Ansible 角色與集合的概念,更探討瞭如何利用 Ansible 執行環境確保開發和生產環境的一致性。同時,針對不同 Linux 發行版(如 Debian、Red Hat)上的 Docker 安裝,提供了完整的 Playbook 範例,包含了新增軟體源、下載 GPG 金鑰、安裝 Docker 引擎等關鍵步驟,讓讀者可以快速上手,並將 Ansible 應用於實際的容器化佈署和管理工作中。
Ansible 角色與集合:程式碼重用的利器
在 Ansible 中,角色(Role)與集合(Collection)是實作程式碼重用和模組化的重要工具。它們使得使用者能夠更輕鬆地分享和管理 Ansible 程式碼,從而提高自動化任務的效率和可維護性。
建立 Ansible 角色
要建立一個 Ansible 角色,可以使用 ansible-galaxy 命令列工具。以下是一個建立名為 role-example 的角色的範例:
$ ansible-galaxy role init role-example
內容解密:
ansible-galaxy role init是用於建立新角色的基本命令。role-example是角色的名稱,可以根據實際需求進行更改。
執行此命令後,Ansible 將在當前目錄下建立一個名為 role-example 的目錄,其中包含多個子目錄和檔案,如 defaults、files、handlers、meta、tasks、templates、tests 和 vars。
角色目錄結構解析
- defaults:包含預設變數的
main.yml檔案,這些變數可以在使用角色時被覆寫。 - files:存放靜態檔案,這些檔案會被角色任務參照。
- handlers:包含處理程式定義的
main.yml檔案。 - meta:包含角色的元資料,如作者、許可證、支援的平台等。
- tasks:包含任務定義的
main.yml檔案,這是角色的核心。 - templates:存放 Jinja2 範本檔案,這些範本會被角色任務參照。
- tests:可用於測試角色的目錄,可以包含庫存檔案和測試 Playbook。
- vars:包含角色內部變數的
main.yml檔案,這些變數具有較高的優先順序。
內容解密:
每個目錄都有其特定的用途,幫助組織和管理角色中的不同元素。其中,tasks/main.yml 是最關鍵的檔案,它包含了角色的主要任務定義。
在 Playbook 中使用角色
要在 Ansible Playbook 中使用角色,可以透過 roles 陳述式來引入。以下是一個範例:
---
- name: role example
hosts: all
roles:
- role-example
內容解密:
hosts: all指定了該 Playbook 將在所有主機上執行。roles列表中包含了要使用的角色名稱,在此範例中是role-example。
從 Ansible Galaxy 安裝角色
Ansible Galaxy 是 Ansible 資源的公共倉函式庫,提供了大量的現成角色和集合。要從 Ansible Galaxy 安裝角色,可以使用以下命令:
$ ansible-galaxy role install geerlingguy.redis
或者,可以透過建立一個 requirements.yml 檔案來安裝多個角色:
---
roles:
- src: geerlingguy.redis
然後執行:
$ ansible-galaxy role install -r roles/requirements.yml
內容解密:
geerlingguy.redis是要安裝的角色名稱。-r引數指定了包含角色需求的檔案路徑。
Ansible 集合
Ansible 集合是比角色更全面的一種程式碼分發方式,包含了角色、模組和外掛程式。可以使用以下命令安裝集合:
$ ansible-galaxy collection install community.general
或者,也可以使用 requirements.yml 檔案來安裝多個集合:
---
collections:
- name: community.general
source: https://galaxy.ansible.com
然後執行:
$ ansible-galaxy collection install -r collections/requirements.yml
內容解密:
community.general是要安裝的集合名稱。source指定了集合的來源 URL。
Ansible 執行環境
Ansible 執行環境是一種容器化的解決方案,旨在簡化依賴管理和環境一致性問題。它允許開發人員在本地和生產環境中使用相同的容器,從而減少因環境差異導致的問題。
圖表翻譯:
此圖示展示了 Ansible 執行環境的概念:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Ansible自動化容器佈署與管理
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
圖表翻譯:
此圖表說明瞭 Ansible 執行環境如何提供開發和生產環境之間的一致性,透過容器化技術實作。
使用Ansible Builder與Ansible Runner建立與執行Ansible執行環境
在2022年,Ansible引入了ansible-builder與ansible-runner兩個命令列工具,以簡化Ansible執行環境(Ansible Execution Environments, EE)的建立與執行。本文將探討這兩個工具的使用方法及其背後的運作原理。
安裝Ansible Builder與Ansible Runner
首先,您需要安裝ansible-builder和ansible-runner。這兩個工具可以透過Red Hat Ansible Automation訂閱的Ansible工具鏈套件安裝:
$ dnf install ansible-builder ansible-runner
或者,您也可以使用PyPI儲存函式庫中的pip工具進行安裝:
$ pip install ansible-builder ansible-runner
建立自訂的Ansible執行環境
假設您想要建立一個名為my_ee的自訂Ansible執行環境,用於執行Amazon Web Services(AWS)相關的Ansible任務。以下是建立此環境的步驟:
定義執行環境組態
首先,您需要建立一個名為
execution-environment.yml的檔案,用於描述如何構建Ansible執行環境。該檔案的內容如下所示:
version: 1 dependencies: galaxy: requirements.yml python: requirements.txt system: bindep.txt additional_build_steps: prepend: | RUN pip3 install –upgrade pip setuptools append: - RUN ls -al /
#### 內容解密:
- `version`: 指定組態檔案的版本。
- `dependencies`: 定義了三種型別的依賴:Ansible Galaxy集合(galaxy)、Python函式庫(python)和系統依賴(system)。
- `additional_build_steps`: 允許在構建過程中新增額外的步驟。`prepend`部分在構建開始時執行,用於升級`pip`和`setuptools`。`append`部分在構建結束時執行,列出根目錄下的所有檔案。
2. **指定Ansible集合依賴**
在`requirements.yml`檔案中指定所需的Ansible集合:
```yml
---
collections:
- name: community.aws
內容解密:
collections: 列出了所需的Ansible集合。在此例中,我們需要community.aws集合來與AWS互動。
指定Python函式庫依賴
在
requirements.txt檔案中指定所需的Python函式庫:botocore>=1.18.0 boto3>=1.15.0 boto>=2.49.0內容解密:
- 這裡列出了三個Python函式庫及其版本要求,分別是
botocore、boto3和boto,它們對於與AWS互動是必要的。
- 這裡列出了三個Python函式庫及其版本要求,分別是
指定系統依賴
在
bindep.txt檔案中指定所需的系統級依賴:git [platform:rpm] git [platform:dpkg]內容解密:
- 這裡根據不同的包管理系統(RPM或DPKG)指定了所需的
git包。
- 這裡根據不同的包管理系統(RPM或DPKG)指定了所需的
構建Ansible執行環境
使用以下命令構建Ansible執行環境:
$ ansible-builder build -t my_ee -v 3
內容解密:
-t my_ee: 指定了所構建的執行環境的名稱為my_ee。-v 3: 設定了構建過程的詳細程度為級別3,提供較為詳細的輸出。
登入Red Hat容器登入檔(若需要)
如果您使用的是RHEL UBI8基礎映像並具有Red Hat Ansible Automation訂閱,則可能需要登入Red Hat容器登入檔:
$ podman login registry.redhat.io
執行Ansible Playbook
構建完成後,您可以使用ansible-runner命令執行您的Ansible Playbook:
$ ansible-runner run -p ping.yml --inventory inventory --container-image=my_ee .
內容解密:
-p ping.yml: 指定要執行的Ansible Playbook。--inventory inventory: 指定了用於執行Playbook的inventory檔案。--container-image=my_ee: 指定了用於執行的Ansible執行環境映像名稱。.: 表示當前目錄作為基礎路徑。
在容器中使用Ansible
在組織中管理容器可能是一項艱鉅的任務,尤其是當手動執行且涉及重複性任務時。有時,您需要在工作站或伺服器群中執行容器。
Ansible簡化容器工作流程
Ansible可以簡化此工作流程並自動化繁瑣的任務。您還可以建立新的方法,以平台無關的格式分發您的應用程式。此外,一個常見的安全使用案例是以容器形式執行Web伺服器,以確保內容免受任何篡改。
Ansible與容器
Ansible是簡化容器執行旅程的得力助手。在接下來的章節中,您將瞭解如何簡化Docker容器引擎的安裝以及如何在工作站中自動化flatpak和snap。
選擇容器引擎:Docker與Podman
作為容器引擎,Podman在Linux上是首選方式,因為它具有多個優點,尤其是可以無根執行。然而,Mac上的Podman需要額外的機器來執行程式碼,而Windows則需要虛擬化的Windows系統for Linux(WSL)。
在Linux和Windows上安裝Docker
Docker是許多平台的首選容器引擎。您可以透過自動化Docker的安裝開始您的Ansible之旅。這在啟動新的虛擬機器時非常有用。在本文的以下章節中,我們將重點介紹Docker引擎,這是執行容器的關鍵部分。
Docker支援的平台
Docker Desktop支援多個平台,如下表所示:
| 平台 | x86_64 / amd64 | arm64 / aarch64 |
|---|---|---|
| Debian | 是 | |
| Fedora | 是 | |
| Ubuntu | 是 | |
| Binaries | 是 | |
| Windows | 是 | |
| MacOS | 是 | 是 |
本章重點介紹容器引擎,即Docker引擎,只討論Docker執行時,稱為docker-engine,並根據下表支援的平台:
| 平台 | x86_64 / amd64 | arm64 / aarch64 | arm32 | s390x |
|---|---|---|---|---|
| CentOS | 是 | 是 | ||
| Debian | 是 | 是 | 是 | |
| Fedora | 是 | 是 | ||
| Raspbian | 是 | |||
| RHEL (1) | 是 | |||
| SLES (2) | 是 | |||
| Ubuntu | 是 | 是 | 是 | 是 |
| Binaries | 是 | 是 | 是 |
在Debian Linux上安裝Docker
以下步驟適用於所有根據Debian和Ubuntu的Linux發行版。您將使用Ansible自動化以下三個步驟:
- 新增Docker GPG金鑰
- 新增Docker儲存函式庫
- 更新apt快取並安裝Docker
第一步:下載GPG簽名金鑰
使用ansible.builtin.apt_key模組下載儲存函式庫的GPG簽名金鑰。
- name: Add signing key
ansible.builtin.apt_key:
url: "https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg"
state: present
內容解密:
此步驟使用ansible.builtin.apt_key模組下載Docker官方GPG金鑰,以驗證軟體包的真實性。url引數指定GPG金鑰的下載位置,state引數確保金鑰在系統中存在。
第二步:新增Docker儲存函式庫
使用ansible.builtin.apt_repository模組新增Docker儲存函式庫。
- name: Add repository into sources list
ansible.builtin.apt_repository:
repo: "deb [arch={{ ansible_architecture }}] https://download.docker.com/linux/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable"
state: present
filename: docker
內容解密:
此步驟使用ansible.builtin.apt_repository模組將Docker官方儲存函式庫新增到系統中。repo引數指定了儲存函式庫的位置和架構,state引數確保儲存庫存在,filename引數指定了儲存函式庫組態檔案的名稱。
第三步:更新apt快取並安裝Docker
使用ansible.builtin.apt模組更新apt快取並安裝Docker。
- name: Install Docker
ansible.builtin.apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
state: latest
update_cache: true
內容解密:
此步驟使用ansible.builtin.apt模組安裝Docker及其相關元件。name引數指定了要安裝的軟體包,state引數確保軟體包是最新版本,update_cache引數在安裝前更新apt快取。
在Red Hat Linux上安裝Docker
在根據Fedora或Red Hat的Linux發行版上安裝Docker的步驟與Debian類別似,但使用的Ansible模組不同,以處理rpm軟體包。
完整的Ansible Playbook程式碼如下所示(以Debian為例):
---
- name: Install Docker
hosts: all
become: true
tasks:
- name: Install apt-transport-https
ansible.builtin.apt:
name:
- apt-transport-https
- ca-certificates
- lsb-release
- gnupg
state: latest
update_cache: true
- name: Add signing key
ansible.builtin.apt_key:
url: "https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg"
state: present
- name: Add repository into sources list
ansible.builtin.apt_repository:
repo: "deb [arch={{ ansible_architecture }}] https://download.docker.com/linux/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable"
state: present
filename: docker
- name: Install Docker
ansible.builtin.apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
state: latest
update_cache: true
執行此Playbook後,可以透過執行docker run hello-world命令來驗證Docker是否成功安裝。