about 4 years ago

前篇:自動化利器 Ansible 簡介,簡單的說明了 Ansible 單一指令的使用方式。但是,單一指令是讓你熟悉、測試功能時使用。想要自動化,我們需要將這些指令寫成一個劇本 (Playbook),讓 ansible 替我們去執行。

特色

  1. 以 YAML 作為語法
  2. 可以使用 jinja2 來使用變數

實際操作

例子

首先,先建立 hosts

hosts
[test]
172.16.11.11

接著,從一個簡單的例子開始:

my_tasks.yml
---

# Goal: Install virtualenv on managed server



- hosts: test

  remote_user: root

  vars:

    - project_name: "TestAnsible"

  tasks:

    - name: Install python virtualenv

      action: apt pkg=python-virtualenv state=present


    - name: Create my project folder

      action: shell mkdir {{project_name}}


說明

其實,光看這個 Playbook 大概就能推敲出一些結論:

  1. 我們要在 test 執行這個劇本。test 或許是一個節點,當然也可能是一群節點。test 的定義來自於 hosts ,也就是前篇提過的 Inventory。
  2. 我們要用 root 來登入,並執行這些工作 (task)
  3. 這個劇本有一個 project_name 的變數
  4. 我們的工作有 2 個,分別是 安裝套件 以及 建立目錄

執行

最後,執行這個劇本:

$ ansible-playbook -i hosts my_tasks.yml

沒錯誤的話,會得到下面結果

PLAY [test] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [172.16.11.11]

TASK: [Install python virtualenv] *********************************************
ok: [172.16.11.11]

TASK: [Create my project folder] **********************************************
changed: [172.16.11.11]

PLAY RECAP ********************************************************************
172.16.11.11               : ok=3    changed=1    unreachable=0    failed=0

工作 (Task)

tasks 區塊的每一個項目,都是一個工作 (廢話)。主要的屬性有:

  1. name - 這只是一個描述,說明了這個工作想要做什麼。
  2. action - task 實際上會去,遠端執行的工作。第一個變數來自於 ansible 的 module ,接著會是 module 的參數。

以第一個工作 apt 為例,想當然爾就是 apt-getpkg 是我想操作的套件,state 是這個套件的狀態,是要存在 (present) 呢?還是不存在 (absent)?可以依照實際需求去設定。

第二個工作,是大家相對比較熟悉的 shell 指令,後面接的就是我們希望在 shell 上執行的工作。大家會發現有 {{project_name}} 這個 template 的語法存在。用過 django 或是 jinja2 的朋友肯定對此相當熟悉。這就是 ansible 的變數代換功能,變數的來源則來自上方的 vars 區塊。

ansible 的 module 太多了,在此無法一一列舉。如果有什麼問題,歡迎與我討論。

← 自動化利器 Ansible 簡介 在 Jenkins 分析 Flake8 測試結果 →
 
comments powered by Disqus