Heim >Backend-Entwicklung >PHP-Tutorial >Entdecken Sie Vagrant: Verstehen Sie seinen Zweck, seine Vorteile und seine Implementierung

Entdecken Sie Vagrant: Verstehen Sie seinen Zweck, seine Vorteile und seine Implementierung

王林
王林Original
2023-09-02 13:09:031054Durchsuche

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

Dieser Artikel hilft Ihnen zu verstehen, wie Sie Vagrant zum Verwalten von Instanzen virtueller Maschinen verwenden, und erklärt, wie Sie Puppet nutzen, um verschiedene Ressourcen wie PHP und PostgreSQL zu konfigurieren.


Einführung

Entwickler haben mehrere Möglichkeiten, ihre Webentwicklungsumgebung aufzubauen.

Entwickler haben mehrere Möglichkeiten, ihre Webentwicklungsumgebung aufzubauen. Sie können „native“ Optionen verwenden, z. B. die Installation eines vorgefertigten „All-in-One“-Server-Stacks wie Zend Server, XAMPP, MAMP, WAMP usw., oder Sie können die Komponenten selbst von der Quelle oder über installieren ein Paketverwaltungssystem wie Homebrew, Apt und Yum.

Dies kann sich summieren, wenn Sie an verschiedenen Projekten mit PHP 5.3 und PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS usw. arbeiten. Wenn Sie ein Upgrade durchführen oder Ihr Computer einfriert, müssen Sie von vorne beginnen.

Sie können es „remote“ einrichten, indem Sie einen Server mit einer Samba-Freigabe in Ihrem Netzwerk oder einen SSH-Server verwenden, der mit einem Tool wie ExpanDrive installiert wird. Die letztere Option kann zu Verzögerungen beim Lesen/Schreiben von Dateien führen, was sehr ärgerlich sein kann. Sie können SSH + Vim für alles verwenden, was schnell ist, aber nur, wenn Sie Vim für alles verwenden möchten.


Entwicklung und Produktion

Während Sie vielleicht damit zufrieden sind, wie die Dinge jetzt funktionieren, wie viele von Ihnen haben schon einmal gehört (oder gesagt): „Es funktioniert großartig auf meinem Computer.“ Dies kommt sehr häufig vor und kann passieren, wenn die Umstände bis ins kleinste Detail unterschiedlich sind.

Es ist wichtig sicherzustellen, dass Ihre Entwicklungsumgebung mit Ihrer Produktionsumgebung übereinstimmt und mit Ihren Staging- und Testservern übereinstimmt (falls Sie diese auch haben).

Das hört sich vielleicht einfach an, wenn Sie nur darüber nachdenken, ein paar Kopien von Apache, PHP und MySQL zu installieren, aber es gibt eine Million Faktoren, die berücksichtigt werden müssen. Wenn Sie unter OSX entwickeln und auf einem Ubuntu-System bereitstellen, werden Sie interessante Probleme mit der Dateiumschreibung bemerken. Dies kommt in CodeIgniter häufig vor, wenn jemand eine Bibliothek mit einem Kleinbuchstaben als Anfangsbuchstabe hat. Unter OSX lässt es sich gut laden, stürzt jedoch ab, wenn es in der Produktion bereitgestellt wird. Ihr Entwicklungsprozess kostet Sie möglicherweise nur einiges an Geschäft, und das alles aufgrund eines trivialen Betriebssystemunterschieds, den niemand erkennt, bis es zu spät ist.


Entwicklung = Produktion

Entwickler zu zwingen, dasselbe Betriebssystem zu verwenden, kann zu Problemen führen.

Was ist also die Lösung? Alle Entwickler dazu zwingen, unterschiedliche Tools aufzugeben und auf genau demselben Laptop-Modell zu entwickeln? Wenn Ihre Entwickler alle brandneue Macbooks verwenden, werden Sie wahrscheinlich nicht viele Beschwerden bekommen, aber Sie benötigen OSX Server, um alles zu tun.

Mit Linux kann man alles machen, aber man muss sich darüber streiten, welche Distribution man verwenden soll. Entwickler zu zwingen, dasselbe Betriebssystem zu verwenden, kann Probleme verursachen, die Produktivität verringern und Nerd-Kriege fördern.

Virtualisierung ist die Antwort, das ist nichts Neues, aber wenn Menschen an Virtualisierung denken, denken sie oft an Leistungsprobleme, ihre Lüfter drehen sich wie verrückt und ihre Laptops versuchen verzweifelt, zwei Betriebssysteme auszuführen.

Dieses Problem tritt immer noch auf, wenn Sie versuchen, Windows auf Computern mit geringem Stromverbrauch auszuführen, aber heutzutage verfügt der durchschnittliche Mac standardmäßig über 4 GB RAM, was mehr als genug ist, um eine Ubuntu-Serverinstallation unter Windows zu betreiben. Befehlszeilenmodus und alle gängigen Entwicklungstools (IDE, Browser, Debugging-Tools usw.). Es gibt mehrere Optionen für die Virtualisierung, ich bevorzuge jedoch die VirtualBox von Oracle (kostenlos). Die Software übernimmt die ganze schwere Arbeit der Virtualisierung, und ein Tool namens Vagrant verwaltet dann die Instanzen.


Schritt 1 – VirtualBox installieren

Laden Sie zunächst VirtualBox herunter und installieren Sie es. Auf *nix-Systemen (Mac OSX, Linux usw.) müssen Sie die Variable .bash_profile (或 .zsh_profile)以扩展 $PATH ändern:

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

Dadurch wird Vagrant darüber informiert, wo VirtualBox installiert ist, aber das kann natürlich je nach Betriebssystem unterschiedlich sein.


Schritt 2 – Vagrant installieren

Sie können die Vagrant-Version für Ihr Betriebssystem herunterladen oder als Gem installieren, wenn sie nicht verfügbar ist:

$ gem install vagrant

Schritt 3 – Instanz erstellen

Geben Sie Ihrem Vagabund einen Platz zum Leben:

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

Wir werden Ubuntu 12.04 LTS (Precise Pangolin) verwenden, für das bereits eine „Box“ eingerichtet ist.

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

Hier können Sie den Parameter „precise32“ sehen, der der Spitzname der URL ist. Sie können jetzt eine Instanz erstellen, die diese .box herunterlädt.

vagrant init precise32
vagrant up

Es wird jetzt ausgeführt. Einfach! Wenn Sie eine SSH-Verbindung zu dieser Instanz herstellen möchten, verwenden Sie den folgenden Befehl:

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

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

Das obige ist der detaillierte Inhalt vonEntdecken Sie Vagrant: Verstehen Sie seinen Zweck, seine Vorteile und seine Implementierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn