返回文章列表

Ansible 自動化組態管理實戰

本文介紹 Ansible 的基礎概念、安裝步驟及 Playbook 撰寫,並引導讀者使用 Vagrant 建立測試環境,示範如何利用 Ansible 自動化 PHP、Nginx 和 MySQL 的安裝與組態。文章涵蓋 Ansible 的優勢、與其他組態管理工具的比較,以及如何在不同作業系統上安裝

DevOps 系統管理

Ansible 是一款根據 SSH 連線的自動化工具,免代理程式安裝,簡化了組態管理流程。它使用 YAML 語法編寫 Playbook,易於理解和維護,並支援冪等操作,確保多次執行相同組態不會造成系統異常。相較於 Puppet 和 Chef 等工具,Ansible 更輕量且易於上手,適合快速佈署和管理伺服器環境。本文將逐步引導讀者安裝 Ansible,並透過撰寫 Playbook 和使用 Vagrant 建立測試環境,示範如何自動化安裝和組態常用的軟體堆積疊,例如 PHP、Nginx 和 MySQL。

Ansible 初探:從基礎到實踐

Ansible 是一款強大的自動化工具,專門用於組態管理、應用程式佈署以及任務自動化。本章將介紹 Ansible 的基本概念、安裝流程,並引導讀者完成第一個 Ansible Playbook 的撰寫。

組態管理:理解系統狀態的掌控

組態管理是一種系統化的流程,用於追蹤和控制系統的變更,確保系統在任何時間點都保持在預期的狀態。這個概念最初由美國國防部在 1950 年代提出,用於管理硬體物資。隨著時間的推移,組態管理的實踐逐漸擴充套件到軟體領域。如今,我們不僅關注軟體的版本,還包括其組態、主機作業系統等關鍵因素。

從檔案化到宣告式組態

過去,我們需要手動記錄系統的狀態,並確保其符合預期。如今,藉助 Ansible 等工具,我們可以直接定義系統的理想狀態,讓工具自動完成相應的調整。這種做法稱為「基礎設施即程式碼」(Infrastructure as Code),它將軟體開發的最佳實踐應用於基礎設施管理,例如版本控制、程式碼審查和測試。

Ansible 簡介:開源自動化工具的崛起

Ansible 由 Michael DeHaan 在 2012 年首次發布,迅速獲得了廣泛的關注和採用。它已成為開源社群中極具影響力的專案之一,擁有超過 17,000 個星標和 1,410 位貢獻者。諸如 Apple 和 NASA 等企業也已將 Ansible 用於其組態管理需求。

為何選擇 Ansible?

  • 簡潔易用:Ansible 使用 YAML 語法編寫 Playbook,易於理解和維護。
  • 無需代理:Ansible 透過 SSH 連線遠端主機,無需在目標機器上安裝代理程式。
  • 強大的社群支援:Ansible 擁有活躍的社群,提供豐富的模組和最佳實踐。

安裝 Ansible 並撰寫第一個 Playbook

在本章結束時,您將能夠在自己的環境中安裝 Ansible,並執行一個簡單的 Playbook,用於安裝 PHP、nginx 和 MySQL。

步驟一:準備環境

首先,確保您的控制節點(Control Node)執行的是 Linux 或 macOS。如果您使用的是 Windows,可以透過虛擬機器安裝 Linux 發行版來執行 Ansible。

步驟二:安裝 Ansible

您可以使用套件管理器(如 aptyum)來安裝 Ansible。以 Ubuntu 為例:

sudo apt update
sudo apt install ansible -y

內容解密:

  1. sudo apt update:更新套件列表,以確保取得最新的軟體包資訊。
  2. sudo apt install ansible -y:安裝 Ansible,-y 引數表示自動確認安裝。

步驟三:撰寫第一個 Playbook

建立一個名為 setup.yml 的檔案,並新增以下內容:

---
- name: 安裝 PHP、nginx 和 MySQL
  hosts: servers
  become: yes

  tasks:
    - name: 安裝必要套件
      apt:
        name:
          - php
          - nginx
          - mysql-server
        state: present

內容解密:

  1. hosts: servers:指定此 Playbook 將在 servers 群組中的主機上執行。
  2. become: yes:使用許可權提升(通常是 sudo)來執行任務。
  3. apt 模組用於管理 Debian 系列發行版上的套件。
  4. name 下列出的套件將被安裝,而 state: present 確保這些套件存在於系統中。

Ansible 簡介與安裝

Ansible 的基本特性與優勢

Ansible 是一種開源的自動化工具,主要用於組態管理、應用程式佈署和任務自動化。它使用 YAML 語言編寫 Playbook,簡潔易讀,且具備跨平台的特性。Ansible 的最大特點是其「無代理」(agentless)架構,這意味著它不需要在被管理的節點上安裝任何代理程式,而是透過 SSH 進行連線和管理。

為什麼選擇 Ansible?

  1. 無代理架構:Ansible 不需要在被管理的機器上安裝任何軟體,減少了系統的複雜性和資源佔用。
  2. 使用 SSH 進行連線:利用 SSH 進行安全連線,無需額外的認證機制。
  3. YAML 組態檔案:Ansible 使用 YAML 編寫 Playbook,易於閱讀和編寫。
  4. Python 開發:Ansible 是用 Python 開發的,與 Python 2.6 及以上版本相容,這意味著它可以在大多數 Linux 系統上執行而無需額外的依賴。

與其他組態管理工具的比較

Ansible 與 Puppet 和 Chef 等工具相比,有其獨特的優勢。Puppet 和 Chef 需要一個中央伺服器來儲存組態和後設資料,而 Ansible 則是透過使用者主動推播變更來實作組態管理。這種模式有其優缺點:

  • 優點:變更可以即時推播,無需等待被管理節點檢查更新。
  • 缺點:使用者需要負責將更新推播到所有節點。

與 SaltStack 的比較

Ansible 與 SaltStack 在某些方面有相似之處,例如都使用 YAML 進行組態,且都是用 Python 開發的。兩者都支援冪等操作(idempotent),這意味著多次執行相同的操作不會對系統造成不必要的變更。

安裝 Ansible

安裝 Ansible 的方法有多種,包括從原始碼編譯和透過套件管理器安裝。

從原始碼編譯安裝

  1. 首先,需要準備一個開發環境,包括安裝 git、pip 和 Python 開發函式庫。
  2. 從 GitHub 克隆 Ansible 原始碼:
    git clone git://github.com/ansible/ansible.git --recursive
    cd ansible
    make
    sudo make install
    
    這樣就可以從原始碼安裝最新的 Ansible 版本。

使用套件管理器安裝

對於根據 Debian 或 RedHat 的系統,可以使用 dpkg 或 yum 來安裝 Ansible。這種方法的好處是可以方便地進行解除安裝。

內容解密:

  1. git clone git://github.com/ansible/ansible.git --recursive:這條命令用於從 GitHub 克隆 Ansible 的原始碼倉函式庫到本地,包括所有的子模組。
  2. cd ansible:進入剛剛克隆下來的 Ansible 原始碼目錄。
  3. make:執行 make 命令來編譯 Ansible 原始碼。
  4. sudo make install:使用 root 許可權安裝編譯好的 Ansible。

這些步驟完成後,Ansible 就已經安裝在你的系統上了。你可以透過執行 ansible --version 來驗證安裝是否成功。

安裝 Ansible 與建立測試環境

安裝 Ansible

要開始使用 Ansible,首先需要在你的系統上安裝它。根據你的作業系統,可以使用不同的套件管理器進行安裝。

使用套件管理器安裝

對於大多數 Linux 發行版,可以使用 yumapt 來安裝 Ansible。如果你使用的是 macOS,可以透過 Homebrew 來安裝。

  • 使用 Homebrew (macOS)

    brew install ansible
    
  • 使用 apt (Debian/Ubuntu 系統): 首先,需要新增 Ansible 的 PPA(如果尚未新增),然後更新套件列表並安裝 Ansible。

    sudo apt-get install python-software-properties # 如果需要
    sudo apt-add-repository ppa:ansible/ansible
    sudo apt-get update
    sudo apt-get install ansible
    
  • 使用 Pip: 如果你偏好使用 Python 的套件管理器 Pip,也可以透過以下指令安裝 Ansible。

    sudo pip install ansible
    

在 Windows 上安裝 Ansible

Ansible 在 Windows 上並未得到官方支援,但你仍然可以嘗試在 Windows 上安裝。不過,建議使用 Vagrant 在虛擬機器中執行 Ansible,以避免與本地環境的相容性問題。

編寫第一個 Playbook

安裝完成後,你就可以開始自動化你的基礎架構。首先,需要建立一個測試環境和一個 Playbook。我們將使用 Vagrant 建立一個可丟棄的開發環境,並建立一個安裝基本 PHP 和 MySQL 堆積疊的 Playbook。

使用 Vagrant 建立測試環境

在編寫第一個 Playbook 之前,需要一個測試環境。雖然可以直接對本地機器執行 Playbook,但建議在一個可丟棄的環境中進行測試,以防發生意外。Vagrant 是建立這種環境的理想工具。

關於 VirtualBox 和 Vagrant

