Ansible 是一款功能強大的自動化工具,簡化了複雜的系統管理任務。它透過 SSH 協定與遠端主機通訊,無需安裝 agent,大幅降低了佈署和維護成本。本文將引導讀者完成 Ansible 的安裝、SSH 設定、Inventory 檔案建立,並探討 Ansible 常用模組的應用,包含 ping、setup、git、shell、apt、service 和 get_url 等,搭配實際案例說明,讓讀者快速掌握 Ansible 的核心功能,並應用於日常的系統管理工作中,提升自動化管理效率。
開始使用Ansible
既然你已經對Ansible有了初步的瞭解,接下來的章節將指導你如何安裝並執行第一個Ansible命令。
安裝Ansible
本章節將著重於在Linux環境下安裝與使用Ansible。雖然主要針對Linux,但只要你的Windows系統安裝了Windows Subsystem for Linux(WSL),或是Mac上安裝了Ansible,也可以順利執行相關命令。
在Windows上安裝WSL
- 以系統管理員身分開啟PowerShell,執行以下命令來啟用WSL功能:
dism.exe /online /enable-feature /featurename:Microsoft-windows-subsystem-linux /all /norestart - 重啟系統。
- 從Windows Store安裝Linux發行版,建議選擇Ubuntu。
- 啟動並完成Linux發行版的安裝,設定UNIX使用者帳戶。
- 注意:WSL的執行速度可能會比實際的Linux安裝慢一些。
安裝Ansible
- 更新套件管理器:
sudo apt-get update - 安裝Ansible所需的依賴套件:
sudo apt-get install python3 python3-pip git libffi-dev libssl-dev -y - 使用pip3安裝Ansible:
pip3 install ansible內容解密:
pip3 install ansible命令用於從Python套件索引中安裝Ansible。- Ansible及其依賴套件將被安裝,包括
PyYAML、six、pycparser、cffi、cryptography、MarkupSafe、jinja2等。
- 驗證Ansible是否安裝成功:如果看到類別似
ansible --versionansible 2.9.9的輸出,則表示安裝成功。
設定SSH支援
Ansible使用SSH與其他環境進行通訊,因此需要確保SSH正常運作。
- 安裝OpenSSH伺服器:
sudo apt-get install openssh-server -y - 生成SSH金鑰:接受預設設定後,將在
ssh-keygen -t rsa~/.ssh目錄下生成id_rsa私鑰和id_rsa.pub公鑰。 - 檢視生成的金鑰:
ls -l ~/.ssh - 將公鑰複製到本機(或其他遠端主機):
ssh-copy-id localhost
內容解密:
- SSH金鑰的生成和複製是為了讓Ansible能夠無密碼登入目標主機。
ssh-keygen -t rsa命令用於生成RSA型別的SSH金鑰對。ssh-copy-id localhost命令將公鑰複製到本機(或指定的遠端主機),以便實作無密碼SSH登入。
透過上述步驟,你已經成功安裝了Ansible並設定了SSH支援。接下來,你可以開始使用Ansible進行自動化組態管理。
執行Ansible基本指令與設定SSH連線
設定SSH免密碼登入
為了能夠順暢地使用Ansible進行自動化管理,首先需要設定SSH免密碼登入。以下步驟將指導你完成SSH金鑰的生成和設定。
生成SSH金鑰對:在你的開發環境中執行以下指令來生成SSH金鑰對。
ssh-keygen這個指令會在你的家目錄下的
.ssh資料夾中生成一對金鑰。將公鑰複製到本地主機:由於我們是在本地進行測試,因此需要將公鑰複製到本地主機的
authorized_keys檔案中。cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys這樣就完成了公鑰的安裝。
測試SSH連線:現在,你應該可以透過SSH連線到本地主機而無需輸入密碼。
ssh localhost如果一切正常,你將直接登入到本地主機。
使用Ansible執行第一個指令
安裝好Ansible並設定好SSH後,就可以執行第一個Ansible指令了。
執行Ansible指令:在終端機中執行以下指令。
ansible all -i "localhost," -m shell -a 'echo Ansible is fun'內容解密:
ansible all:指定要對所有在庫存中定義的主機執行指令。-i "localhost,":指定庫存主機列表,在這裡只有localhost。-m shell:指定要使用的模組,這裡使用的是shell模組,用於執行shell指令。-a 'echo Ansible is fun':提供給shell模組的引數,這裡執行的是一個簡單的echo指令。
輸出結果:
localhost | SUCCESS | rc=0 >> Ansible is fun輸出表明指令成功執行,並且傳回了預期的結果。
對多台主機執行Ansible指令
你可以輕易地將指令擴充套件到多台主機,只需要在-i選項後面列出主機名稱或IP即可。
ansible all -i "localhost,127.0.0.1" -m shell -a 'echo Ansible is fun'
內容解密:
- 這裡我們列出了兩台主機:
localhost和127.0.0.1,它們實際上是同一台機器。 - Ansible會對清單中的每一台主機執行指定的指令。
基本Ansible Playbooks介紹
Playbooks是用於定義一系列任務以達到特定狀態的YAML檔案。以下是建立和執行一個簡單Playbook的步驟。
- 建立Playbook檔案:
touch test.yml - 編輯Playbook內容:
- hosts: localhost
tasks:
- name: Run our original Ansible command debug: msg: “Ansible is fun”
- name: We also need to test connectivity ping:
#### 內容解密:
- `
---
`表示這是一個YAML檔案。
- `hosts: localhost`指定了要執行任務的主機。
- `tasks`下面列出了要執行的任務。
- 第一個任務使用`debug`模組輸出訊息。
- 第二個任務使用`ping`模組測試連線性。
3. **執行Playbook**:
```bash
ansible-playbook test.yml -i "localhost,"
內容解密:
ansible-playbook是用於執行Playbook的指令。test.yml是我們剛才建立的Playbook檔案。-i "localhost,"再次指定了要執行的主機。
Ansible 設定與 Inventory 檔案詳解
Ansible 安裝後會提供大量的預設組態,允許使用者根據需求進行調整。瞭解這些組態的優先順序對於有效使用 Ansible 至關重要。
設定檔優先順序
Ansible 會按照以下順序讀取組態:
- 環境變數(ANSIBLE_ENVIRONMENT_VARIABLES):通常以大寫字母表示,Ansible 首先檢查環境變數。
ansible.cfg檔案:位於執行 Ansible 的當前目錄中。.ansible.cfg檔案:通常位於使用者的主目錄中。/etc/ansible/ansible.cfg:系統預設的 Ansible 組態檔案。
在 /etc/ansible/ansible.cfg 中,大多數設定項都是被註解掉的。瞭解組態的優先順序有助於在不同環境或系統中工作時,避免變數覆寫問題。
建立 Inventory 檔案
在之前的範例中,我們直接在命令列中指定了主機的詳細資訊。為了更方便地管理多台主機,我們可以建立一個 inventory 檔案。
- 使用
touch命令建立一個名為hosts的檔案:touch hosts - 使用文字編輯器開啟
hosts檔案,新增主機資訊。 - 將主機分組,例如
[mylaptop]和[webserver],並在組下列出主機的網域名稱或 IP 位址。
[mylaptop]
localhost
[webserver]
127.0.0.1
使用 Inventory 檔案執行 Ansible 命令
建立 inventory 檔案後,可以使用 -i 選項指定該檔案,執行 Ansible 命令:
ansible -i hosts all -m shell -a 'echo Ansible is fun'
也可以指定特定的組,例如 [webserver]:
ansible -i hosts webserver -m shell -a 'echo Ansible is fun'
Ansible 模組詳解
Ansible 提供了超過 1300 個模組,用於執行各種任務。我們已經使用了 shell 模組來執行 Linux 命令。以下是一些常見的模組:
Ping 模組
ping 模組用於測試主機是否可達:
ansible -i hosts mylaptop -m ping
輸出結果如下:
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
版本控制的重要性
隨著組態的增長,將工作置於版本控制之下是非常重要的。可以使用 GitHub 等工具來管理組態和原始碼。
內容解密:
上述範例展示瞭如何使用 Ansible 的 ping 模組測試主機連通性。其中:
ansible -i hosts mylaptop -m ping命令指定了 inventory 檔案hosts,並對mylaptop組中的主機執行ping模組。- 輸出結果中的
"changed": false表示該操作沒有改變主機狀態。 "ping": "pong"表示主機回應了ping請求,確認其可達。
未來趨勢與實務應用評估
Ansible 的強大功能使其成為組態管理的理想工具。掌握 Ansible 的組態和 inventory 檔案的使用,有助於提高自動化管理的效率和準確性。
程式碼邏輯與設計考量
在編寫 Ansible playbook 時,應考慮以下因素:
- 使用適當的模組完成特定任務。
- 正確組態 inventory 檔案,以管理多台主機。
- 利用版本控制系統跟蹤變更。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Ansible快速入門與模組應用詳解
package "Kubernetes Cluster" {
package "Control Plane" {
component [API Server] as api
component [Controller Manager] as cm
component [Scheduler] as sched
database [etcd] as etcd
}
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2
note right of api
核心 API 入口
所有操作經由此處
end note
@enduml此圖示說明瞭Ansible 組態檔案的優先順序和inventory檔案的使用方式。
Ansible模組應用詳解
Ansible 是一款強大的自動化工具,其模組化的設計使得使用者能夠輕鬆地完成各種系統管理任務。在本章中,我們將探討 Ansible 的多個常用模組,並透過實際範例來展示如何使用這些模組來簡化系統管理工作。
Ping 模組
Ping 模組是 Ansible 中最簡單的模組之一,用於測試目標主機的可連線性。
ansible mylaptop -i hosts -m ping
執行結果:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
內容解密:
- 使用
-m ping來指定使用 Ping 模組。 - 輸出結果中的
"changed": false表示此操作未對目標系統做出任何更改。 "ping": "pong"表示目標主機可連線。
Setup 模組
Setup 模組能夠收集目標主機的詳細資訊,包括作業系統、硬體架構等。
ansible mylaptop -i hosts -m setup
執行結果(部分):
"ansible_facts": {
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "03/14/2014",
...
}
內容解密:
- 使用
-m setup來指定使用 Setup 模組。 - 輸出結果包含了豐富的系統資訊,以
ansible_為字首。 - 可用於根據系統資訊進行條件式的操作。
Git 模組
Git 模組允許使用者直接從 Git 倉函式庫佈署軟體。
ansible mylaptop -i hosts -m git -a "repo='https://github.com/vincesesto/markdown-cheatsheet.git' dest=/tmp/markdown-cheatsheet/"
執行結果:
"after": "ecfb900a44a84dcd0d798ad3b0c98ea838ea5668",
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"before": null,
"changed": true
內容解密:
- 使用
-m git指定 Git 模組,並透過-a提供引數。 repo引數指定了 Git 倉函式庫的 URL。dest引數指定了下載程式碼的目的地資料夾。- 如果目的資料夾不存在,Ansible 將自動建立它。
Shell 模組
Shell 模組允許使用者在目標主機上執行 Shell 命令。
ansible mylaptop -i hosts -m shell -a "ls -l /tmp/"
執行結果:
total 8
drwx
---
---
2 root root 4096 Jun 24 14:35 ansible_command_payload_mwym06gg
drwxr-xr-x 3 root root 4096 Jun 24 14:21 markdown-cheatsheet
內容解密:
- 使用
-m shell指定 Shell 模組,並透過-a提供要執行的命令。 - 在此例中,執行了
ls -l /tmp/命令來列出/tmp/目錄下的檔案。
Apt (或 Yum) 模組
Apt 和 Yum 模組用於管理軟體包,適用於不同的 Linux 發行版。
ansible -i hosts mylaptop -m apt -a "name=apache2 state=present"
執行結果(部分):
"cache_update_time": 1592964803,
"cache_updated": false,
"changed": true,
...
內容解密:
- 使用
-m apt指定 Apt 模組,用於 Debian/Ubuntu 系統。 name引數指定了要安裝的軟體包名稱。state=present表示確保該軟體包已安裝。
Service 模組
Service 模組用於管理系統服務。
ansible -i hosts mylaptop -m service -a "name=apache2 state=started"
執行結果:
"changed": false,
"name": "apache2",
"state": "started"
內容解密:
- 使用
-m service指定 Service 模組。 name引數指定了要管理的服務名稱。state=started表示確保該服務正在執行。
Get_url 模組
Get_url 模組用於從網際網路上下載檔案。
ansible -i hosts mylaptop -m get_url -a "url=http://localhost dest=/tmp/"
執行結果:
"changed": true,
"checksum_dest": null,
"checksum_src": "07993837ce7f0273a65b20db8ee9b24823da7e1e",
"dest": "/tmp/index.html",
...
內容解密:
- 使用
-m get_url指定 Get_url 模組。 url引數指定了要下載的檔案的 URL。dest引數指定了下載檔案的目的地路徑。
透過上述範例,我們可以看到 Ansible 的各種模組如何幫助我們簡化系統管理工作,從測試連線、收集系統資訊,到佈署軟體、管理服務等,Ansible 都提供了強大的支援。這些模組的靈活運用,可以大大提高 IT 管理的效率和自動化水平。