本文將協助您了解如何使用 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 的工具來管理實例。
先下載VirtualBox並安裝它。在 *nix 系統(Mac OSX、Linux 等)上,您需要修改 .bash_profile
(或 .zsh_profile)以擴展 $PATH
變數:
PATH=$PATH:/Applications/VirtualBox.app/Contents/MacOS/ export PATH
這將使 Vagrant 知道 VirtualBox 的安裝位置,當然,不同的作業系統會有所不同。
您可以下載適用於您的作業系統的 vagrant 版本,或者如果不可用,則將其安裝為 gem:
$ gem install vagrant
為你的 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
您将有一个名为 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
一堆软件包,我们还要“配置”我们的服务器。
服务器配置并不是许多开发人员需要考虑的问题。
服务器配置并不是许多开发人员需要考虑的事情,因为它通常留给系统管理员。这个想法是对服务器上的软件和配置进行一些记录,以便您可以创建新的开发环境、复制生产的新登台服务器,或者创建另一个生产服务器以在两者之间进行负载平衡。
系统管理员处理这个问题的方式各不相同,但过去已经使用过各种解决方案 - 从保持命令维基运行(它可能会很快变得庞大和过时)到拥有“多终端”的绝佳方法,您在一个窗口中输入命令,它会同时在另外 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中文網其他相關文章!