我使用 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
本文由 LCTT 原創編譯,Linux中國 榮譽推出