前言
Ansible 是一個在 Python 環境下的自動化組態管理工具,使用 ssh 連線,被操控端的機器不需要額外安裝其他東西,也就是 agent-less。
專案架構
範例檔案架構:
.
├── ansible.cfg
├── inventory/
├── playbooks/
└── roles/
└── hello_world/
├── tasks/
│ └── main.yml
└── vars/
└── main.yml
在一個典型的 Ansible 專案中,會有以下幾個主要文件和目錄:
ansible.cfg:這是 Ansible 的設定文件,用於設置一些全域參數,比如 inventory 文件的路徑、遠端用戶名、模組路徑等。inventory(或hosts):定義受管理主機的文件,並以適當的方式分群分組。可以是.ini或.yaml格式。playbooks:中文直翻為「劇本」。顧名思義,這個檔案紀錄了做事的方式以及流程。通常使用 YAML 格式撰寫。roles:這是一種結構化的方式來組織 playbooks,讓程式碼更易於重用和維護。Roles 包含了任務、變數、文件、模板、處理程序和其他資源。group_vars和host_vars:這些目錄和文件用於定義針對特定主機或主機群組的變數。
Playbook
中文直翻為「劇本」,顧名思義,這個檔案紀錄了做事的方式以及流程,從上到下順序執行完成目標。一個 Playbook 包含一個或多個 Plays,通常使用 YAML 格式撰寫。
範例 playbook:
---
- name: Install and configure web server # Play 1
hosts: webservers
become: yes
tasks:
- name: Install Apache # Task 1
apt:
name: apache2
state: present
- name: Copy the Apache config file # Task 2
template:
src: templates/apache2.conf.j2
dest: /etc/apache2/apache2.conf
notify: # Notify handler
- Apache Config Changed
handlers:
- name: Apache Config Changed # Handler 1
service:
name: apache2
state: restarted$ ansible-playbook -i inventory.ini playbook.yamlPlay
Ansible execution 的基本單位,定義了 Host 該執行什麼任務 (Task)。
Play 由一個或一系列的任務組成,從上到下順序執行,並且指定了目標主機。
Templating
可以使用 Jinja2 撰寫範本,通常會將範本存在 template/ 資料夾下,副檔名為 .j2
Task
任務是 Ansible 的基本單位,一個 task 通常對應一個模組取用。每個任務都會執行一個模組並指定模組的參數。
Task 可以是 raw command (command)、ansible.builtin collection 中的模組 (ex: ansible.builtin.dnf) 等等
Idempotence
Automation with Ansible — Ansible’s Idempotence | by Akshaya Balaji | Medium
使用 command 和 shell 要小心 Idempotence 的問題:
Idempotence 原為數學概念,可以多次請求,而不會改變初始請求以外的結果
套用在 ansible 上代表著:執行任何任務時,都會對目標節點的狀態進行所需的更改,並且在目標節點重複此任務不會導致目標節點的狀態發生任何變化。
Delegate
Controlling where tasks run: delegation and local actions — Ansible Community Documentation
中文直接翻譯為「委派」,是指將某個 task 的執行交由特定的主機來執行,而不是目前 play 中的目標主機。
delegate_to: localhost 可以讓該 task 在本地執行,或是使用縮寫 local_action
ansible-playbook playbook.yml --connection=local 可以在 local 執行 Playbook
Handler
特殊型態的 Task,當前一個 task 的狀態是 changed 時,會被通知執行,詳見 Handler。
Inventory
Build Your Inventory — Ansible Community Documentation
How to build your inventory — Ansible Community Documentation
定義受管理主機的文件,並以適當的方式分群分組。可以是 .ini 或 .yaml 格式。
ungrouped:
hosts:
mail.example.com:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com預設群組
即使沒有定義群組,Ansible 也會建立兩個預設群組: all 和 ungrouped,分別是所有機器和沒有被分類到的機器,故所有機器最少會被分類到兩個群組:all 和 ungrouped 或 all 和 group_name。
分組
一台主機可以存在於多個群組裡,例如一台正式環境的網頁伺服器,可以被分類到 web_server 和 prod 群組。以下是分組的衡量指標:
- What:跑什麼應用,如網頁伺服器、資料庫…等
- Where:地理位置,如
east、west - When:開發階段,如
prod、uat、test
子母群組
ini 語法可使用 :children 後綴,yaml 語法可使用 children:
east:
hosts:
foo.example.com:
one.example.com:
two.example.com:
west:
hosts:
bar.example.com:
three.example.com:
prod:
children:
east:
test:
children:
west:多主機語法
- 連續數字
[webservers]
www[01:50].example.com
# www01.example.com, www02.example.com, ... , www50.example.com- 連續數字有跨度
[webservers]
www[01:50:2].example.com
# www01.example.com, www03.example.com, ... , www49.example.com- 字母順序
[databases]
db-[a:f].example.com
# db-a.example.com, db-b.example.com, ... , db-f.example.com特殊變數
Ansible 有內建一些變數,有些是可改的,有些是預設變數名,例如:
ansible_user:Ansible 用來登入遠端機器的使用者名稱ansible_facts:Ansible 取得的 Facts- … 等
設定檔
Ansible Configuration Settings — Ansible Community Documentation
// TODO
其他常見關鍵字
- Control node:執行 Ansible CLI 的機器
- Managed nodes:也被稱為
hosts、目標機器。 - Facts:Facts 是由 Ansible 收集的目標主機的資訊,如作業系統類型、IP 位址等。這些資訊可以在 Playbook 中使用
- Variable:變數用於存取和傳遞數據,可以在 Playbooks、Roles、和模組中使用。
- Vault:Vault
Collection
collection 是一組相關資源的集合包,包含但不限於:
- modules(模組)
- plugins(像是 callback、filter、inventory、lookup 等)
- roles
- playbooks
- doc 與測試
Collection 的命名方式:
<namespace>.<collection_name>
查看 collection 提供了什麼模組:
ansible-doc -l -t module -C community.general安裝 Collection:
ansible-galaxy collection install community.generalModule
Using Ansible modules and plugins — Ansible Community Documentation
模組是 Ansible 用來執行實際任務的單元,例如安裝軟體、管理文件、執行命令等。Ansible 有許多內建的模組,也支援第三方模組。