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
內容解密:
- 使用yum安裝Python:在較舊的Linux發行版上,yum是預設的套件管理器,用於安裝軟體套件。
- 使用dnf安裝Python:在較新的Linux發行版上,dnf取代了yum成為預設的套件管理器。
- 指定Python版本:根據您的需求,您可以安裝特定版本的Python。
- 使用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}}"
內容解密:
- 引導未安裝Python的節點:使用raw模組在受管節點上安裝Python。
- 執行非POSIX shell命令:使用raw模組執行需要特定shell環境的命令。
- 安全地使用範本變數:使用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
內容解密:
- 克隆Ansible原始碼:從GitHub下載最新的Ansible原始碼。
- 設定shell環境:使用env-setup指令碼設定您的shell環境以執行Ansible。
- 安裝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
內容解密:
- 建立自定義inventory檔案:建立一個包含受管主機清單的檔案。
- 設定ANSIBLE_INVENTORY環境變數:指定自定義inventory檔案的位置。
Ansible 基礎入門與技術解析
初探 Ansible 的安裝與設定
Ansible 是一種強大且靈活的自動化工具,其關鍵優勢在於無需代理程式的架構和簡單的安裝流程。正確安裝與設定 Ansible 是進行自動化管理的第一步。
安裝與更新 Ansible
若要從原始碼安裝 Ansible,需先從 GitHub 取得原始碼。安裝步驟如下:
- 將 Ansible 原始碼複製到本地端:
git clone https://github.com/ansible/ansible.git - 切換到 Ansible 目錄並設定環境變數,以便執行 Ansible 指令。
- 若要更新現有的 Ansible 原始碼,可使用
git pull --rebase和git 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 的運作架構
- 模組(Modules):執行具體任務的程式,如檔案管理、套件安裝等。
- 外掛程式(Plugins):擴充套件 Ansible 功能的元件,用於支援更多功能。
- Playbooks:以 YAML 語法撰寫的自動化指令碼,用於定義複雜的自動化流程。
程式碼解析
---
- name: Test Ansible ad hoc command
hosts: all
tasks:
- name: Ping all hosts
ping:
詳細解說:
- **`
**: 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]
內容解密:
ansible --version用於檢查當前安裝的Ansible版本。config file顯示Ansible的設定檔位置。configured module search path列出Ansible搜尋模組的路徑。ansible python module location指出Ansible Python模組的位置。executable location顯示Ansible執行檔的位置。python version顯示執行Ansible的Python版本。
設定SSH連線與測試連通性
確保與每一台遠端主機的SSH連線正常,可以手動測試SSH連線:
$ ssh <username>@frontend.example.com
內容解密:
<username>需要替換為實際的使用者名稱。frontend.example.com是遠端主機的網域名稱或IP位址。- 初次連線時,可能會出現確認主機金鑰的提示,輸入
yes繼續。
編輯Inventory檔案與新增主機
編輯預設的Inventory檔案(/etc/ansible/hosts),新增需要管理的主機:
frontend.example.com
backend1.example.com
backend2.example.com
內容解密:
- 每行新增一台主機,可以使用網域名稱或IP位址。
- 確保主機名稱可解析(具有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
內容解密:
ping命令用於測試網路連通性。- 回應顯示遠端主機的IP位址和回應時間。
建立SSH金鑰對與分發公鑰
生成SSH金鑰對以實作免密碼登入:
$ ssh-keygen
內容解密:
ssh-keygen命令用於生成新的SSH金鑰對。- 留空密碼短語以避免每次使用Ansible時都需要輸入密碼。
將公鑰複製到遠端主機:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub frontend.example.com
內容解密:
ssh-copy-id命令用於將公鑰安裝到遠端主機。- 需要輸入遠端主機的使用者密碼以完成安裝。
使用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"
}
內容解密:
ansible all表示對Inventory檔案中的所有主機執行操作。-i hosts指定Inventory檔案的位置。-m ping指定使用ping模組測試連通性。- 回應中的
"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.com和backend2.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
內容解密:
- **`
**: 表示YAML檔案的開始。 2. **name**: 定義了Playbook的名稱。 3. **hosts: all**: 指定該Playbook將在inventory中的所有主機上執行。 4. **become: yes**: 表示以超級使用者(通常是root)身份執行任務。 5. **tasks`**: 定義了一系列要執行的任務。
yum模組: 用於管理RPM軟體包,這裡用於更新Apache到最新版本。notify: 當前任務發生變化時,通知指定的handler。
handlers: 定義了一系列只有在被通知時才執行的任務。service模組: 用於管理服務,這裡用於重新啟動Apache服務。
當執行這個Playbook時,Ansible會在指定的主機上更新Apache軟體包,並在必要時重新啟動Apache服務。