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
您可以使用套件管理器(如 apt 或 yum)來安裝 Ansible。以 Ubuntu 為例:
sudo apt update
sudo apt install ansible -y
內容解密:
sudo apt update:更新套件列表,以確保取得最新的軟體包資訊。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
內容解密:
hosts: servers:指定此 Playbook 將在servers群組中的主機上執行。become: yes:使用許可權提升(通常是sudo)來執行任務。apt模組用於管理 Debian 系列發行版上的套件。name下列出的套件將被安裝,而state: present確保這些套件存在於系統中。
Ansible 簡介與安裝
Ansible 的基本特性與優勢
Ansible 是一種開源的自動化工具,主要用於組態管理、應用程式佈署和任務自動化。它使用 YAML 語言編寫 Playbook,簡潔易讀,且具備跨平台的特性。Ansible 的最大特點是其「無代理」(agentless)架構,這意味著它不需要在被管理的節點上安裝任何代理程式,而是透過 SSH 進行連線和管理。
為什麼選擇 Ansible?
- 無代理架構:Ansible 不需要在被管理的機器上安裝任何軟體,減少了系統的複雜性和資源佔用。
- 使用 SSH 進行連線:利用 SSH 進行安全連線,無需額外的認證機制。
- YAML 組態檔案:Ansible 使用 YAML 編寫 Playbook,易於閱讀和編寫。
- Python 開發:Ansible 是用 Python 開發的,與 Python 2.6 及以上版本相容,這意味著它可以在大多數 Linux 系統上執行而無需額外的依賴。
與其他組態管理工具的比較
Ansible 與 Puppet 和 Chef 等工具相比,有其獨特的優勢。Puppet 和 Chef 需要一個中央伺服器來儲存組態和後設資料,而 Ansible 則是透過使用者主動推播變更來實作組態管理。這種模式有其優缺點:
- 優點:變更可以即時推播,無需等待被管理節點檢查更新。
- 缺點:使用者需要負責將更新推播到所有節點。
與 SaltStack 的比較
Ansible 與 SaltStack 在某些方面有相似之處,例如都使用 YAML 進行組態,且都是用 Python 開發的。兩者都支援冪等操作(idempotent),這意味著多次執行相同的操作不會對系統造成不必要的變更。
安裝 Ansible
安裝 Ansible 的方法有多種,包括從原始碼編譯和透過套件管理器安裝。
從原始碼編譯安裝
- 首先,需要準備一個開發環境,包括安裝 git、pip 和 Python 開發函式庫。
- 從 GitHub 克隆 Ansible 原始碼:這樣就可以從原始碼安裝最新的 Ansible 版本。
git clone git://github.com/ansible/ansible.git --recursive cd ansible make sudo make install
使用套件管理器安裝
對於根據 Debian 或 RedHat 的系統,可以使用 dpkg 或 yum 來安裝 Ansible。這種方法的好處是可以方便地進行解除安裝。
內容解密:
git clone git://github.com/ansible/ansible.git --recursive:這條命令用於從 GitHub 克隆 Ansible 的原始碼倉函式庫到本地,包括所有的子模組。cd ansible:進入剛剛克隆下來的 Ansible 原始碼目錄。make:執行 make 命令來編譯 Ansible 原始碼。sudo make install:使用 root 許可權安裝編譯好的 Ansible。
這些步驟完成後,Ansible 就已經安裝在你的系統上了。你可以透過執行 ansible --version 來驗證安裝是否成功。
安裝 Ansible 與建立測試環境
安裝 Ansible
要開始使用 Ansible,首先需要在你的系統上安裝它。根據你的作業系統,可以使用不同的套件管理器進行安裝。
使用套件管理器安裝
對於大多數 Linux 發行版,可以使用 yum 或 apt 來安裝 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
下載並安裝 VirtualBox:可從 https://www.virtualbox.org/wiki/Downloads 下載。請注意,VirtualBox 5.0 及以後版本僅支援 64 位元系統。
下載並安裝 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 的安裝和組態。
設定解說:
config.vm.provider "virtualbox" do |vb|:指定 Vagrant 使用 VirtualBox 提供者來建立虛擬機器。vb.memory = "1024":設定虛擬機器的記憶體大小為 1024 MB。config.vm.provision "ansible":指定 Vagrant 使用 Ansible 來進行虛擬機器的組態。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 以提供一個乾淨的環境。