Ansible 是一個用來部屬以及管理 server 的工具,使用者只需要寫好設定檔即可輕鬆完成部屬,他跟 Docker 有點像,只不過 Docker 會由 Docker 的程式去開啟及分配 Contriner,而 Ansible 則是直接去進行下指令之類的動作。
Playbook
每一份設定檔都稱為一個 Playbook,裡面包含了許多的 Play,每一個 Play 會包含許多的 Task 以及 Handler。
Task & Handler
每一個 Task 跟 Handler 都會去執行一個 Module(或指令)
Task 跟 Handler 放在同一層,但是 Handler 需要被 Task 去 Notify 才會執行相關命令
Modules
每一個 Task 中都可以去呼叫 module 進行相關動作,舉例來說 yum 跟 apt module 可以進行安裝 package 的動作,copy 可以做 cp 指令,template 跟 copy 有異曲同工之妙,不同的點是他有會套用到變數資訊,比較有彈性。
目前官方擁有的 module 約 200 多個(不確定),有些 module 不見得是對應到 linux 內建指令,例如說他們也有 docker module 跟 ec2 module 等等。
Vars
Play 當中可以包含變數,這樣有些東西就不用重複去撰寫,變數可以來自 Playbook、Inventory、Command line、Facts
在 Command line 中使用變數可以用 ansible -e “some_var=some_val”
如果將變數寫在檔案中,則可以向這樣寫:
---
# Http Port
http_port: 80
# 從 fact 抓
ipv4: "{{ ansible_default_ipv4.address }}"
如果要在 Playbook 或是其他檔案中使用變數,則需要加上雙引號「””」,但是在 template 中則不需要
Facts
Fact 有點像是一台機器裡面所有 Ansible 的設定檔、系統資料等等
下面以 Nginx server 例子來說明:
---
- name: Nginx config and play
hosts: 192.168.0.1
remote_user: "{{ uservar }}"
sudo: true
sudo_user: root
vars:
http_port: 80
tasks:
- name: ensure Nginx is installed
apt: name=nginx state=present
- name: write config file
template: src=template/nginx.j2 dst=/etc/nginx/nginx.conf
notify:
- reload nginx
- name: ensure nginx is running
service: name=nginx state=started
handlers:
- name: reload nginx
service: name=nginx state=reloaded
而 template/nginx.j2 可能就可以寫成:
# 前略
server {
listen {{ http_port }}
# 後略