Ansible 如何操作

2018-07-25 09:47 更新

相信大家手邊都有可以練習(xí) Ansible 的環(huán)境了,這次凍仁就來談?wù)勗趺床僮?Ansible!

automate_with_ansible_basic-16.jpg

一般來說,我們可以用 Ad-Hoc command 和 Playbook 兩種方式來操作 Ansible。

automate_with_ansible_basic-17.jpg

前者是透過一次次簡短的指令來操作 Ansible,而后者則是先把任務(wù)寫好,然后再一次執(zhí)行。兩者的關(guān)系就好比我們?cè)?Linux Shell 里打指令和先寫個(gè) Shell Script 再執(zhí)行一樣。

Ad-Hoc Commands 是什么?

Ad hoc 這個(gè)單字是來自拉丁文常用短語中的一個(gè)短語,通常用來形容為一個(gè)特定的問題或任務(wù)而專門設(shè)定的解決方案 1。Ad-Hoc Commands 可以翻譯為簡短地指令,在這里凍仁會(huì)用指令操作模式來形容它,以常見的 ping 和 echo 操作為例。

  • ping.

    $ ansible all -m ping
    server1 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    
  • echo.

    $ ansible all -m command -a "echo Hello World"
    server1 | SUCCESS | rc=0 >>
    Hello World
    

從以上的例子中可以看到 Ad-Hoc commands 一次只能處理一件事情,這即是它與 Playbooks 最大的差異。

詳情請(qǐng)參考官方的 Introduction To Ad-Hoc Commands | Ansible Documentation 文件。

Playbooks 是什么?

Playbook 就字面上的意思為劇本。我們可以通過事先寫好的劇本 (Playbooks) 來讓各個(gè) Managed Node 進(jìn)行指定的動(dòng)作 (Plays) 和任務(wù) (Tasks)。 2

簡而言之,Playbooks 是 Ansible 的腳本 (Script),而且還是個(gè)比傳統(tǒng) Shell Script 還強(qiáng)大數(shù)百倍的腳本!如果今天只能記住一件事,請(qǐng)記住 Ansible 最好用、最厲害的就是它的 Playbook!

automate_with_ansible_basic-18.jpg圖片來源:http://goo.gl/GKJvXn

在一份 Playbook 中,可以有多個(gè) Play、多個(gè) Task 和多個(gè) Module。

  • Play:通常為某個(gè)特定的目的,例如:
    • Setup a official website with Drupal (借由 Drupal 建置官網(wǎng))
    • Restart the API service (重開 API 服務(wù))
  • Task:是要實(shí)行 Play 這個(gè)目地所需做的每個(gè)步驟,例如:
    • Install the Nginx (安裝 Nginx)
    • Kill the djnago process (強(qiáng)制停止 django 的行程)
  • Module:Ansible 所提供的各種操作方法,例如:
    • apt: name=vim state=present (使用 apt 套件安裝 vim)
    • command: /sbin/shutdown -r now (使用 shutdown 的指令重新開機(jī))

automate_with_ansible_basic-19.gif

詳情請(qǐng)參考官方的 Playbooks | Ansible Documentation 文件。

Hello World Playbook

  • 來寫一下我們的第一個(gè) playbook!請(qǐng)建立一個(gè) hello_world.yml 的檔案,并將 --- 開始的內(nèi)容都寫進(jìn)去。

    $ vi hello_world.yml
    ---
    
    - name: say 'hello world'
      hosts: all
      tasks:
    
        - name: echo 'hello world'
          command: echo 'hello world'
          register: result
    
        - name: print stdout
          debug:
            msg: ""
    
  • 執(zhí)行 playbook:在這個(gè)范例中,我們執(zhí)行了 1 個(gè) Play、3 個(gè) Task 和 2 個(gè) Module。

    $ ansible-playbook hello_world.yml
    
    PLAY [say 'hello world'] *******************************************************
    
    TASK [setup] *******************************************************************
    ok: [server1]
    
    TASK [echo 'hello world'] ******************************************************
    changed: [server1]
    
    TASK [print stdout] ************************************************************
    ok: [server1] => {
        "msg": "hello world"
    }
    
    PLAY RECAP *********************************************************************
    server1                    : ok=3    changed=1    unreachable=0    failed=0
    

沒有 Ansible 時(shí),我們是怎么操作的?

凍仁在此附上 Linux Shell 3 上的傳統(tǒng)作法,來比對(duì)兩者的操作。

Shell (command line, cli, console)

  • ping.

    $ ping -c 1 8.8.8.8
    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=44 time=10.022 ms
    
    --- 8.8.8.8 ping statistics ---
    1 packets transmitted, 1 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 10.022/10.022/10.022/0.000 ms
    
  • echo.

    $ echo Hello World
    Hello World
    

Shell Script

  • 建立 hello_world.sh 檔案。

    #!/bin/bash
    echo 'Hello World'
    
  • 執(zhí)行。

    $ bash hello_world.sh
    Hello World
    

后話

大家或許會(huì)問,會(huì)寫 script 就夠用了,為什么還要會(huì)寫 playbook 呢?凍仁在此列了幾個(gè)理由給大家參考:

  1. 若有現(xiàn)成的 script,我們可以用 shell module 來執(zhí)行它,這部份雖不沖突,但使用 shell module 會(huì)造成每次跑 playbook 都會(huì)重復(fù)執(zhí)行,不像其它 module 執(zhí)行過就不會(huì)再執(zhí)行了。
  2. 用 Ansible 的 module 可以把很多雜亂的指令給標(biāo)準(zhǔn)化,例如不同的 Linux 發(fā)行版本在安裝套件時(shí)需代各種不同的參數(shù)。
  3. 在現(xiàn)有的 cloud native 的架構(gòu)下,傳統(tǒng)的 Shell Script 已不符使用,一般而言 Shell Script 只能對(duì)一臺(tái)機(jī)器 (instance) 進(jìn)行操作。

相信大家都知道要怎么操作 Ansible 了,好好享受 Ansible 帶給我們的樂趣吧!

相關(guān)連結(jié)

1. 詳情請(qǐng)參考維基百科上的 Ad hoc 解釋。 ?
2. 關(guān)于組態(tài)管理工具的隱喻,可參考 William Yeh 前輩所撰寫的電腦界的隱喻:組態(tài)管理 | 軟件架構(gòu)?絮語一文。 ?
3. Linux Shell,是我們一般在 GNU/Linux 上操作的模式,而常見的 Shell 有 Bash, Zsh ... 等,在 Windows 上則有命令提示字元 (CMD),但它對(duì)使用者而言沒有 Shell 友善。 ?


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)