今天來介紹一下常在公司使用來部署 code 到 prod 的工具 Ansible!
Ansible is an open source IT automation engine that automates provisioning, configuration management, application deployment, orchestration, and many other IT processes.
簡單來說 Ansible 就是一個自動化組態管理工具,主要是用 Python 寫的
根據官方文件的介紹有幾個主要的 use case,它可以做到
Ansible 在設計上就遵守以下準則:
Agent-less architecture
避免在 IT 基礎設施上安裝額外的軟體,降低維護成本。
Simplicity
自動化 Playbook 使用簡單明瞭的 YAML 語法,程式碼讀起來就像文件一樣。Ansible 也是去中心化的,透過 SSH 存取遠端機器。
Scalability and flexibility
透過模組化設計,能輕鬆快速擴展自動化的系統,支援多種平台和系統。
Idempotence and predictability
具有冪等性。即使多次執行 Playbook,Ansible 也不會進行任何變動。
可以想像成一本結合很多 Play (劇本)和 task (任務)的書。
可以管理 node ,執行各種 task 和 play。
每個 Playbook 都是以 .yaml 格式編輯的文件。
可以結合 Jinja2 模板進行編輯。
Play 通常用於特定目的,就像一本劇本一樣,指示系統執行一系列動作。
E.g.:
health_check
(檢查系統是否正常)database_setting
(資料庫的設定)Task 定義了 Play 中的步驟。
E.g.:
Install the postgresql
(安裝 postgresql) 這就可能是 database setting 中會執行的其中一個步驟name: Install database
apt:
pkg:
-postgresql
state: preset
create work directory
(建立工作資料夾)Role(角色) 是一種將 Playbook 的任務進行結構化和模組化的方法,你可以把他想像成負責出演劇本的演員,每個演員專注於某個特定的任務,它們分工合作來完成一個大型的自動化任務。通過使用 Role,我們可以將複雜的 Playbook 拆解成更小的單元,提高可維護和可重用性。
一般來說會有一個 roles 的資料夾,裡面會把不同服務或應用區分開來,如 database
這個角色就只會安裝、設定和重啟資料庫服務的 tasks。
同
roles/
└── database/
├── tasks/
Inventory 是定義和管理遠端伺服器或節點的地方,Ansible 透過它來知道哪些機器需要進行操作。
all: vars
這裡定義一些 global varibledatabase
、backend
為 主機組,每一組主機可以有多個主機,如 backend-1
、backend-2
,不同的主機組可以執行不同的 task。[all: vars]
ansible_host=192.168.1.247
[database]
database-1
[backend]
backend-1
模組是 Ansible 提供的操作方法,用於完成具體的任務。
他有提供一些常用的指令像是 create workdir
除了使用 command: 直接下指令外也可以使用內建的 file 模組
# command 的方法
command: mkdir {{folder)name}}
# 內建模組的方法
file:
path: {{work_dir}}
state: directory
mode: 0755
# 使用 apt 套件安裝 postgresql
apt: pkg=postgresql state=present
Ansible 有許多模組可以使用,更多詳細的可以查看 官方文件