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

  1. 以系統管理員身分開啟PowerShell,執行以下命令來啟用WSL功能:
    dism.exe /online /enable-feature /featurename:Microsoft-windows-subsystem-linux /all /norestart
    
  2. 重啟系統
  3. 從Windows Store安裝Linux發行版,建議選擇Ubuntu。
  4. 啟動並完成Linux發行版的安裝,設定UNIX使用者帳戶。
  5. 注意:WSL的執行速度可能會比實際的Linux安裝慢一些。

安裝Ansible

  1. 更新套件管理器
    sudo apt-get update
    
  2. 安裝Ansible所需的依賴套件
    sudo apt-get install python3 python3-pip git libffi-dev libssl-dev -y
    
  3. 使用pip3安裝Ansible
    pip3 install ansible
    

    內容解密:

    • pip3 install ansible 命令用於從Python套件索引中安裝Ansible。
    • Ansible及其依賴套件將被安裝,包括PyYAMLsixpycparsercfficryptographyMarkupSafejinja2等。
  4. 驗證Ansible是否安裝成功
    ansible --version
    
    如果看到類別似 ansible 2.9.9 的輸出,則表示安裝成功。

設定SSH支援

Ansible使用SSH與其他環境進行通訊,因此需要確保SSH正常運作。

  1. 安裝OpenSSH伺服器
    sudo apt-get install openssh-server -y
    
  2. 生成SSH金鑰
    ssh-keygen -t rsa
    
    接受預設設定後,將在~/.ssh目錄下生成id_rsa私鑰和id_rsa.pub公鑰。
  3. 檢視生成的金鑰
    ls -l ~/.ssh
    
  4. 將公鑰複製到本機(或其他遠端主機)
    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金鑰的生成和設定。

  1. 生成SSH金鑰對:在你的開發環境中執行以下指令來生成SSH金鑰對。

    ssh-keygen
    

    這個指令會在你的家目錄下的.ssh資料夾中生成一對金鑰。

  2. 將公鑰複製到本地主機:由於我們是在本地進行測試,因此需要將公鑰複製到本地主機的authorized_keys檔案中。

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    

    這樣就完成了公鑰的安裝。

  3. 測試SSH連線:現在,你應該可以透過SSH連線到本地主機而無需輸入密碼。

    ssh localhost
    

    如果一切正常,你將直接登入到本地主機。

使用Ansible執行第一個指令

安裝好Ansible並設定好SSH後,就可以執行第一個Ansible指令了。

  1. 執行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指令。
  2. 輸出結果

    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'

內容解密:

  • 這裡我們列出了兩台主機:localhost127.0.0.1,它們實際上是同一台機器。
  • Ansible會對清單中的每一台主機執行指定的指令。

基本Ansible Playbooks介紹

Playbooks是用於定義一系列任務以達到特定狀態的YAML檔案。以下是建立和執行一個簡單Playbook的步驟。

  1. 建立Playbook檔案
    touch test.yml
    
  2. 編輯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 會按照以下順序讀取組態:

  1. 環境變數(ANSIBLE_ENVIRONMENT_VARIABLES):通常以大寫字母表示,Ansible 首先檢查環境變數。
  2. ansible.cfg 檔案:位於執行 Ansible 的當前目錄中。
  3. .ansible.cfg 檔案:通常位於使用者的主目錄中。
  4. /etc/ansible/ansible.cfg:系統預設的 Ansible 組態檔案。

/etc/ansible/ansible.cfg 中,大多數設定項都是被註解掉的。瞭解組態的優先順序有助於在不同環境或系統中工作時,避免變數覆寫問題。

建立 Inventory 檔案

在之前的範例中,我們直接在命令列中指定了主機的詳細資訊。為了更方便地管理多台主機,我們可以建立一個 inventory 檔案。

  1. 使用 touch 命令建立一個名為 hosts 的檔案:touch hosts
  2. 使用文字編輯器開啟 hosts 檔案,新增主機資訊。
  3. 將主機分組,例如 [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 管理的效率和自動化水平。