使用 Vagrant 測試 Ansible 劇本
我使用 Ansible 來自動部署站點 (LinuxJobs.fr、Journal du hacker) 與應用 (Feed2toot、Feed2tweet)。在本文中將會講述我是如何配置以實現在本地測試 Ansbile 劇本 的。
為何要測試 Ansible 劇本
我需要一種簡單而迅速的方法來在我的本地筆記本上測試 Ansible 劇本的部署情況,尤其在剛開始寫一個新劇本的時候,因為直接部署到生產伺服器上不僅特別慢而且風險還很大。
我使用 Vagrant 來將劇本部署到 VirtualBox 虛擬機上而不是部署到遠程伺服器。這使得修改的結果很快就能看到,以實現快速迭代和修正。
責任聲明:我並不是專業程序員。我只是描述一種我覺得適合我的,即簡單又有效的用來測試 Ansible 劇本的解決方案,但可能還有其他更好的方法。
我的流程
- 開始寫新的 Ansible 劇本
- 啟動一台新的虛擬機(VM)並使用 Vagrantt 將劇本部署到這台虛擬機中
- 修復劇本或應用中的錯誤
- 重新在虛擬機上部署
- 如果還有問題,回到第三步。否則銷毀這台虛擬機,重新創建新虛擬機然後測試一次全新部署
- 若沒有問題出現,則標記你的 Ansible 劇本版本,可以在生產環境上發布產品了
你需要哪些東西
首先,你需要 Virtualbox。若你使用的是 Debian 發行版,這個鏈接 描述了安裝的方法,可以從 Debian 倉庫中安裝,也可以通過官網來安裝。
其次,你需要 Vagrant。為什麼要 Vagrant?因為它是介於開發環境和虛擬機之間的中間件,它允許通過編程的方式重複操作,而且可以很方便地將你的部署環境與虛擬機連接起來。通過下面命令可以安裝 Vagrant:
# apt install vagrant
設置 Vagrant
Vagrant 的一切信息都存放在 Vagrantfile
文件中。這是我的內容:
Vagrant.require_version ">= 2.0.0"
Vagrant.configure(1) do |config|
config.vm.box = "debian/stretch64"
config.vm.provision "shell", inline: "apt install --yes git python3-pip"
config.vm.provision "ansible" do |ansible|
ansible.verbose = "v"
ansible.playbook = "site.yml"
ansible.vault_password_file = "vault_password_file"
end
end
- 第一行指明了需要用哪個版本的 Vagrant 來執行
Vagrantfile
。 - 文件中的第一個循環,你要定義為多少台虛擬機執行下面的操作(這裡為
1
)。 - 第三行指定了用來創建虛擬機的官方 Vagrant 鏡像。
- 第四行非常重要:有一些需要的應用沒有安裝到虛擬機中。這裡我們用
apt
安裝git
和python3-pip
。 - 下一行指明了 Ansible 配置開始的地方
- 第六行說明我們想要 Ansible 輸出詳細信息。
- 第七行,我們定義了 Ansible 劇本的入口。
- 第八行,若你使用 Ansible Vault 加密了一些文件,在這裡指定這些文件。
當 Vagrant 啟動 Ansible 時,類似於執行這樣的操作:
$ ansible-playbook --inventory-file=/home/me/ansible/test-ansible-playbook/.vagrant/provisioners/ansible/inventory -v --vault-password-file=vault_password_file site.yml
執行 Vagrant
寫好 Vagrantfile
後,就可以啟動虛擬機了。只需要簡單地運行下面命令:
$ vagrant up
這個操作會很慢,因為它會啟動虛擬機,安裝 Vagrantfile
中定義的附加軟體,最終應用你的劇本。你不要太頻繁地使用這條命令。
Ok,現在你可以快速迭代了。在做出修改後,可以通過下面命令來快速測試你的部署:
$ vagrant provision
Ansible 劇本搞定後,通常要經過多次迭代(至少我是這樣的),你應該一個全新安裝的虛擬機上再測試一次,因為你在迭代的過程中可能會對虛擬機造成修改從而引發意料之外的結果。
使用下面命令進行全新測試:
$ vagrant destroy && vagrant up
這又是一個很慢的操作。你應該在 Ansible 劇本差不多完成了的情況下才這樣做。在全新虛擬機上測試部署之後,就可以發布到生產上去了。至少準備要充分不少了吧 :p
有什麼改進意見?請告訴我
本文中描述的配置對我自己來說很有用。我可以做到快速迭代(尤其在編寫新的劇本的時候),除了劇本外,對我的最新應用,尚未準備好部署到生產環境上的應用也很有幫助。直接部署到遠程伺服器上對我的生產服務來說不僅緩慢而且很危險。
我本也可以使用持續集成(CI)伺服器,但這不是本文的主題。如前所述,本文的目的是在編寫新的 Ansible 劇本之初儘可能的快速迭代。
在編寫 Ansible 劇本之初就提交,推送到你的 Git 倉庫然後等待 CI 測試的執行結果,這有點太過了,因為這個時期的錯誤總是很多,你需要一一個地去調試。我覺得 CI 在編寫 Ansible 劇本的後期會有用的多,尤其當多個人同時對它進行修改而且你有一整套代碼質量規範要遵守的時候。不過,這只是我自己的觀念,還有待討論,再重申一遍,我不是個專業的程序員。
如果你有更好的測試 Ansible 劇本的方案或者能對這裡描述的方法做出一些改進,請告訴我。你可以把它寫到留言框中或者通過社交網路聯繫我,我會很高興的。
via: https://carlchenet.com/testing-ansible-playbooks-with-vagrant/
作者:Carl Chenet 譯者:lujun9972 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive