0

0

探索 Vagrant:了解其目的、好处和实施

王林

王林

发布时间:2023-09-02 13:09:03

|

1055人浏览过

|

来源于php中文网

原创

探索 vagrant:了解其目的、好处和实施

本文将帮助您了解如何使用 Vagrant 来管理虚拟机实例,并解释如何利用 Puppet 来配置各种资源,例如 PHP 和 PostgreSQL。


简介

开发人员有多种方法来构建他们的 Web 开发环境。

开发人员有多种方法来构建他们的 Web 开发环境。您可以使用“本地”选项,例如安装预构建的“一体化”服务器堆栈,例如 Zend Server、XAMPP、MAMP、WAMP 等,或者您可以从源代码自行安装组件,或者通过软件包管理系统,例如 Homebrew、Apt 和 Yum。

当您使用 PHP 5.3 和 PHP 5.4、MySQL、SQLite、MongoDB、Postgres、PEAR、PHPUnit、Rails 3.1、Memcached、Redis、Gearman、NodeJS 等处理各种项目时,这可能会逐渐增加。如果您升级或你的电脑死机了,你将不得不重新开始。

您可以使用网络上具有 Samba 共享的服务器或使用 ExpanDrive 等工具安装的 SSH 服务器进行“远程”设置。后一个选项可能会导致文件读/写延迟,这非常烦人。您可以使用 SSH + Vim 来完成所有事情,这很快,但只有当您想使用 Vim 来完成所有事情时才有效。


开发与生产

虽然您可能对现在的工作方式感到满意,但有多少人听说过(或说过)“它在我的计算机上运行得很好”。这种情况非常常见,当环境存在差异时,即使是最微不足道的细节也会发生这种情况。

确保您的开发环境与生产环境相同,并与临时和测试服务器相匹配(如果您也有的话)非常重要。

如果您只考虑安装 Apache、PHP 和 MySQL 的一些副本,这听起来可能很简单,但有一百万个因素需要考虑。如果您在 OSX 上进行开发并部署到 Ubuntu 系统,那么您会注意到文件大小写的有趣问题。当有人拥有首字母小写的库时,这在 CodeIgniter 中很常见。它可以在 OSX 上正常加载,但在部署到生产环境时会崩溃。您的开发过程可能只是让您失去了一些业务,这一切都是因为一些微不足道的操作系统差异,没有人意识到,直到为时已晚。


开发=生产

强迫开发人员使用相同的操作系统会导致问题。

那么解决办法是什么呢?迫使所有开发人员放弃不同的工具并在完全相同型号的笔记本电脑上进行开发?如果您的开发人员都使用全新的 Macbook,那么您可能不会收到太多投诉,但您需要使用 OSX Server 来完成所有工作。

你可以使用 Linux 来做所有事情,但是你必须为使用哪个发行版而争论。强迫开发人员使用相同的操作系统会导致问题、降低生产力并促进书呆子之间的争斗。

虚拟化就是答案,这并不是什么新鲜事,但是当人们想到虚拟化时,他们经常会想到性能问题,他们的风扇会疯狂旋转,而他们的笔记本电脑会拼命地尝试运行两个操作系统。

尝试在低功耗机器上运行 Windows 时仍然会遇到这种情况,但如今,普通 Mac 开箱即用有 4 GB RAM,这足以为运行在 Windows 上的 Ubuntu 服务器安装提供动力。命令行模式和所有常用的开发工具(IDE、浏览器、调试工具等)。虚拟化有几个选项,但我更喜欢 Oracle 的 VirtualBox(免费)。该软件完成了虚拟化的所有繁重工作,然后由一个名为 Vagrant 的工具来管理实例。


第 1 步 - 安装 VirtualBox

首先下载VirtualBox并安装它。在 *nix 系统(Mac OSX、Linux 等)上,您需要修改 .bash_profile (或 .zsh_profile)以扩展 $PATH 变量:

PATH=$PATH:/Applications/VirtualBox.app/Contents/MacOS/
export PATH

这将使 Vagrant 知道 VirtualBox 的安装位置,当然,不同的操作系统会有所不同。


第 2 步 - 安装 Vagrant

您可以下载适用于您的操作系统的 vagrant 版本,或者如果不可用,则将其安装为 gem:

$ gem install vagrant

第 3 步 - 创建实例

为你的 vagrant 设置提供一个生存的地方:

mkdir -p ~/Vagrant/test
cd ~/Vagrant/test

我们将使用 Ubuntu 12.04 LTS(Precise Pangolin),它已经设置了一个“盒子”。

vagrant box add precise32 http://files.vagrantup.com/precise32.box

