Ansible 是一款常用的自動化工具,簡化了複雜的 IT 基礎架構管理工作。本文旨在提供 AWS EC2 例項的連線、終止及 Ansible 自動化管理的完整。首先說明如何透過 PuTTY 和 SSH 連線到 Linux EC2 例項,接著示範如何終止不再需要的例項以節省成本。然後介紹 Ansible 的核心概念、優勢,以及如何在控制機器上安裝和設定 Ansible。文章進一步說明如何建立庫存檔案來管理目標主機,並示範如何撰寫簡單的 Playbook 來執行自動化任務,例如安裝和啟動服務。此外,也涵蓋了 SSH 金鑰設定,以提升安全性並簡化登入流程,最後說明如何組態主機清單和定義主機變數,讓 Ansible 更有效率地管理多個 EC2 例項。
連線至您的 AWS EC2 例項
要連線到您的 Linux EC2 例項,如果您使用的是 Windows,您需要安裝 PuTTY。
使用 PuTTY 連線到您的 Linux 例項
啟動 PuTTY(從開始功能表中,點選「所有程式」 > PuTTY > PuTTY)。
在「類別」窗格中,選擇「會話」並完成以下欄位:
- 在「主機名稱(或 IP 位址)」框中,輸入
ec2-user@public_ip。您可以使用案例項的「公有 IP 位址」或「公有 DNS 名稱」。 - 在「連線型別」下,選擇「SSH」。
- 確保「連線埠」為 22。
- 在「主機名稱(或 IP 位址)」框中,輸入
在「類別」窗格中,展開「連線」,展開「SSH」,然後選擇「驗證」。完成以下操作:
- 點選「瀏覽」。
- 選擇為您的金鑰對生成的
.ppk檔案,然後點選「開啟」。 - 點選「開啟」以啟動 PuTTY 會話。
如果這是您第一次連線到此例項,PuTTY 將顯示一個安全警示對話方塊,詢問您是否信任您正在連線的主機。點選「是」。一個視窗將開啟,您已連線到您的例項。
從 Mac 或 Linux 使用 SSH 使用者端連線
如果您使用 Mac 或 Linux 電腦連線到您的例項,您的電腦很可能預設包含 SSH 使用者端。您可以在命令列中輸入 ssh 來檢查是否有 SSH 使用者端。如果您的電腦無法辨識該命令,OpenSSH 專案提供了 SSH 工具套件的免費實作。欲瞭解更多資訊,請參閱 http://www.openssh.org。
開啟命令殼層並執行以下命令:
$ ssh -i /path/key_pair.pem ec2-user@public_ip
對於 Amazon Linux,預設使用者名稱是 ec2-user。對於 RHEL5,使用者名稱通常是 root,但也可能是 ec2-user。對於 Ubuntu,使用者名稱是 ubuntu。對於 SUSE Linux,使用者名稱是 root。否則,請與您的 AMI 提供者聯絡。
終止您的 EC2 例項
本章節教學的目的是展示如何從 AWS 管理主控台啟動 EC2 例項,以便您對 EC2、金鑰對和安全群組有基本的瞭解。完成本章節的例項後,您應該清理並終止該例項。
終止例項會有效地刪除它,因為您無法在終止例項後重新連線到它。這與停止例項不同;當您停止例項時,它將關閉,您不會被收取每小時的使用費或資料傳輸費。此外,您可以隨時重新啟動已停止的例項。
終止例項
- 在「例項」頁面上的例項清單中找到您的例項。如果找不到您的例項,請驗證您是否選擇了正確的區域。
- 右鍵點選該例項,選擇「例項狀態」,然後點選「終止」。
- 當提示確認時,點選「是,終止」。
Ansible 簡介
Ansible 是一種極其簡單的 IT 協調引擎,可自動化組態管理、應用程式佈署和許多其他 IT 需求。Ansible 透過檢視所有系統之間相互關聯的全面架構來模擬您的 IT 基礎架構,而不是一次只管理一個系統。它不使用代理程式,也不需要額外的自定義安全基礎架構,因此易於佈署 — 最重要的是,它使用非常簡單的語言(YAML,以 Ansible playbooks 的形式)來描述自動化作業,使其接近於純英文。
Ansible 的運作方式是連線到您的節點並向它們推播小型程式(稱為“Ansible 模組”)。這些程式是用來描述系統所需狀態的資源模型。然後,Ansible 執行這些模組(預設透過 SSH),並在完成後將其移除。您的模組函式庫可以駐留在任何機器上,並且不需要伺服器、守護程式或資料函式庫。
Ansible 的優勢
與 Chef 和 Puppet 不同,Ansible 使用無代理架構。您只需要將 Ansible 安裝在用於管理基礎架構的機器上。受管理的節點不需要安裝和執行後台守護程式來與控制機器連線並提取組態,從而減少了網路上的負擔。
在本章中,您將學習如何安裝 Ansible、建立庫存檔案、從命令列使用 Ansible、編寫簡單的 playbook 以及使用 Ansible 模組。
您需要的東西
要遵循本文中的範例,您需要一台電腦,最好是執行 Linux,並連線到網際網路。您還需要能夠在終端機中執行命令並對文字檔進行簡單編輯。
在本文中,我將使用 CentOS 6.5(最小安裝)Linux 發行版來執行 Ansible。Ansible 可以在多個不同的平台上執行,但我不會為所有平台提供詳細的說明。本文範例中由 Ansible 組態的所有 EC2 例項都將使用 Amazon Linux AMI(Amazon Machine Images),它根據 Red Hat 發行版,與 CentOS 類別似。
安裝與設定 Ansible
要開始使用 Ansible,首先需要在您的控制機器上安裝它。對於根據 Red Hat 的系統(如 CentOS),可以使用以下命令安裝 Ansible:
$ sudo yum install ansible
安裝完成後,您可以透過執行以下命令來驗證 Ansible 是否正確安裝:
$ ansible --version
這將顯示已安裝的 Ansible 版本。
建立庫存檔案
Ansible 使用庫存檔案來定義它所管理的機器。下面是一個簡單的庫存檔案範例:
[webservers]
web1 ansible_host=192.168.1.100
web2 ansible_host=192.168.1.101
[dbservers]
db1 ansible_host=192.168.1.200
在此範例中,我們定義了兩個群組:webservers 和 dbservers。每個群組包含具有指定 IP 位址的主機。
編寫簡單的 Playbook
Playbook 是 Ansible 的組態、佈署和協調語言。下面是一個簡單的 Playbook 範例,它在 webservers 群組中的所有機器上安裝 httpd:
---
- name: Install httpd on webservers
hosts: webservers
become: yes
tasks:
- name: Install httpd
yum:
name: httpd
state: present
- name: Start httpd
service:
name: httpd
state: started
enabled: yes
要執行此 Playbook,請將其儲存到檔案(例如 install_httpd.yml)並執行以下命令:
$ ansible-playbook -i inventory install_httpd.yml
這裡,-i inventory 指定了庫存檔案的位置。
#### 內容解密:
- `
` 表示 YAML 檔案的開始。
- name指定了 Playbook 或任務的名稱。hosts指定了 Playbook 將在其上執行的主機或群組。become: yes表示任務將以提升的許可權執行(類別似於使用sudo)。tasks列出了 Playbook 將執行的任務。- 每個任務都有一個
name和一個模組(如yum或service),以及相應的引數。
圖表翻譯:
此圖示顯示了 Ansible 控制節點與受管節點之間的互動關係。
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 圖表翻譯:
rectangle "SSH 連線" as node1
rectangle "執行模組" as node2
node1 --> node2
@enduml
圖表翻譯: 上圖展示了Ansible控制節點如何透過SSH連線到多個受管節點,並在這些節點上執行模組,最終將結果回饋給控制節點。這種無代理架構簡化了管理和組態過程。
安裝與設定 Ansible
Ansible 是一款強大的自動化工具,用於簡化 IT 任務的執行和管理。本章將引導您完成 Ansible 的安裝、SSH 金鑰設定以及主機清單(Inventory)的組態。
安裝 Ansible
Ansible 是使用 Python 編寫的。要安裝最新版本的 Ansible,我們將使用 pip。pip 是一個用於管理 Python 軟體套件的工具。Ansible 的最新版本會在發布後立即推播到 pip。
透過 pip 安裝 Ansible 的步驟:
安裝 RHEL EPEL 儲存函式庫:EPEL(Extra Packages for Enterprise Linux)是 Red Hat Enterprise Linux(RHEL)或 CentOS 的額外套件儲存函式庫,由 Fedora 專案社群維護,提供 Fedora 中未包含在商業支援的 Red Hat 產品線中的附加套件。
$ sudo yum -y update $ sudo yum -y install wget $ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm $ sudo rpm -Uvh epel-release-6*.rpm安裝 “Development tools” 群組:這是一個 yum 群組,包含了一系列開發工具,可以一次性安裝,而不是單獨安裝每個應用程式。這些工具允許您從原始碼構建和編譯軟體。
$ sudo yum groupinstall -y 'development tools'安裝 python-pip 和 python-devel:
$ sudo yum -y install python-pip python-devel升級 setuptools:
$ sudo pip install setuptools --upgrade透過 pip 安裝 Ansible:
$ sudo pip install ansible
安裝完成後,您可以執行以下命令來檢查 Ansible 的版本號:
$ ansible --version
ansible 2.1.1.0
要將 Ansible 升級到 pip 儲存函式庫中的最新版本:
$ sudo pip install ansible --upgrade
內容解密:
- 安裝 RHEL EPEL 儲存函式庫:首先更新系統並安裝
wget,然後下載並安裝 EPEL 儲存函式庫。這一步是為了確保系統可以存取到更多的軟體套件。 - 安裝 “Development tools” 群組:這一步安裝了一系列必要的開發工具,如編譯器和版本控制系統,用於從原始碼構建軟體。
- 安裝 python-pip 和 python-devel:pip 是 Python 的套件管理器,而 python-devel 包含了開發 Python 擴充套件所需的頭檔和函式庫。
- 升級 setuptools:setuptools 是 Python 的一個套件,用於簡化其他套件的安裝。升級它可以確保相容性和功能性。
- 透過 pip 安裝 Ansible:最後,使用 pip 安裝 Ansible,這樣可以確保安裝的是最新版本。
SSH 金鑰設定
Ansible 透過 SSH 與遠端機器通訊。預設情況下,Ansible 1.3 及更高版本會嘗試使用原生 OpenSSH 進行遠端通訊。建議使用 SSH 金鑰進行身份驗證,這樣 Ansible 就不需要詢問密碼。
設定 SSH 金鑰身份驗證的步驟:
使用 ssh-keygen 建立公鑰和私鑰:
$ ssh-keygen使用 ssh-copy-id 將公鑰複製到遠端主機:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub localhost無需輸入密碼登入遠端主機:
$ ssh localhost
內容解密:
ssh-keygen:用於生成 SSH 金鑰對,包括公鑰和私鑰。私鑰保留在本地,而公鑰則被複製到遠端主機上。ssh-copy-id:將公鑰複製到遠端主機的~/.ssh/authorized_keys檔案中,使得無需密碼即可登入。ssh localhost:測試 SSH 連線是否成功,如果一切設定正確,您應該能夠無需密碼登入。
主機清單(Inventory)
Ansible 透過選擇 Ansible 的主機清單檔案中的節點來同時對多個節點進行操作。預設情況下,Ansible 使用 /etc/ansible/hosts 作為主機清單檔案。
主機清單檔案格式範例:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
內容解密:
- 群組名稱:如
[webservers]和[dbservers],用於分類別節點並決定在 Ansible 任務中控制哪些主機。 - 主機變數:可以在主機清單檔案中為特定主機指定變數,如
ansible_user和ansible_port,以便在 Ansible Playbooks 中使用。
主機變數
您可以直接在主機清單檔案中指定變數,也可以在獨立的 YAML 檔案中定義主機變數。
主機變數範例(在主機清單檔案中):
[webservers]
web1.example.com ansible_user=ec2-user
web2.example.com ansible_user=ubuntu
主機變數範例(在獨立的 YAML 檔案中):
---
ansible_user: ec2-user
ansible_port: 5300
ansible_ssh_private_key_file: /home/yan/.ssh/keypair1.pem
內容解密:
ansible_host:如果連線的主機名稱與您想要給它的別名不同,可以指定此變數。ansible_user和ansible_ssh_pass:用於指定 SSH 使用者名稱和密碼,但建議使用 SSH 金鑰代替密碼。ansible_become和相關變數:用於控制特權提升,如使用sudo或su切換到其他使用者。