Ansible 是一款功能強大的自動化工具,廣泛應用於組態管理、應用程式佈署和任務自動化等領域。它採用模組化設計,提供了豐富的模組函式庫,涵蓋了各種系統管理任務。透過 Ansible Playbook,我們可以將這些模組組合成可重複使用的指令碼,實作複雜的自動化流程。本文將從 Ansible 的基本模組操作開始,逐步深入 Playbook 的編寫和 YAML 語法的應用,並結合實際案例示範如何使用 Ansible 自動化佈署和組態 LAMP 堆積疊和 Splunk 伺服器環境。此外,文章還將介紹 Ansible 的不同版本,包括開源版本和企業級版本 Ansible Tower,以及如何在遠端伺服器上設定 SSH 認證以實作無密碼執行 Ansible 命令。
Ansible 基本模組操作與遠端伺服器管理
Ansible 提供了多種模組來幫助使用者進行系統組態與管理。這些模組涵蓋了從檔案下載、目錄建立、使用者管理到檔案搜尋等各種任務。
使用 get_url 模組下載檔案
在進行系統組態時,我們經常需要從特定的 URL 下載檔案。get_url 模組允許我們指定下載檔案的 URL 和存放路徑。例如:
ansible mylaptop -i hosts -m get_url -a "url=http://example.com/file.txt dest=/tmp/file.txt"
內容解密:
url引數指定了要下載的檔案的 URL。dest引數指定了下載檔案存放的本地路徑。- 該命令執行後,Ansible 會將檔案下載到指定的目錄中。
使用 file 模組建立目錄或檔案
file 模組可以用來建立目錄或檔案,並設定相關的許可權。例如:
ansible mylaptop -i hosts -m file -a "path=/tmp/another_test owner=root group=root state=directory"
內容解密:
path引數指定了要建立的目錄或檔案的路徑。owner和group引數分別指定了目錄或檔案的所有者和所屬群組。state引數設定為directory表示建立一個目錄。
使用 user 模組管理使用者帳戶
user 模組可以用來建立或刪除使用者帳戶。例如:
ansible -i hosts mylaptop -m user -a "name=jsmith comment='Jane Smith' state=present"
內容解密:
name引數指定了要建立的使用者名稱。comment引數為使用者增加了註解資訊。state引數設定為present表示建立該使用者帳戶。
使用 find 模組搜尋檔案和目錄
find 模組允許我們在主機系統上搜尋特定的檔案和目錄。例如:
ansible mylaptop -i hosts -m find -a "path=/var/log/ age=1w file_type=directory"
內容解密:
path引數指定了搜尋的起始路徑。age引數指定了搜尋條件,例如搜尋一週前的檔案或目錄。file_type引數設定為directory表示只搜尋目錄。
在遠端伺服器上執行 Ansible 命令
為了更有效地使用 Ansible,我們需要在遠端伺服器上設定 SSH 認證。首先,使用 ssh-copy-id 命令將本地的公鑰複製到遠端伺服器:
ssh-copy-id <remote_host_ip>
然後,修改遠端伺服器上的 sudoers 檔案,以允許無密碼執行 sudo 命令:
<username> ALL=(ALL) NOPASSWD: ALL
完成上述設定後,便可以無密碼地在遠端伺服器上執行 Ansible 命令。
Ansible 的不同版本與專案介紹
在本文中,我們將使用免費且開源的 Ansible 版本,盡量採用 ansible 版本 2.9.9。我們將盡力確保所有指令碼和程式碼都與此版本及後續版本相容。大多數公司使用開源版本的 Ansible,因為它提供了足夠的功能來執行適合大型企業的組態管理系統。
Ansible Tower:企業級版本
Ansible Tower 是由 Red Hat 支援的付費版本,但提供十個節點的免費基本授權。這是 Ansible 的企業級版本,提供了開源版本所沒有的一些額外功能。它允許您執行 ansible playbook 專案、執行 playbook、排程 playbook、管理伺服器清單,並具有完整的存取控制清單來管理使用者。此外,它還為終端使用者提供支援以及使用者友好的儀錶板。
Ansible 專案介紹
在接下來的章節中,我們將介紹您將要進行的專案,希望這些專案能夠提供真實世界的範例,並隨著章節和知識的進展而逐步建立。
基本 LAMP 堆積疊
LAMP 堆積疊代表 Linux、Apache、MySQL、PHP(或 Python),用於託管 Web 應用程式。在本文的前四章中,我們將完成第一個專案,即設定一個基本的 LAMP 堆積疊,該堆積疊將被組態為提供基本內容。為了進一步擴充套件這個範例,我們還將使用根據 Django 的伺服器。
Splunk 伺服器環境
從第五章開始,我們將轉移到另一個專案,即設定和組態 Splunk 伺服器環境。這個專案將帶您瞭解如何將 Ansible 與 Amazon Web Services 結合使用。我們將從設定我們的例項、組態和設定例項使用者資料開始,然後從我們的 Splunk 伺服器建立一個 AWS 映像。
Ansible Playbooks:自動化組態管理
Ansible playbooks 可以包含一個或多個 play,幫助您自動化系統組態,以可重複使用的任務集逐步實作系統的期望狀態。在本章中,我們將介紹 playbook 的使用,使您能夠更輕鬆地佈署系統。
YAML 語法與 Ansible Playbooks
在開始使用 playbook 之前,我們需要先了解 YAML 語法。YAML 的目標是易於人類閱讀。與 XML 或 JSON 等其他組態檔案格式相比,YAML 更易於閱讀。我們的 Ansible playbook 使用 YAML 語法來輸出簡單的訊息到螢幕上。
YAML 基本語法
- YAML 檔案名稱以
.yml或.yaml結尾。 - 使用縮排表示層級關係。
- 使用冒號(:)表示鍵值對。
- 使用短橫線(-)表示列表項。
在接下來的章節中,我們將探討如何使用 YAML 語法編寫 Ansible playbook,以及如何使用 playbook 自動化組態管理任務。
Ansible Playbook 與 YAML 語法基礎
Ansible Playbook 是 Ansible 自動化工具的核心組成部分,而 YAML 語法則是編寫 Playbook 的基礎。在本章中,我們將探討 YAML 語法的基礎知識以及如何使用 Ansible Playbook 來自動化常見的系統管理任務。
YAML 語法基礎
YAML(YAML Ain’t Markup Language 或 Yet Another Markup Language)是一種人類可讀的資料序列化格式,廣泛用於各種程式語言中。以下是 YAML 的一些基本語法規則:
1. 檔案以三個破折號(
)開始 這是 YAML 檔案的標準起始標記,讓應用程式能夠識別檔案的格式。
---
2. 空白字元表示結構
在 YAML 中,縮排和空白字元用於表示檔案的結構。因此,正確的縮排非常重要。切記不要使用跳格字元(tab)進行縮排。
Operating Systems:
- Ubuntu
- Debian
- Red Hat
- Centos
- Windows
- Mac
3. 使用井字號(#)進行註解
在 YAML 中,可以使用井字號(#)來新增註解,這對於解釋 Playbook 的內容非常有幫助。
# 這是一個註解
4. 列表成員使用前導連字元(-)
在 YAML 中,列表成員透過在相同縮排層級下使用連字元(-)來表示。
- Ubuntu
- Debian
- Red Hat
5. 字典表示為「鍵: 值」
在 YAML 中,字典透過鍵值對來表示。只需在字典名稱後縮排並新增鍵值對即可。
vince:
full_name: Vincent Sesto
job: devops engineer
comment: Ansible is Fun!
neil:
full_name: Neil Diamond
job: Singer and Songwriter
comment: Good Lord!
6. 使用豎線(|)跨越多行
當需要為一個條目新增多行資料時,可以使用豎線(|)符號。這將保留換行字元。
env: |-
DB_HOST= "database.host.com"
DB_DATABASE= "testdb"
DB_USERNAME= "dbadmin"
SUDO= "root"
JAVA_HOME= "/usr/lib/jvm/java-11-oracle"
HOME= "/home/ubuntu"
USER= "ubuntu"
MAIL= "/var/mail/ubuntu"
#### 內容解密:
在這個範例中,我們使用豎線(|)符號來定義一個多行的環境變數設定。這種方式可以讓我們在 YAML 檔案中清晰地定義多行文字,並且保留換行字元。這對於設定環境變數或撰寫多行訊息非常有用。
從命令列模組到 Ansible Playbook
在前面的章節中,我們使用命令列模組來安裝 Apache2、組態檔案以及確保服務正在執行。現在,我們將這些任務轉換為一個 Ansible Playbook。
首先,回顧我們之前使用的命令列模組:
ansible mylaptop -i hosts mylaptop -m apt -a "name=apache2 state=present"
ansible mylaptop -i hosts mylaptop -m file -a "path=/tmp/another_test owner=root group=root state=directory"
ansible mylaptop -i hosts mylaptop -m service -a "name=apache2 state=started"
建立 Ansible Playbook
建立一個新的目錄,並進入該目錄:
mkdir test_playbooks; cd test_playbooks建立一個新的 hosts 檔案,並新增一個名為
webserver的組:[mylaptop] localhost [webserver] 127.0.0.1建立一個新的 Playbook 檔案,名為
webserver-playbook.yml:touch webserver-playbook.yml編輯 Playbook 檔案,新增以下內容:
- hosts: webserver
tasks:
- name: ensure apache is installed and up to date apt: name=apache2 state=latest
#### #### 內容解密:
在這個 Playbook 中,我們定義了一個名為 `webserver` 的主機,並指定了一個任務列表。第一個任務是使用 `apt` 模組確保 Apache2 已安裝並且是最新版本。這裡的 `name` 欄位提供了任務的描述,而 `apt` 模組則負責實際的安裝工作。
#### Ansible Playbook 結構圖示
```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Ansible自動化組態管理與Playbook實踐
package "Ansible 架構" {
component [Control Node] as control
package "Ansible 組件" {
component [Inventory] as inventory
component [Playbooks] as playbooks
component [Roles] as roles
component [Modules] as modules
}
package "Managed Nodes" {
component [Web Server] as web
component [DB Server] as db
component [App Server] as app
}
}
control --> inventory : 主機清單
control --> playbooks : 任務定義
playbooks --> roles : 引用角色
roles --> modules : 使用模組
control --> web : SSH 連線
control --> db : SSH 連線
control --> app : SSH 連線
note right of control
無需在目標主機安裝 Agent
透過 SSH 執行任務
end note
@enduml
此圖示展示了 Ansible Playbook 的基本結構,從定義主機到執行任務的流程。
#### 內容解密:
這個 Plantuml 圖表展示了 Ansible Playbook 的基本流程。首先,我們定義要操作的主機,然後指定要執行的任務,最後執行這些任務。這種視覺化的表示方式有助於理解 Playbook 的結構和執行邏輯。
使用Ansible Playbook自動化佈署Apache2網頁伺服器
在前面的章節中,我們學習瞭如何使用Ansible來自動化佈署和組態系統。在本章節中,我們將透過一個實際的範例,展示如何使用Ansible Playbook來佈署一個Apache2網頁伺服器。
建立Playbook
首先,我們需要建立一個名為webserver-playbook.yml的Playbook檔案。這個檔案將包含一系列的任務,用於佈署和組態Apache2網頁伺服器。
步驟1:安裝Apache2
在Playbook中,我們的第一個任務是確保Apache2已經安裝並且是最新版本。我們可以使用apt模組來完成這項任務。
- name: ensure apache is installed and up to date
apt: name=apache2 state=latest
步驟2:下載預設的Apache2組態檔案
在實際的應用場景中,我們通常會需要使用預先組態好的Apache2組態檔案。為了簡化範例,我們將下載一個預設的組態檔案。
wget https://raw.githubusercontent.com/vincesesto/ansibleanswers/master/chapter2/000-default.conf
步驟3:複製組態檔案到目標系統
接下來,我們將使用copy模組將下載的組態檔案複製到目標系統的/etc/apache2/sites-available/目錄下。同時,我們設定了一個notify動作,用於在組態檔案發生變化時重新啟動Apache2服務。
- name: write the apache config file
copy: src=000-default.conf dest=/etc/apache2/sites-available/000-default.conf
notify:
- restart apache2
步驟4:確保Apache2服務正在執行
我們需要確保Apache2服務正在執行,並且在系統啟動時自動啟動。可以使用service模組來完成這項任務。
- name: apache is running (and enable it at boot)
service: name=apache2 state=started enabled=yes
步驟5:設定Handlers
為了回應notify動作,我們需要在Playbook中設定Handlers。在這個範例中,當組態檔案發生變化時,Handlers將重新啟動Apache2服務。
handlers:
- name: restart apache2
service: name=apache2 state=restarted
執行Playbook
完成Playbook的編寫後,我們可以使用以下命令來執行它:
ansible-playbook -i hosts webserver-playbook.yml
執行結果將顯示每個任務的執行狀態,包括成功、變更、不可達、失敗等資訊。
詳細輸出
為了除錯Playbook,我們可以使用-v選項來增加輸出的詳細程度。例如:
ansible-playbook -i hosts webserver-playbook.yml -vvv
這個命令將提供更詳細的輸出,幫助我們瞭解每個任務的執行細節。
Ansible語法詳解
在編寫Playbook時,我們需要注意一些語法細節。例如,hosts條目需要與inventory檔案中的主機名稱相匹配。同時,我們也可以指定佈署的順序,例如按字母順序佈署。
- hosts: all
order: sorted
我們也可以使用萬用字元(*)來指定所有主機,或者使用冒號(:)來分隔多個主機或群組。
使用Ansible Playbook進行自動化佈署
深入理解Playbook的結構與功能
在前面的章節中,我們已經瞭解瞭如何使用Ansible來設定和管理我們的伺服器。現在,我們將更深入地探討Ansible Playbook的細節,並學習如何使用變數和迴圈來增強Playbook的功能。
Playbook的執行順序與遠端使用者
Ansible Playbook允許我們指定執行的順序,例如按照inventory檔案的順序(inventory)、反向順序(reverse_inventory)、字母順序(sorted)、反向字母順序(reverse_sorted)或是隨機順序(shuffle)。此外,我們還可以指定遠端使用者(remote_user)來執行任務。
---
- hosts: database
remote_user: tom
become: yes
become_user: postgres
在這個例子中,我們使用tom作為遠端使用者,並且透過become和become_user來切換到postgres使用者執行任務。
任務(Tasks)與模組(Modules)
Playbook中的任務是按照順序執行的,每個任務都應該包含一個描述性的名稱。我們可以使用不同的模組來執行各種任務,例如使用apt模組來安裝軟體。
tasks:
- name: 確保Apache已安裝並且是最新版本
apt:
name: apache2
state: latest
Notify與Handlers
我們可以使用notify來觸發Handlers,當某些任務發生變化時,Handlers會被執行。例如,當我們更改了Apache的組態檔案後,可以使用notify來觸發重啟Apache的Handler。
- name: 寫入Apache組態檔案
copy:
src: 000-default.conf
dest: /etc/apache2/sites-available/000-default.conf
notify:
- 重啟Apache
handlers:
- name: 重啟Apache
service:
name: apache2
state: restarted
新增Playbook功能:變數與迴圈
現在,我們將為Playbook新增更多功能,包括定義變數和使用迴圈。我們將建立一個新的Playbook來設定資料函式庫伺服器。
定義變數
我們可以在Playbook中定義變數,並在任務中使用它們。例如,我們可以定義一個名為mysql_root_password的變數。
vars:
mysql_root_password: password
使用迴圈
我們可以使用with_items來迭代多個值。例如,我們可以使用mysql_user模組來建立多個MySQL使用者。
- name: 建立MySQL使用者
mysql_user:
name: "{{ item.name }}"
password: "{{ item.password }}"
priv: "{{ item.priv }}"
with_items:
- { name: 'user1', password: 'password1', priv: '*.*:ALL' }
- { name: 'user2', password: 'password2', priv: '*.*:ALL' }
建立資料函式庫
我們可以使用mysql_db模組來建立資料函式庫。
- name: 建立資料函式庫
mysql_db:
name: mydatabase
state: present