本文將使用虛擬機器來執行 Playbook。虛擬機器將透過 VirtualBox(虛擬化技術)和 Vagrant(虛擬機器的自動化工具)來提供。兩者都是免費且可在網上取得的。

  • VirtualBox:一個由 Oracle 開發的免費虛擬化工具,允許你建立虛擬 PC 並安裝任何作業系統。
  • Vagrant:本質上是一個用於虛擬機器的指令碼語言,用於自動化虛擬機器的建立和管理。
安裝 VirtualBox 和 Vagrant
  1. 下載並安裝 VirtualBox:可從 https://www.virtualbox.org/wiki/Downloads 下載。請注意,VirtualBox 5.0 及以後版本僅支援 64 位元系統。

  2. 下載並安裝 Vagrant:可從 https://www.vagrantup.com/downloads.html 下載。下載後執行安裝程式即可完成安裝。

Vagrant 與 VirtualBox 的協作流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 使用 Vagrant 建立測試環境

rectangle "控制" as node1
rectangle "建立" as node2
rectangle "執行" as node3
rectangle "組態" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

此圖示展示了 Vagrant 如何控制 VirtualBox 來建立虛擬機器,並在虛擬機器中執行 Ansible Playbook 以組態目標環境。

建立開發環境

現在你已經安裝好所有必要的依賴工具,接下來要建立一個虛擬機器來安裝套件並使用 Ansible 進行組態。首先,建立一個名為 ansible-book 的新資料夾,並在該資料夾中執行 vagrant init ubuntu/trusty64 命令。

初始化 Vagrant 環境

執行以下命令來初始化 Vagrant 環境:

$ mkdir ansible-book && cd ansible-book
$ vagrant init ubuntu/trusty64

這將在 ansible-book 資料夾中生成一個名為 Vagrantfile 的檔案。接下來,執行 vagrant up 命令來啟動虛擬機器。

啟動虛擬機器

$ vagrant up

第一次執行 vagrant up 時,Vagrant 會檢查是否已經下載了名為 ubuntu/trusty64 的 box。如果沒有,它會從 Atlas(由 Hashicorp 維護的中央 box 資料函式庫)下載該 box。下載完成後,Vagrant 會將 box 匯入到目前的資料夾中,並使用 VirtualBox 建立虛擬機器。

Vagrant 輸出範例

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/trusty64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'ubuntu/trusty64'
    default: URL: https://atlas.hashicorp.com/ubuntu/trusty64
==> default: Adding box 'ubuntu/trusty64' (v20151111.0.0) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/trusty64/versions/20151111.0.0/providers/virtualbox.box
==> default: Successfully added box 'ubuntu/trusty64' (v20151111.0.0) for 'virtualbox'!

虛擬機器啟動完成

虛擬機器啟動完成後,你可以執行 vagrant status 命令來檢查其狀態。

$ vagrant status
Current machine states:
default                   running (virtualbox)

你也可以使用 vagrant ssh 命令登入虛擬機器。

$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/issue
Ubuntu 14.04.3 LTS \n \l

修改 Vagrantfile 組態

為了滿足軟體執行所需的記憶體需求,我們需要修改 Vagrantfile 檔案,將虛擬機器的記憶體設定為 1024mb。在檔案結尾處新增以下內容:

config.vm.provider "virtualbox" do |vb|
  vb.memory = "1024"
end

此外,我們還需要告訴 Vagrant 使用 Ansible 來組態虛擬機器。在剛剛新增的組態之後,再新增以下內容:

config.vm.provision "ansible" do |ansible|
  ansible.playbook = "provisioning/playbook.yml"
end

如果你的本機尚未安裝 Ansible(例如在 Windows 環境下),可以使用以下組態代替:

config.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "provisioning/playbook.yml"
end

這兩種組態的主要區別在於,ansible 組態會在本機執行 Ansible,而 ansible_local 組態則會登入虛擬機器並在其中執行 Ansible。Vagrant 會自動處理 Ansible 的安裝和組態。

設定解說:

  1. config.vm.provider "virtualbox" do |vb|:指定 Vagrant 使用 VirtualBox 提供者來建立虛擬機器。
  2. vb.memory = "1024":設定虛擬機器的記憶體大小為 1024 MB。
  3. config.vm.provision "ansible":指定 Vagrant 使用 Ansible 來進行虛擬機器的組態。
  4. ansible.playbook = "provisioning/playbook.yml":指定 Ansible 的 Playbook 路徑,這裡假設 Playbook 名為 playbook.yml,存放在 provisioning 資料夾中。

銷毀虛擬機器

當你不再需要虛擬機器時,可以執行 vagrant destroy 命令來銷毀它。

$ vagrant destroy
default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
==> default: Removing hosts

執行 vagrant destroy 後,虛擬機器將被完全刪除,所有變更將會遺失。下次執行 vagrant up 時,Vagrant 將會重新複製基礎 box 以提供一個乾淨的環境。