基于 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

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

作者:无知者云 链接:https://www.cnblogs.com/davenkin/p/vagrant-ansible-gocd.html

本文分享自微信公众号 - DevOps时代(DevOpsTimes)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阶梯计划

Alpine linux容器中运行go的二进制文件

将golang编译的二进制文件 opena 拷贝到容器的 /usr1 下面,执行显示:

62540
来自专栏bboysoul

树莓派安装go

大学的时候在使用openfalcon的时候讲过这个东西,但是那时候是介绍open-falcon的,所以感觉不是很具体,所以今天在安装frp的时候也碰到了这个问题...

20840
来自专栏用户5290714的专栏

一起来捉妖:腾讯的首款区块链游戏?|DApp101

《一起来捉妖》这款游戏其实墨鲫在去年就有看到腾讯发布的白皮书,但当时已经是内测通道关闭的时候,因此只好安心等公测。前几天这款游戏终于公测了,并且发布后迅速登顶A...

18630
来自专栏奇点大数据

这份“插件英雄榜Top9”才是Chrome的正确打开方式!

说到这个插件的作用,如果在没有特殊使用需求时,真的是无感。不过,有些插件使用习惯后,就发现确实很好用,而且潜移默化的改变你的使用习惯,引用作者的话“插件是 Ch...

13820
来自专栏VRPinea

1.15 VR扫描:NextVR将进行裁员;华纳兄弟与英特尔联手打造自动驾驶汽车娱乐体验

日前,直播VR公司NextVR进行了裁员。其并未申请《根据加利福尼亚州的法律声明有关于减少劳动力》的通知,表明裁员的规模未达披露的门槛。此外,该公司联合创始人兼...

13230
来自专栏VRPinea

2.13 VR扫描:Massless完成200万美元种子轮融资;《精灵宝可梦GO》将推“GO Snapshot”

近日,Massless已完成由Founders Fund Pathfinder领投的200万美元种子轮融资。Massless将利用这笔资金来扩充团队,以及完成M...

8920
来自专栏C/C++基础

Go AES加解密

https://blog.csdn.net/K346K346/article/details/89387460

25230
来自专栏C/C++基础

Golang import包时可以使用相对路径吗

但是从Go 1.10开始,可以畅通无阻地使用相对路径来import包,即如下的包导入方式将不会出错。

43150
来自专栏日常学python

一个网络请求的冒险之旅

对于互联网,人们总是高谈阔论,却很少有人愿意去了解电脑、手机、电视这些设备到底是如何被“连接”起来的。

10520
来自专栏VRPinea

1.18 VR扫描:Facebook或将发布AR产品;广东联通打通全球首个5G手机电话

近日,印度教育科技公司Byju’s宣布,以1.2亿美元收购主打AR教育游戏的美国硅谷初创公司Osmo。Osmo的AR游戏可结合定制化的实体玩具供儿童玩乐,其利用...

10020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励