Ansible 作為一個無代理的自動化工具,簡化了系統管理的複雜性。在缺乏 Python 的系統上,我們可以透過 yum、dnf 或 apt 等套件管理器安裝 Python,或使用 raw 模組執行 shell 命令來安裝。設定 Ansible 時,除了設定 SSH 連線外,也可以自訂 inventory 檔案來管理主機。Ansible 的核心概念包含模組、外掛程式和 Playbook。模組負責執行特定任務,外掛程式擴充套件 Ansible 功能,而 Playbook 則以 YAML 語法定義自動化流程。

使用Ansible的基礎 Chapter 1

在前面的章節中,我們討論了Ansible的基本設定和管理節點的連線。然而,有些作業系統映像檔可能缺乏Python,這是Ansible運作的必要條件。幸好,Ansible提供了一些方法來處理這種情況。

在缺乏Python的系統上安裝Python

如果您正在使用缺乏Python的作業系統映像檔,以下命令提供了一個快速來安裝Python:

在較舊的Fedora和CentOS/RHEL 7及以下版本上,可以使用yum安裝Python:

$ sudo yum -y install python

在RHEL和CentOS版本8以及更新的Fedora版本上,您需要使用dnf套件管理器:

$ sudo dnf install python

您也可以安裝特定版本的Python,例如:

$ sudo dnf install python37

在Debian和Ubuntu系統上,您需要使用apt套件管理器來安裝Python:

$ sudo apt-get update
$ sudo apt-get install python3.6

內容解密:

  1. 使用yum安裝Python:在較舊的Linux發行版上,yum是預設的套件管理器,用於安裝軟體套件。
  2. 使用dnf安裝Python:在較新的Linux發行版上,dnf取代了yum成為預設的套件管理器。
  3. 指定Python版本:根據您的需求,您可以安裝特定版本的Python。
  4. 使用apt安裝Python:在Debian和Ubuntu系統上,apt是用於安裝軟體套件的套件管理器。

使用raw模組安裝Python

Ansible的ping模組不僅檢查與受管主機的連線和身份驗證,還使用受管主機上的Python環境執行一些基本的主機檢查。如果Python未安裝,則會傳回失敗結果。

幸好,Ansible提供了raw模組,可以在沒有Python的受管節點上執行原始shell命令。這使得您可以使用Ansible在多台機器上安裝Python,或執行整個shell指令碼來引導受管節點。

以下是一些Ansible playbook中的任務範例,用於引導受管節點並準備Ansible管理:

- name: Bootstrap a host without python2 installed
  raw: dnf install -y python2 python2-dnf libselinux-python

- name: Run a command that uses non-posix shell-isms 
  raw: cat < /tmp/*txt
  args:
    executable: /bin/bash

- name: safely use templated variables
  raw: "{{package_mgr|quote}} {{pkg_flags|quote}} install {{python|quote}}"

內容解密:

  1. 引導未安裝Python的節點:使用raw模組在受管節點上安裝Python。
  2. 執行非POSIX shell命令:使用raw模組執行需要特定shell環境的命令。
  3. 安全地使用範本變數:使用quote過濾器避免注入問題。

從原始碼執行Ansible

Ansible不斷演進,您可能需要執行最新的開發版本。您可以直接從GitHub克隆原始碼並進行設定。

首先,從GitHub克隆Ansible原始碼:

$ git clone https://github.com/ansible/ansible.git --recursive
$ cd ./ansible

然後,設定您的shell環境:

$ source ./hacking/env-setup

對於Fish shell,使用:

$ source ./hacking/env-setup.fish

接下來,安裝pip和所需的Python套件:

$ sudo easy_install pip
$ sudo pip install -r ./requirements.txt

內容解密:

  1. 克隆Ansible原始碼:從GitHub下載最新的Ansible原始碼。
  2. 設定shell環境:使用env-setup指令碼設定您的shell環境以執行Ansible。
  3. 安裝pip和依賴套件:使用pip安裝Ansible所需的Python套件。

指定自定義Inventory檔案

預設情況下,Ansible使用/etc/ansible/hosts作為inventory檔案。您可以透過設定ANSIBLE_INVENTORY環境變數來指定自定義inventory檔案:

$ echo "ap1.example.com" > ~/my_ansible_inventory
$ export ANSIBLE_INVENTORY=~/my_ansible_inventory

內容解密:

  1. 建立自定義inventory檔案:建立一個包含受管主機清單的檔案。
  2. 設定ANSIBLE_INVENTORY環境變數:指定自定義inventory檔案的位置。

Ansible 基礎入門與技術解析

初探 Ansible 的安裝與設定

Ansible 是一種強大且靈活的自動化工具,其關鍵優勢在於無需代理程式的架構和簡單的安裝流程。正確安裝與設定 Ansible 是進行自動化管理的第一步。

安裝與更新 Ansible

若要從原始碼安裝 Ansible,需先從 GitHub 取得原始碼。安裝步驟如下:

  1. 將 Ansible 原始碼複製到本地端:git clone https://github.com/ansible/ansible.git
  2. 切換到 Ansible 目錄並設定環境變數,以便執行 Ansible 指令。
  3. 若要更新現有的 Ansible 原始碼,可使用 git pull --rebasegit submodule update --init --recursive 指令。

執行臨時命令(ad hoc command)時,需指定 Ansible 的絕對路徑,例如:~/ansible/bin/ansible all -m ping

SSH 與 WinRM 設定

Ansible 需透過 SSH 或 WinRM 連線受控節點(managed nodes)。正確設定 SSH 金鑰或 WinRM 連線是確保 Ansible 自動化順利執行的關鍵。

Ansible 的核心概念與元件

Ansible 的核心運作依賴於模組(modules),這些模組負責執行實際的自動化任務。除了模組外,Ansible 還包含外掛程式(plugins)和動態清單管理(dynamic inventory management),這些元件共同協助完成自動化任務。

Ansible 的運作架構

  1. 模組(Modules):執行具體任務的程式,如檔案管理、套件安裝等。
  2. 外掛程式(Plugins):擴充套件 Ansible 功能的元件,用於支援更多功能。
  3. Playbooks:以 YAML 語法撰寫的自動化指令碼,用於定義複雜的自動化流程。

程式碼解析

---
- name: Test Ansible ad hoc command
  hosts: all
  tasks:
    - name: Ping all hosts
      ping:

詳細解說:

  1. **`

**: YAML 檔案起始標記。 2. **- name**: 定義 Playbook 的名稱。 3. **hosts: all**: 指定該 Playbook 執行於所有主機。 4. **tasks**: 定義要執行的任務列表。 5. **ping:**: 使用 ping` 模組測試連線。

Ansible基礎入門:第二章節重點解析

確認Ansible版本與SSH連線設定

要使用Ansible的ad hoc命令從控制機器連線到多台遠端主機,首先需要確保控制主機上安裝了最新版本的Ansible。可以使用以下命令確認Ansible版本:

$ ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = 
[u'/home/jamesf_local/.ansible/plugins/modules',
u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.17 (default, Nov 7 2019, 10:07:09) [GCC 9.2.1 20191008]

內容解密:

  1. ansible --version用於檢查當前安裝的Ansible版本。
  2. config file顯示Ansible的設定檔位置。
  3. configured module search path列出Ansible搜尋模組的路徑。
  4. ansible python module location指出Ansible Python模組的位置。
  5. executable location顯示Ansible執行檔的位置。
  6. python version顯示執行Ansible的Python版本。

設定SSH連線與測試連通性

確保與每一台遠端主機的SSH連線正常,可以手動測試SSH連線:

$ ssh <username>@frontend.example.com

內容解密:

  1. <username>需要替換為實際的使用者名稱。
  2. frontend.example.com是遠端主機的網域名稱或IP位址。
  3. 初次連線時,可能會出現確認主機金鑰的提示,輸入yes繼續。

編輯Inventory檔案與新增主機

編輯預設的Inventory檔案(/etc/ansible/hosts),新增需要管理的主機:

frontend.example.com
backend1.example.com
backend2.example.com

內容解密:

  1. 每行新增一台主機,可以使用網域名稱或IP位址。
  2. 確保主機名稱可解析(具有DNS記錄或在/etc/hosts中)。

測試主機連通性

使用ping命令測試主機是否可達:

$ ping frontend.example.com
PING frontend.example.com (192.168.1.52): 56 data bytes
64 bytes from 192.168.1.52: icmp_seq=0 ttl=64 time=0.040 ms
64 bytes from 192.168.1.52: icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from 192.168.1.52: icmp_seq=2 ttl=64 time=0.097 ms
64 bytes from 192.168.1.52: icmp_seq=3 ttl=64 time=0.130 ms

內容解密:

  1. ping命令用於測試網路連通性。
  2. 回應顯示遠端主機的IP位址和回應時間。

建立SSH金鑰對與分發公鑰

生成SSH金鑰對以實作免密碼登入:

$ ssh-keygen

內容解密:

  1. ssh-keygen命令用於生成新的SSH金鑰對。
  2. 留空密碼短語以避免每次使用Ansible時都需要輸入密碼。

將公鑰複製到遠端主機:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub frontend.example.com

內容解密:

  1. ssh-copy-id命令用於將公鑰安裝到遠端主機。
  2. 需要輸入遠端主機的使用者密碼以完成安裝。

使用Ansible進行Ping測試

使用Ansible的ping模組測試主機連通性:

$ ansible all -i hosts -m ping
frontend.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
backend1.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

內容解密:

  1. ansible all表示對Inventory檔案中的所有主機執行操作。
  2. -i hosts指定Inventory檔案的位置。
  3. -m ping指定使用ping模組測試連通性。
  4. 回應中的"ping": "pong"表示主機可達。

理解Ansible基礎 Chapter 2

在前一章節中,我們成功地使用Ansible的Ad Hoc命令對多台主機進行了操作。現在,讓我們更深入地瞭解Ansible的工作原理及其各個組成部分。

使用Ad Hoc命令與主機通訊

當我們使用Ansible的Ad Hoc命令時,例如使用ansible命令對主機進行ping操作,我們會得到類別似以下的輸出結果:

backend1.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
backend2.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

這個輸出結果是Ansible在預設的詳細程度下生成的。如果在執行過程中遇到問題,可以透過增加-v引數來提高Ansible的詳細程度,以便於除錯。對於大多數問題,建議使用-vvvv引數,這將提供豐富的除錯資訊,包括原始的SSH命令及其輸出結果。

內容解密:

  • backend1.example.combackend2.example.com 是被管理的節點主機名。
  • SUCCESS 表示操作成功。
  • "changed": false 表示該操作沒有對主機進行任何更改。
  • "ping": "pong" 是ping操作的傳回結果,表示主機可連線。

深入瞭解Ansible的組成部分

要了解Ansible的各個組成部分,首先需要建立一個inventory檔案。這個檔案包含了我們要管理的主機列表。假設我們有以下inventory檔案內容:

remote1.example.com
remote2.example.com
remote3.example.com

建立第一個Ansible Playbook

Playbook是Ansible的核心,它定義了一系列的任務和組態。讓我們建立第一個Playbook:

---
- name: 我的第一個Ansible Playbook
  hosts: all
  become: yes

  tasks:
  - name: 更新Apache Web伺服器到最新版本
    yum:
      name: httpd
      state: latest
    notify:
      - 重新啟動Apache Web伺服器

  handlers:
  - name: 重新啟動Apache Web伺服器
    service:
      name: httpd
      state: restarted

內容解密:

  1. **`

**: 表示YAML檔案的開始。 2. **name**: 定義了Playbook的名稱。 3. **hosts: all**: 指定該Playbook將在inventory中的所有主機上執行。 4. **become: yes**: 表示以超級使用者(通常是root)身份執行任務。 5. **tasks`**: 定義了一系列要執行的任務。

  • yum模組: 用於管理RPM軟體包,這裡用於更新Apache到最新版本。
  • notify: 當前任務發生變化時,通知指定的handler。
  1. handlers: 定義了一系列只有在被通知時才執行的任務。
    • service模組: 用於管理服務,這裡用於重新啟動Apache服務。

當執行這個Playbook時,Ansible會在指定的主機上更新Apache軟體包,並在必要時重新啟動Apache服務。