今天來講講 Ansible。記得我在第二天的時候曾經講過,自動化在 SRE 裡面是很重要的一環。讓機械化的重複工作可以被電腦自動化的解決,可以大大地降低人力成本,也避免人為疏失造成的錯誤。
在目前的設計裡面,NOJ 可以連接多個沙盒存在,以提高 judge 的容量。然而目前尚且需要解決的是部署沙盒的問題,目前至少需要下列步驟:
可以看到,上面的步驟還挺麻煩的,另外惱人的一點就是它還沒有被自動化,因為之前需求不高,所以僅是我手動去處理。然而身為懶惰的資工系學生,這種事情真是做個一兩次就受不了了,所以為了後來維護的人著想(如果有的話),應該要讓它變得更簡單才行。
寫 shell script 或許是個做法,可以幫助我們把指令變成檔案,這樣每次要執行特定操作的時候,只要執行對應腳本就好了。不過這樣在某些時候會有些問題,shell script 是指令式 (imperative) 的,也就是說裡面描述的是我們希望執行那些動作,然而這在機器比較多或是比較複雜的環境下,因為我們難以掌握目前的狀態,所以多次執行腳本可能會對系統造成一些危害。
雖然可以盡量將腳本設計成冪等的 (idempotent),讓它就算被多次執行也可以達到一樣的效果,不過因為需要撰寫許多檢查的邏輯,這通常會讓腳本變得比較複雜。因此在這方面,採用宣告式 (declarative) 腳本的 Ansible 等工具便顯得較有優勢,可以方便撰寫容易用於維運的腳本。
另外還有一點比較重要的是模組化,shell script 通常就是由維運工程師等人撰寫需要執行的指令,或許有同一個人寫出來的會有一定程度的重用,但是在不同人之間,就容易產生各式各樣的寫法。然而像是 Ansible 就有提供 Ansible Galaxy 這種 market place,可以讓大家去共享一些模組,因此降低維運的門檻。
因此,這幾天的目標就是讓沙盒可以透過 Ansible 部署。