首頁 > 軟體

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

2020-06-16 16:53:08

隨著微服務越來越被行業所接受,與之相關的持續整合和持續交付的作用和價值也更加突顯。在本文中,我們將使用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


IT145.com E-mail:sddin#qq.com