>  기사  >  백엔드 개발  >  Vagrant 살펴보기: 목적, 이점 및 구현 이해

Vagrant 살펴보기: 목적, 이점 및 구현 이해

王林
王林원래의
2023-09-02 13:09:03944검색

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

이 기사는 Vagrant를 사용하여 가상 머신 인스턴스를 관리하는 방법을 이해하고 Puppet을 활용하여 PHP 및 PostgreSQL과 같은 다양한 리소스를 구성하는 방법을 설명하는 데 도움이 됩니다.


소개

개발자는 웹 개발 환경을 구축하는 다양한 방법을 가지고 있습니다.

개발자는 웹 개발 환경을 구축하는 다양한 방법을 가지고 있습니다. 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에는 기본적으로 4GB의 RAM이 있으며 이는 Windows에서 실행되는 Ubuntu 서버 설치에 전력을 공급하기에 충분합니다. 명령줄 모드 및 모든 일반적인 개발 도구(IDE, 브라우저, 디버깅 도구 등). 가상화에는 여러 가지 옵션이 있지만 저는 Oracle의 VirtualBox(무료)를 선호합니다. 소프트웨어는 가상화의 모든 무거운 작업을 수행하고 Vagrant라는 도구가 인스턴스를 관리합니다.


1단계 -VirtualBox 설치

먼저 VirtualBox를 다운로드하고 설치하세요. *nix 시스템(Mac OSX, Linux 등)에서는 .bash_profile (或 .zsh_profile)以扩展 $PATH 변수를 수정해야 합니다.

으아아아

이렇게 하면 Vagrant가 VirtualBox가 설치된 위치를 알 수 있지만 물론 운영 체제에 따라 다릅니다.


2단계 - Vagrant 설치

운영 체제에 맞는 vagrant 버전을 다운로드하거나 사용할 수 없는 경우 gem으로 설치할 수 있습니다.

으아아아

3단계 -인스턴스 생성

부랑자에게 살 수 있는 장소를 제공하세요:

으아아아

우리는 이미 "상자"가 설정된 Ubuntu 12.04 LTS(Precise Pangolin)를 사용할 것입니다.

으아아아

여기서 URL의 닉네임인 "precise32" 매개변수를 볼 수 있습니다. 이제 이 .box를 다운로드할 인스턴스를 생성할 수 있습니다.

으아아아

이제 실행됩니다. 단순한! 이 인스턴스에 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。

目前有两种流行的系统,称为 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 不仅设置了一个可供我们使用的服务器实例,而且还为我们的服务器创建了一个测试套件,以确保一切都正确运行、安装和配置。

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

위 내용은 Vagrant 살펴보기: 목적, 이점 및 구현 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.