使用Vagrant和Puppet自动化开发环境

使用这两个工具使开发和部署变得更容易!

使用的场景:

  1. 一个单独的开发人员,寻找一种快速/简单的方法来拥有类似于您的生产环境的本地开发环境
  2. 团队成员,每个人都有自己的开发风格,并希望避免跨平台支持的麻烦。
  3. 通常在第三方托管环境中设置服务器的人,但是您想要测试您的部署,而不需要在浪费的服务器上支付一大笔钱

什么是Vagrant?

Vagrant本质上是围绕各种虚拟机提供程序的包装。 如果你曾经使用Make来构建一个软件,除了虚拟机之外,它有点像。 它提供了一个统一创建、规定、销毁和连接到计算机的命令。 您可以使用许多不同的虚拟机提供商,但我将使用VirtualBox,因为它是免费的,易于使用。 通常创建虚拟机,安装操作系统等都是一件痛苦的事情。 Vagrant使得它非常容易,并且有很多预制的"盒子"供您使用(稍后会详细介绍)。

什么是Puppet?

Puppet是一个基础设施自动化工具,我们将使用它来设置我们的系统的辛勤工作。 我们可以这样做,因为很多人已经投入了大量的精力来编写我们可以使用的模块。 这不会是关于Puppet的教程,但它会介绍基础知识,以便您可以使用其他人编写的模块。

如果你不喜欢Puppet?

这很好。 值得庆幸的是Vagrant的规定很灵活,您可以阅读更多关于替代品的信息。 为了简单起见,我只是要复盖Bash和Puppet,因为这是我所熟悉的。 如果您决定使用Chef或Ansible,整个过程应该是相同的,但因为我对它们知之甚少,所以我不会进一步讨论它们。

开始

 安装方式

Vagrant是一件轻breeze举的安装:你可以阅读他们的安装说明。 从本质上讲,下载与您选择的平台相关的软件包,并按照通常安装软件包的方式进行安装。
您还需要安装虚拟机提供商,在我的情况下VirtualBox。
第一个虚拟机
安装后,您将需要创建一个新的项目目录并初始化它。

$ mkdir ~/Vagrant
$ cd ~/Vagrant
$ vagrant init

这将创建一个新目录,并使用一个名为Vagrantfile的文件准备好,该文件将包含Vagrant管理开发环境所需的所有信息。
在这个文件中会有一堆关于你可以放在该文件中的不同内容的评论。 现在我们只关心配置一个基本的"box"(这只是一个虚拟机映像)和其他一些机器属性。 我最终得到了一个看起来像这样的文件:

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(“2") do |config|
 # Every vagrant virtual env requires a box to build off of
 config.vm.box = “puppetlabs-precise64"
 config.vm.box_url = “http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-12042-x64-vbox4210-nocm.box"
 config.vm.hostname = “development.kloudless.vm”
 config.vm.network :private_network, ip: “192.168.33.10"
 config.vm.network :forwarded_port, guest: 80, host: 8080
 # VirtualBox Specific Customization
 config.vm.provider :virtualbox do |vb|
 # Use VBoxManage to customize the VM. For example to change memory:
 vb.customize [“modifyvm”, :id, “—memory”, “1024"]
 end
end

文件到位后,您可以从同一目录创建和配置虚拟机:

$ vagrant up 

该命令完成运行后,您将有一个VM准备好连接并开始乱搞。 您可以使用以下方式通过SSH访问机器:

$ vagrant ssh 

现在,您的虚拟机上将有一个shell作为vagrant用户。 用户在机器上具有无密码的sudo访问权限,它完全成熟的Ubuntu12.04LTS VM,你可以做任何你想要的! 这是伟大的,所有的,但我们希望使事情更加自动化,所以你会想退出你的SSH会话,并摆脱虚拟机:

$ vagrant destroy 

自动化所有的东西

正如前面提到的,Vagrant的好处在于,将配置卸载到自动化工具中非常容易,在这种情况下,Puppet。 由于我们的虚拟机非常简单,所以我们需要做一些额外的工作来准备它。

 引导

我选择的盒子默认情况下不会安装puppet,这是一个故意的选择,以确保我可以使用我在生产中使用的相同版本,而不必一直更改盒子。 因此,我们需要做一些额外的工作。 将机器准备为木偶相对简单,我们将利用一个事实,即您可以在一台机器上使用多个provisioners。 为了使用shell provisioner,我们在最后结束之前将以下行添加到我们的Vagrantfile中:

# Enable shell provisioning to bootstrap puppet
config.vm.provision :shell, :path => “bootstrap.sh”

然后我们创建一个名为bootstrap.sh 在与Vagrantfile相同的文件夹中,其中包含以下内容:

#!/usr/bin/env bash
set -e
if [ “$EUID” -ne “0" ] ; then
 echo “Script must be run as root.” >&2
 exit 1
fi
if which puppet > /dev/null ; then
 echo “Puppet is already installed”
 exit 0
fi
echo “Installing Puppet repo for Ubuntu 12.04 LTS”
wget -qO /tmp/puppetlabs-release-precise.deb \
 https://apt.puppetlabs.com/puppetlabs-release-precise.deb
dpkg -i /tmp/puppetlabs-release-precise.deb
rm /tmp/puppetlabs-release-precise.deb
aptitude update
#aptitude upgrade -y
echo Installing puppet
aptitude install -y puppet
echo “Puppet installed!”

添加Puppet

由于我们不想在主机上安装Puppet,所以调出虚拟机并连接到它。 木偶已经安装。 我们可以直接在虚拟机中完成所有初始Puppet配置。 默认情况下,包含Vagrantfile的文件夹在路径/vagrant的虚拟机上共享,这将成为存储我们的puppet配置的好位置。 一旦进入该目录,您将需要创建puppet目录的骨架:

$ mkdir -p puppet/{manifests,modules}
$ touch manifests/site.pp 

从这里,我们将要安装一些puppet模块,这将使建立一个基本的LAMP服务器变得容易(现在我们只是把一切都放在同一个盒子上)。 安装puppet模块有很多不同的方法,但最直接的方法是使用内置到puppet中的方式:

$ puppet module puppetlabs-apache —modulepath \
/vagrant/puppet/modules
$ puppet module install puppetlabs-mysql —modulepath \
/vagrant/puppet/modules

现在我们将要实际编写一个puppet清单,所以我们将要创建/vagrant/puppet/manifests/site.pp具有以下内容:

node ‘development.kloudless.vm’ { # [1]
 class { ‘mysql::server’: # [2]
 config_hash => { ‘root_password’ => ‘herpderpderp’ },
 }
 include mysql::php # [3]
 # Configuring apache
 include apache # [4]
 include apache::mod::php
 apache::vhost { $::fqdn: # [5]
 port => ‘80',
 docroot => ‘/var/www/test’,
 require => File[‘/var/www/test’],
 }
 # Setting up the document root
 file { [‘/var/www’, ‘/var/www/test’] : # [6]
 ensure => directory,
 }
 file { ‘/var/www/test/index.php’ : # [7]
 content => ‘>?php echo \’>p<Hello world!>/p<\’ ?<’,
 }
 # “Realize” the firewall rule
 Firewall <| |> # [8]
}
每日一句话科技资讯 | 20200617
每日Github项目推荐 | 20200615