使用 Vagrant 作为开发环境

初始化虚拟机环境

下载 ubuntu-15.04-amd64.box 包文件。使用离线安装的方式:

shellvagrant box add ubuntu-15.04-amd64 file:///D:\downloads\ubuntu-15.04-amd64.box

其中 D:\downloads\ubuntu-15.04-amd64.box 是下载后的 box 文件路径。

切换到项目路径下,初始化并启动 Vagrant:

shellmkdir ~/project/devstack
cd ~/project/devstack
vagrant init ubuntu-15.04-amd64

启动并登录虚拟机系统

shellvagrant up
vagrant ssh

安装软件

更新 apt 软件库:

shellsudo apt-get update -y
sudo apt-get upgrade -y

安装需要的软件包:

shellsudo apt-get install -y git ansible libmysqld-dev mysql-server mongodb-server redis-server nginx-full supervisor uwsgi uwsgi-plugin-python python-pip python-dev python-virtualenv python-mysqldb python-mongoengine python-redis python-gevent virtualenvwrapper php5 php5-fpm php5-dev libjpeg-dev

安装第三方软件:

shellsudo dpkg -i /vagrant/elasticsearch-2.0.0.deb
sudo dpkg -i /vagrant/logstash_2.0.0-1_all.deb

禁用无用的服务:

shellsudo update-rc.d apache2 defaults
sudo service apparmor stop
sudo update-rc.d -f apparmor remove

配置 Vagrantfile

编辑 Vagrantfile 文件:

rubyVagrant.require_version ">= 1.5.3"
unless Vagrant.has_plugin?("vagrant-vbguest")
    raise "Please install the vagrant-vbguest plugin by running `vagrant plugin install vagrant-vbguest`"
end

# 自定义变量
BASE_PATH = "/myproject"
CONFIG_REPO = "https://github.com/mine/project.git"

VAGRANTFILE_API_VERSION = "2"

MEMORY = 2048
CPU_COUNT = 2

$script = <<SCRIPT
CONFIG_REPO=$1
if [ ! -d /deploy ]; then
    echo "Create directory /deploy." 1>&2
    mkdir /deploy
fi

if [ ! -d /deploy/config ]; then
    git clone $CONFIG_REPO /deploy/config
else
    cd /deploy/config
    git pull
fi

ansible-playbook -i localhost, -c local /deploy/config/playbooks/devstack.yml
SCRIPT

$autorun = <<AUTORUN
service nginx restart
service uwsgi restart
AUTORUN
	
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "myproject"
    config.vm.box_url = "devstack.box"

    config.vm.network :private_network, ip: "192.168.33.11"
    config.vm.network :forwarded_port, guest: 8000, host: 8000
    config.vm.network :forwarded_port, guest: 8001, host: 8001
    config.ssh.insert_key = true
    config.vm.synced_folder  ".", "/vagrant", disabled: true
    config.vm.synced_folder  ".", BASE_PATH, create: true, nfs: true

    config.vm.provider :virtualbox do |vb|
        vb.customize ["modifyvm", :id, "--memory", MEMORY.to_s]
        vb.customize ["modifyvm", :id, "--cpus", CPU_COUNT.to_s]
        vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    end

    config.vbguest.auto_reboot = true
    config.vbguest.auto_update = true

    config.vm.provision "shell", inline: $script, args: CONFIG_REPO
    config.vm.provision "shell", inline: $autorun, run: "always"
end

打包发布

退出虚拟机环境并关闭 Vagrant:

shellvagrant halt

打包发布 box 文件:

shellvagrant package

并将生成的 package.box 重命名为 devstack.box。

Ansible playbook 自动部署开发环境

参见代码:

shellgit clone https://github.com/mine/project.git

ansible 脚本使用 template 无法将文件直接生成到同步的文件夹内,需要先生成在临时文件夹内,再移动到目标路径下。

安装开发环境

devstack.boxVagrantfile 放在同一部目录下。命令行切换到该目录路径下,执行 vagrant up

uWSGI 太过混乱,apt-get 安装的版本和 pip install 安装的版本,版本号一样,但是命令行参数竟然完全不同。UWSGI_PYHOME 也不再支持。准备换投 Gunicorn。

迁移开发环境

可以将配置好的虚拟机环境打包。

导出

在迁出系统的 Vagrant 工作路径下执行命令:

shellvagrant package --output mydevstack.box

备份 my-dev-env.box 文件,以及 vagrant\machines\<name>\virtualbox\private_key 文件。

导入

在迁入系统的 Vagrant 工作路径下执行命令:

shellvagrant box add mydevstack mydevstack.box
vagrant init mydevstack

并将 private_key 文件复制到当前的对应路径下。

shellvagrant up