這是一個關於Vagrant的學習系列,包含如下文章:
在上一篇文章中,我們講到了如何創建自己的vagrant box。本文中,我們將使用Vagrant一次性創建3台虛擬機以組成一個Jenkins的master-slave構建環境,其中包含1台Jenkins master機器,2台slave機器。我們將采用Shell作為provision工具,當然你也可以使用像Ansible、Chef等。
本文源代碼:https://github.com/davenkin/vagrant/tree/master/multi-machine-jenkins-cluster-ubuntu1404
在Vagrantfile中,通過config.vm.define來定義多台機器,通過引用外部的Shell腳本進行provision,Vagrantfile如下:
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty64" config.vm.define "master" do |master| master.vm.network "private_network", ip: "192.168.2.2" master.vm.provision "shell", path: "master_provision.sh" master.vm.provider "virtualbox" do |v| v.name = "jenkins-master" end end config.vm.define "slave1" do |slave1| slave1.vm.network "private_network", ip: "192.168.2.3" slave1.vm.provision "shell", path: "slave_provision.sh" slave1.vm.provider "virtualbox" do |v| v.name = "jenkins-slave1" end end config.vm.define "slave2" do |slave2| slave2.vm.network "private_network", ip: "192.168.2.4" slave2.vm.provision "shell", path: "slave_provision.sh" slave2.vm.provider "virtualbox" do |v| v.name = "jenkins-slave2" end end end
在每一個config.vm.define的配置內部,我們可以使用與其外部相同的配置項,內部配置會覆蓋外部配置。這樣,我們可以在外部配置中設置一些所有機器都共享的配置信息,然后在每個config.vm.define內部中針對性地配置某一台機器。
我們使用private network組成一個局域網,分別為各台機器指定靜態的IP地址,此時其實使用的Virtualbox的Host-only網絡類型。
對於master機器而言,我們首先需要安裝JDK,然后安裝Jenkins server,此時的master_provision.sh如下:
#! /bin/bash #change apt source to be inside China to speed up apt sudo mv /etc/apt/sources.list /etc/apt/sources.list.old sudo cp /vagrant/sources.list /etc/apt/sources.list #prepare for jenkins installation wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update #install openjdk sudo apt-get -y install default-jdk #install jenkins sudo apt-get -y install jenkins
請注意,在provision一開始,我們更新了apt的源以提高下載速度。此時的sources.list包含以下阿里雲的源:
deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
對於兩台slave機器來說,我們只需要安裝JDK即可(其他軟件,比如SSH等都已經包含在ubuntu/trusty64 box中了),對兩台slave執行同一份provision文件provision_slave.sh:
#! /bin/bash #change apt source to be inside China to speed up apt sudo mv /etc/apt/sources.list /etc/apt/sources.list.old sudo cp /vagrant/sources.list /etc/apt/sources.list sudo apt-get update #install openjdk sudo apt-get -y install default-jdk
運行“vagrant up”,在Virtualbox中將出現三台虛擬機,他們與host機器同屬於一個局域網,相互可連通。
在host機器中打開http://192.168.2.2:8080(即Jenkins master),開始初始化配置Jenkins:
Jenkins要求輸入初始的admin密碼,密碼位於文件/var/lib/jenkins/secrets/initialAdminPassword中,請注意,該文件為master機器上的文件,而不是host機上的。此時我們通過“vagrant ssh master”登錄到master機器上,該文件的內容即為admin的初始密碼。之后Jenkins將提示我們安裝一些必要的插件,安裝Jenkins推薦的插件即可,之后Jenkins還會讓我們創建一個真正的admin用戶,完了就可以使用Jenkins了。
不過此時的Jenkins master還並不知道slave機器的存在,為了能使用slave機器,我們需要將master機上用戶“jenkins”的public key上傳到每一台slave機器上,這里我們選擇slave上的“vagrant”用戶作為構建Jenkins job的用戶,即我們需要先在master機器上為jenkins用戶生成一對keypair,然后將public key加入到每台slave機上vagrant用戶的authorised_keys文件中。這個過程是標准的SSH配置過程,請參考這里。另外,為了使master能夠通過SSH連接slave,我們還需要以master機器上的jenkins用戶的private key添加一個Credential,這里我們添加一個名為vagrant的Credential,采用直接輸入密鑰的方式填入jenkins用戶的密鑰:
在配置好了SSH之后,便可以在Jenkins中加入slave了:進入添加新node頁面:
這里有幾點需要注意,在“Romote root directory”中,必須填入“/home/vagrant”,因為這是vagrant用戶擁有讀寫權限的目錄;另外,在“Launch method”中,選擇“Launch slave agents on Unix machines via SSH”,最后在Credentials中選擇在先前添加的vagrant。
在下一篇中,我們將講到如何用Vagrant和Ansible搭建持續交付平台。