前言

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_varshost_vars:這些目錄和文件用於定義針對特定主機或主機群組的變數。

Playbook

中文直翻為「劇本」,顧名思義,這個檔案紀錄了做事的方式以及流程,從上到下順序執行完成目標。一個 Playbook 包含一個或多個 Plays,通常使用 YAML 格式撰寫。

範例 playbook:

playbook.yaml
---
- 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.yaml

Play

Ansible execution 的基本單位,定義了 Host 該執行什麼任務 (Task)。

Play 由一個或一系列的任務組成,從上到下順序執行,並且指定了目標主機。

Templating

Templating (Jinja2) — Ansible Community Documentation

可以使用 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 格式。

hosts.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:
hosts.ini
mail.example.com
 
[webservers]
foo.example.com
bar.example.com
 
[dbservers]
one.example.com
two.example.com
three.example.com

預設群組

即使沒有定義群組,Ansible 也會建立兩個預設群組: allungrouped,分別是所有機器和沒有被分類到的機器,故所有機器最少會被分類到兩個群組:allungroupedallgroup_name

分組

一台主機可以存在於多個群組裡,例如一台正式環境的網頁伺服器,可以被分類到 web_serverprod 群組。以下是分組的衡量指標:

  • What:跑什麼應用,如網頁伺服器、資料庫…等
  • Where:地理位置,如 eastwest
  • When:開發階段,如 produattest

子母群組

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:

多主機語法

  1. 連續數字
[webservers]
www[01:50].example.com
# www01.example.com, www02.example.com, ... , www50.example.com
  1. 連續數字有跨度
[webservers]
www[01:50:2].example.com
# www01.example.com, www03.example.com, ... , www49.example.com
  1. 字母順序
[databases]
db-[a:f].example.com
# db-a.example.com, db-b.example.com, ... , db-f.example.com

特殊變數

Special Variables — Ansible Community Documentation

Ansible 有內建一些變數,有些是可改的,有些是預設變數名,例如:

  • ansible_user:Ansible 用來登入遠端機器的使用者名稱
  • ansible_facts:Ansible 取得的 Facts
  • … 等

設定檔

Ansible Configuration Settings — Ansible Community Documentation

// TODO

其他常見關鍵字

Glossary — Ansible Community Documentation

  • 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.general

Module

Using Ansible modules and plugins — Ansible Community Documentation

模組是 Ansible 用來執行實際任務的單元,例如安裝軟體、管理文件、執行命令等。Ansible 有許多內建的模組,也支援第三方模組。