用Vagrant和Ansible搭建持續交付平台


 

 

這是一個關於Vagrant的學習系列,包含如下文章:

  

  1. Vagrant入門
  2. 創建自己的Vagrant box 
  3. 用Vagrant搭建Jenkins構建環境
  4. 用Vagrant和Ansible搭建持續交付平台

 

 

隨着微服務越來越被行業所接受,與之相關的持續集成和持續交付的作用和價值也更加突顯。在本文中,我們將使用Vgrant和Ansible來自動地創建一套持續交付平台——ThoughtWorks的GoCD。如果你對Jenkins比較熟悉,也可以參考筆者另外一篇搭建Jenkins多機構建環境的文章。

 

 

我們將創建一台Go Server和兩台Go Agent,對於不熟悉GoCD的讀者來說,可以將Go Server理解成Jenkins的Master,而將Go Agent理解為Jenkins的Slave。

本文源代碼:https://github.com/davenkin/vagrant/tree/master/ansible-go-server-2-agents-ubuntu1404

 

首先,創建如下Vangrantfile:

GO_SERVER_IP="192.168.3.2" GO_AGENT1_IP="192.168.3.3" GO_AGENT2_IP="192.168.3.4" Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty64" config.vm.define "server" do |server| server.vm.hostname = "goserver" server.vm.network "private_network", ip: GO_SERVER_IP server.vm.provider "virtualbox" do |v| v.name = "go-server" v.memory = 1024 v.cpus = 2 end end config.vm.define "agent1" do |agent1| agent1.vm.hostname = "goagent1" agent1.vm.network "private_network", ip: GO_AGENT1_IP agent1.vm.provider "virtualbox" do |v| v.name = "go-agent1" v.memory = 1024 end end config.vm.define "agent2" do |agent2| agent2.vm.hostname = "goagent2" agent2.vm.network "private_network", ip: GO_AGENT2_IP agent2.vm.provider "virtualbox" do |v| v.name = "go-agent2" v.memory = 1024 end end config.vm.provision "ansible" do |ansible| ansible.playbook = "ansible/playbook.yml" ansible.groups = { "servers" => ["server"], "agents" => ["agent[1:2]"], "agents:vars" => {"goserver_ip" => GO_SERVER_IP} } end end

 

以上,我們創建了3台虛擬機,其中Go Server的IP地址為192.168.3.2,兩台Go Agent的IP地址分別為192.168.3.3和192.168.3.4。由於采用了Vagrant的private_network網絡方式,這3台虛擬機以及Host機器之間都是相互連通的。在config.vm.provision配置項中,我們指定了所使用的Ansible配置文件ansible/playbook.xml,該文件將同時用於Go Server和Go Agent的provision。最后,我們聲明了兩個Ansible的group,一個名為servers,包含了Go Server;另一個名為agents,包含兩台Go Agent。對於兩台Go Agent,我們還定義了變量goserver_ip,該變量將用於配置兩台Go Agent,用於指向他們需要連接的Go Server。

 

然后創建playbook.xml如下:

---
- hosts: servers become: true become_method: sudo roles: - role: goserver - role: git - hosts: agents become: true become_method: sudo roles: - role: goagent - role: git

 

在該文件中,我們定義了兩份playbook,一份用於配置Go Server(上文提到的servers這個group),另一份用於配置Go Agent。可以看出,該playbook本身並沒有做什么配置工作,而是對於不同的group使用了不同的Ansible role——goserver、goagent和git。

 

為了引用這些role,他們需要遵循一定的目錄結構,比如需要在playbook.xml所在的目錄下創建一個名為roles的目錄用於存放所有的role。而每個role又有自身的目錄結構,比如對於goserver這個role來說,要執行的task應該放在roles/goserver/tasks/main.yml這個文件中。有關role的目錄結構細節請參考Ansible的官方文檔

 

這里我們將以goserver這個role為例講解Go Server的provision過程。goserver這個role的目錄包含以下內容:

├── handlers
│   └── main.yml
├── meta
│   └── main.yml
└── tasks
     └── main.yml

 

首先在tasks/main.yml中,我們通過apt這個module安裝了jdk和go-server:

---
- name: install jdk apt: pkg=default-jdk state=present - name: install go sever apt: pkg=go-server state=present notify: - start go server

 

在安裝完成之后,我們還需要保證Go Server是啟動的,這個在handlers/main.yml中:

---
- name: start go server service: name=go-server state=started

 

對於Go Server來說,安裝過程的最后一步會自動啟動Go Server的service,故以上步驟其實省略也可。但是對於Go Agent來說,則不是自動啟動的了。

 

另外,在meta/main.yml文件中,我們聲明了goserver依賴於另一個role——apt_update:

--- dependencies: - { role: apt_update }

 

也就是說,在goserver運行之前,apt_update這個role會自動運行,該role主要作用是將apt源從默認的國外轉成國內的阿里雲,這樣在安裝軟件時速度會更快,另外由於go-server不在阿里雲源里,我們還需要手動添加go-server的源。apt_update目錄如下:

├── files
│   └── sources.list
└── tasks
    └── main.yml

 

在apt_update/tasks/main.yml文件中,設置阿里雲的源和go-server自己的源:

---
- name: archieve existing sources.list shell: creates="/etc/apt/sources.list.old" mv /etc/apt/sources.list /etc/apt/sources.list.old - name: copy new sources.list copy: src=sources.list dest=/etc/apt/ 

- name: add gocd.list shell: creates="/etc/apt/sources.list.d/gocd.list" echo "deb https://download.go.cd /" | sudo tee /etc/apt/sources.list.d/gocd.list - name: add gocd apt key shell: curl https://download.go.cd/GOCD-GPG-KEY.asc | sudo apt-key add -

- name: update apt cache apt: update_cache=yes

 

 

除了安裝Go Server,我們還安裝了Git,用於在構建項目時能夠順利從Git服務器(比如Github)下載到項目源代碼。

對於兩台Go Agent來說,也具有與Go Server相似的過程。

 

最后,運行vagrant up,我們便可以在Virtualbox中看到這3台虛擬機了:

 

然后在Host機器上打開http://192.168.3.2:8153/go/pipelines,便可以看到Go Server的頁面了:

請注意,此時的兩台Go Agent雖然能夠正常連接Go Server,但是他們的狀態卻是disable的,為了正常使用Go Agent來構建項目,你需要先在Go Server中將他們enable。點擊頁面上方的“AGENTS”,進入agents管理也便可enable/disable所有的agents:

 

還有個問題,Ansible所需要的inventory在哪里?事實上,Vagrant會基於Vangrantfile自動為我們生成Ansible的inventory文件,並放在與Vgrantfile文件同級的.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory文件中。對於本項目,在筆者的機器上所生成的vagrant_ansible_inventory文件如下:

# Generated by Vagrant
 agent1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/yteng/github/vagrant/ansible-go-server-2-agents-ubuntu1404/.vagrant/machines/agent1/virtualbox/private_key' agent2 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2201 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/yteng/github/vagrant/ansible-go-server-2-agents-ubuntu1404/.vagrant/machines/agent2/virtualbox/private_key' server ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/yteng/github/vagrant/ansible-go-server-2-agents-ubuntu1404/.vagrant/machines/server/virtualbox/private_key' [servers] server [agents] agent[1:2] [agents:vars] goserver_ip=192.168.3.2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM