2021-05-12 14:32:11
用Vagrant和Ansible搭建持續交付平台
隨著微服務越來越被行業所接受,與之相關的持續整合和持續交付的作用和價值也更加突顯。在本文中,我們將使用Vgrant和Ansible來自動地建立一套持續交付平台——ThoughtWorks的GoCD。如果你對Jenkins比較熟悉,也可以參考筆者另外一篇搭建Jenkins多機構建環境的文章。
我們將建立一台Go Server和兩台Go Agent,對於不熟悉GoCD的讀者來說,可以將Go Server理解成Jenkins的Master,而將Go Agent理解為Jenkins的Slave。
這是一個關於Vagrant的學習系列,包含如下文章:
1.Vagrant基本使用入門 https://www.linuxidc.com/Linux/2018-04/151772.htm
2.建立自己的Vagrant box https://www.linuxidc.com/Linux/2018-04/151773.htm
3.用Vagrant搭建Jenkins構建環境 https://www.linuxidc.com/Linux/2018-04/151774.htm
4.用Vagrant和Ansible搭建持續交付平台 https://www.linuxidc.com/Linux/2018-04/151775.htm
首先,建立如下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
本文原始碼可以到Linux公社資源站下載:
------------------------------------------分割線------------------------------------------
免費下載地址在 http://linux.linuxidc.com/
使用者名稱與密碼都是www.linuxidc.com
具體下載目錄在 /2018年資料/4月/8日/用Vagrant和Ansible搭建持續交付平台/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割線------------------------------------------
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-04/151775.htm
相關文章