返回文章列表

Ansible自動化容器佈署與管理

本文介紹如何使用 Ansible 自動化佈署和管理容器,涵蓋了角色與集合的運用、Ansible 執行環境的建立與執行,以及在不同 Linux 發行版上安裝 Docker 的方法。文章詳細說明瞭 Ansible 如何簡化容器工作流程,並提供具體的 Playbook 範例和程式碼片段,方便讀者理解和實踐。

DevOps 容器化

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 的目錄,其中包含多個子目錄和檔案,如 defaultsfileshandlersmetataskstemplatestestsvars

角色目錄結構解析

  • 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-builderansible-runner兩個命令列工具,以簡化Ansible執行環境(Ansible Execution Environments, EE)的建立與執行。本文將探討這兩個工具的使用方法及其背後的運作原理。

安裝Ansible Builder與Ansible Runner

首先,您需要安裝ansible-builderansible-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任務。以下是建立此環境的步驟:

  1. 定義執行環境組態

    首先,您需要建立一個名為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互動。
  1. 指定Python函式庫依賴

    requirements.txt檔案中指定所需的Python函式庫:

    botocore>=1.18.0
    boto3>=1.15.0
    boto>=2.49.0
    

    內容解密:

    • 這裡列出了三個Python函式庫及其版本要求,分別是botocoreboto3boto,它們對於與AWS互動是必要的。
  2. 指定系統依賴

    bindep.txt檔案中指定所需的系統級依賴:

    git [platform:rpm]
    git [platform:dpkg]
    

    內容解密:

    • 這裡根據不同的包管理系統(RPM或DPKG)指定了所需的git包。

構建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 / amd64arm64 / aarch64
Debian
Fedora
Ubuntu
Binaries
Windows
MacOS

本章重點介紹容器引擎,即Docker引擎,只討論Docker執行時,稱為docker-engine,並根據下表支援的平台:

平台x86_64 / amd64arm64 / aarch64arm32s390x
CentOS
Debian
Fedora
Raspbian
RHEL (1)
SLES (2)
Ubuntu
Binaries

在Debian Linux上安裝Docker

以下步驟適用於所有根據Debian和Ubuntu的Linux發行版。您將使用Ansible自動化以下三個步驟:

  1. 新增Docker GPG金鑰
  2. 新增Docker儲存函式庫
  3. 更新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是否成功安裝。