使用 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.box
和 Vagrantfile
放在同一部目录下。命令行切换到该目录路径下,执行 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