您可以在此处看到参数“precise32”,它是 URL 的昵称。您现在可以创建一个实例,该实例将下载此 .box。

vagrant init precise32
vagrant up

它现在将运行。简单的!如果您想通过 SSH 进入此实例,请使用以下命令:

vagrant ssh

第 5 步 - 配置

您将有一个名为 Vagrantfile 的文件,其中包含此实例的配置:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant::Config.run do |config|

    config.vm.box = "precise32"
    config.vm.box_url = "http://files.vagrantup.com/precise32.box"

    # Assign this VM to a host-only network IP, allowing you to access it
    # via the IP. Host-only networks can talk to the host machine as well as
    # any other machines on the same network, but cannot be accessed (through this
    # network interface) by any external networks.
    config.vm.network :hostonly, "192.168.33.10"

    # Set the default project share to use nfs
    config.vm.share_folder("v-web", "/vagrant/www", "./www", :nfs => true)
    config.vm.share_folder("v-db", "/vagrant/db", "./db", :nfs => true)

    # Forward a port from the guest to the host, which allows for outside
    # computers to access the VM, whereas host only networking does not.
    config.vm.forward_port 80, 8080

    # Set the Timezone to something useful
    config.vm.provision :shell, :inline => "echo \"Europe/London\" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata"

    # Update the server
    config.vm.provision :shell, :inline => "apt-get update --fix-missing"

    # Enable Puppet
    config.vm.provision :puppet do |puppet|
        puppet.facter = { "fqdn" => "local.pyrocms", "hostname" => "www" } 
        puppet.manifests_path = "puppet/manifests"
        puppet.manifest_file  = "ubuntu-apache2-pgsql-php5.pp"
        puppet.module_path  = "puppet/modules"
    end

end

如果您没有注意到,这是 Ruby 语法;这样您就可以对该文件发挥相当大的创意,但这是基础知识。

它将显示要使用的昵称并具有 URL,以防本地未设置昵称(适合共享)。

share_folder 行对于将实例中的文件夹映射到本地文件夹非常有用。使用 nfs => true 实例将能够写入和更改文件的权限,这在您尝试在其中安装 CMS 等情况时非常有用。

端口转发允许您访问 http://localhost:8080 上的实例,当然,如果发生冲突,请将其更改为其他端口。

此配置文件还将时区设置为欧洲/伦敦,然后运行 ​​apt-get update,这将强制您的系统在启动时保持最新状态。如果您跳过此配置项,您可能会发现多个软件包拒绝安装,因为参考现已过时。

当您更改配置时,您可以重新加载实例来使用它:

vagrant reload

现在我们的服务器已经运行并准备就绪,我们需要安装一些软件。我们不仅仅要通过命令行 apt-get install 一堆软件包,我们还要“配置”我们的服务器。


第 4 步 - 配置

服务器配置并不是许多开发人员需要考虑的问题。

服务器配置并不是许多开发人员需要考虑的事情,因为它通常留给系统管理员。这个想法是对服务器上的软件和配置进行一些记录,以便您可以创建新的开发环境、复制生产的新登台服务器,或者创建另一个生产服务器以在两者之间进行负载平衡。

老式配置

系统管理员处理这个问题的方式各不相同,但过去已经使用过各种解决方案 - 从保持命令维基运行(它可能会很快变得庞大和过时)到拥有“多终端”的绝佳方法,您在一个窗口中输入命令,它会同时在另外 7 台服务器上复制相同的命令。 这些方法都很糟糕。

一种解决方案是构建您自己的 .box 文件,或创建 .iso 备份,以便新服务器可以基于此,但维护这些图像会产生大量额外的工作,而且无论多么困难你尝试一下,随着时间的推移,这些开发机器将会变得不同步。

现代配置

目前有两种流行的系统,称为 Puppet 和 Chef。

Elser AI Comics
Elser AI Comics

一个免费且强大的AI漫画生成工具,助力你三步创作自己的一出好戏

下载

目前有两种流行的系统,称为 Puppet 和 Chef。两者都已存在多年,但随着 DevOps 开发方法的增加而开始变得更加流行。两者的想法相似,您应该研究这两个系统,但本教程将专门关注 Puppet。

本质上,您不必运行一堆命令并希望一切正常,而是为 Puppet 构建一个清单,解释您需要确保已完成的所有内容。当您在终端中运行命令时,您基本上是在对计算机说:

“安装 Apache”

对于 Puppet,我们会说:

“确保 Apache 已安装”

或者,代替:

“创建一个新文件夹,名为 /var/www 并设置 www-data:www-data 的权限”

对于 Puppet,我们会说:

“确保 /var/www 存在并且具有与 www-data:www-data 匹配的权限”

这里的区别在于,这些清单可以运行多次(在 cron 作业中每小时或每天)以保持最新状态,并且尝试安装两次不会出现意外结果。

它还将帮助您测试一切是否按预期运行,因为任何规则失败都会引发错误,这些错误比 grep 大量 bash 命令结果更容易跟踪。 Puppet 会抛出大红色错误,让您知道 PHP 没有安装,或者无法配置特定模块。

清单和模块

清单一开始有点令人困惑,但过了一段时间,它们就开始有意义了。

查看一个基本示例:

file {'testfile':
  path    => '/tmp/testfile',
  ensure  => present,
  mode    => 0640,
  content => "I'm a test file.",
}

无需解释这里发生了什么,对吧?

此文件稍后可以在清单中称为“testfile”,这意味着它可以被列为其他操作的依赖项。

有关更多示例,我们将参考 GitHub 上的 PyroCMS Puppet 清单。

include apache

$docroot = '/vagrant/www/pyrocms/'
$db_location = "/vagrant/db/pyrocms.sqlite"

# Apache setup
class {'apache::php': }

apache::vhost { 'local.pyrocms':
    priority => '20',
    port => '80',
    docroot => $docroot,
    configure_firewall => false,
}

a2mod { 'rewrite': ensure => present; }

这包括“apache”模块,设置一些变量,在 apache 模块中运行额外的“apache::php”清单,设置虚拟主机,然后确保启用“mod_rewrite”。

所有这些类都在我们包含的 Apache 模块中定义。

继续,我们还想安装 PHP:

include php

php::module { ['xdebug', 'pgsql', 'curl', 'gd'] : 
    notify => [ Service['httpd'], ],
}
php::conf { [ 'pdo', 'pdo_pgsql']:
    require => Package['php5-pgsql'],
    notify  => Service['httpd'],
}

这块清单将安装我们需要的 PHP 扩展,然后 notify 选项会让 Apache 知道您已经安装了新配置,这意味着它将重新启动。

include postgresql

class {'postgresql::server': }

postgresql::db { 'pyrocms':
    owner     => 'pyrocms',
    password => 'password',
}

这将设置一个 postgres 服务器,创建一个名为“pyrocms”的数据库,并确保名为“pyrocms”的用户存在并提供密码。

快完成了!最后一步是确保您正确设置了可写文件和文件夹:

file { $docroot:
    ensure  => 'directory',
}

file { "${docroot}system/cms/config/config.php":
    ensure  => "present",
    mode    => "0666",
    require => File[$docroot],
}

$writeable_dirs = ["${docroot}system/cms/cache/", "${docroot}system/cms/config/", "${docroot}addons/", "${docroot}assets/cache/", "${docroot}uploads/"]

file { $writeable_dirs:
    ensure => "directory",
    mode   => '0777',
    require => File[$docroot],
}

这将确保 Apache 文档根目录存在,配置文件设置为 0666,一些可写文件夹设置为 777。

我们有了!

要运行所有这些,只需重新启动 vagrant 实例,或运行:

vagrant provision

如果一切正常,您应该会看到很多蓝色文本,表明一切都正在安装,但是,如果出现问题,您会看到红色。 Google 搜索这些错误,然后重试。

这里使用的模块是:Apache、Postgres、PHP,您可以通过克隆 PyroCMS Vagrant 存储库来查看整个操作:

git clone --recursive git://github.com/pyrocms/devops-vagrant.git ~/vagrant/pyrocms
cd ~/vagrant/pyrocms
vagrant up

将浏览器指向 http://localhost:8089/,您应该会看到安装程序。很简单的事情,是吧?

注意:这将与 MySQL 一起安装,因为 PyroCMS 的 Postgres 和 SQLite 支持仍在开发中,等待某些 CodeIgniter PDO 功能完成。如果您有兴趣,可以通过更改 Vagrantfile 来尝试使用 ubuntu-apache2-pgsql-php5.pp 清单,销毁实例,然后再次启动它。 Pyrocms 子模块还需要签出到 feature/pdo


摘要

在本文中,我们使用 Vagrant、VirtualBox 和 Puppet 不仅设置了一个可供我们使用的服务器实例,而且还为我们的服务器创建了一个测试套件,以确保一切都正确运行、安装和配置。

我们还创建了一份需求清单,并且将来能够在几分钟而不是几小时内创建任意数量的相同服务器!

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

668

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

247

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

516

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

256

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

533

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

602

2023.08.14

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号