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 }}
    # 後略

Share Your Thought