Cet article vous aidera à comprendre comment utiliser Vagrant pour gérer les instances de machines virtuelles et expliquera comment exploiter Puppet pour configurer diverses ressources telles que PHP et PostgreSQL.
Les développeurs disposent de plusieurs façons de créer leur environnement de développement Web.
Les développeurs disposent de plusieurs façons de créer leur environnement de développement Web. Vous pouvez utiliser des options « natives », comme l'installation d'une pile de serveur « tout-en-un » prédéfinie telle que Zend Server, XAMPP, MAMP, WAMP, etc., ou vous pouvez installer les composants vous-même à partir des sources, ou via un système de gestion de paquets tel que Homebrew, Apt et Yum.
Cela peut s'additionner lorsque vous travaillez sur divers projets utilisant PHP 5.3 et PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS, etc. Si vous effectuez une mise à niveau ou si votre ordinateur se bloque, vous devrez recommencer.
Vous pouvez le configurer "à distance" à l'aide d'un serveur avec un partage Samba sur votre réseau ou d'un serveur SSH installé à l'aide d'un outil comme ExpanDrive. Cette dernière option peut entraîner des retards de lecture/écriture des fichiers, ce qui peut être très ennuyeux. Vous pouvez utiliser SSH + Vim pour tout faire, ce qui est rapide, mais seulement si vous souhaitez utiliser Vim pour tout faire.
Même si vous êtes peut-être satisfaits de la façon dont les choses fonctionnent actuellement, combien d'entre vous ont entendu (ou dit) « ça fonctionne très bien sur mon ordinateur ». Ceci est très courant et peut se produire en cas de différences de circonstances, même dans les détails les plus insignifiants.
Il est important de vous assurer que votre environnement de développement est le même que votre environnement de production et correspond à vos serveurs de test et de test (si vous en avez également).
Cela peut sembler simple si vous envisagez simplement d'installer quelques copies d'Apache, PHP et MySQL, mais il y a un million de facteurs à prendre en compte. Si vous développez sur OSX et déployez sur un système Ubuntu, vous remarquerez des problèmes intéressants avec la casse des fichiers. Ceci est courant dans CodeIgniter lorsque quelqu'un possède une bibliothèque avec une première lettre minuscule. Il se charge correctement sur OSX mais plante lorsqu'il est déployé en production. Votre processus de développement pourrait bien vous coûter quelques affaires, tout cela à cause d'une différence insignifiante entre les systèmes d'exploitation dont personne ne se rend compte avant qu'il ne soit trop tard.
Forcer les développeurs à utiliser le même système d'exploitation peut entraîner des problèmes.
Alors quelle est la solution ? Forcer tous les développeurs à abandonner différents outils et à développer exactement le même modèle d'ordinateur portable ? Si vos développeurs utilisent tous des Macbooks flambant neufs, vous ne recevrez probablement pas beaucoup de plaintes, mais vous aurez besoin d'OSX Server pour tout faire.
Vous pouvez tout faire avec Linux, mais vous devez vous demander quelle distribution utiliser. Forcer les développeurs à utiliser le même système d’exploitation peut entraîner des problèmes, réduire la productivité et favoriser les guerres de nerds.
La virtualisation est la réponse, ce n'est pas nouveau, mais quand les gens pensent à la virtualisation, ils pensent souvent aux problèmes de performances, à leurs ventilateurs qui tournent comme des fous et à leurs ordinateurs portables essayant désespérément d'exécuter deux systèmes d'exploitation.
Vous obtenez toujours cela lorsque vous essayez d'exécuter Windows sur des machines à faible consommation, mais de nos jours, le Mac moyen dispose de 4 Go de RAM prêts à l'emploi, ce qui est plus que suffisant pour alimenter une installation de serveur Ubuntu fonctionnant sous Windows. Mode ligne de commande et tous les outils de développement courants (IDE, navigateur, outils de débogage, etc.). Il existe plusieurs options de virtualisation, mais je préfère VirtualBox d'Oracle (gratuit). Le logiciel fait tout le gros du travail de virtualisation, et un outil appelé Vagrant gère ensuite les instances.
Téléchargez d’abord VirtualBox et installez-le. Sur les systèmes *nix (Mac OSX, Linux, etc.) vous devez modifier la variable .bash_profile
(或 .zsh_profile)以扩展 $PATH
:
PATH=$PATH:/Applications/VirtualBox.app/Contents/MacOS/ export PATH
Cela permettra à Vagrant de savoir où VirtualBox est installé, mais bien sûr, cela variera selon les systèmes d'exploitation.
Vous pouvez télécharger la version vagrant pour votre système d'exploitation ou l'installer comme un joyau si elle n'est pas disponible :
$ gem install vagrant
Donnez à votre configuration vagabonde un endroit où vivre :
mkdir -p ~/Vagrant/test cd ~/Vagrant/test
Nous utiliserons Ubuntu 12.04 LTS (Precise Pangolin), qui a une "box" déjà configurée.
vagrant box add precise32 http://files.vagrantup.com/precise32.box
Vous pouvez voir ici le paramètre "precise32", qui est le surnom de l'URL. Vous pouvez maintenant créer une instance qui téléchargera ce .box.
vagrant init precise32 vagrant up
Il fonctionnera maintenant. Simple! Si vous souhaitez vous connecter en SSH à cette instance, utilisez la commande suivante :
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 不仅设置了一个可供我们使用的服务器实例,而且还为我们的服务器创建了一个测试套件,以确保一切都正确运行、安装和配置。
我们还创建了一份需求清单,并且将来能够在几分钟而不是几小时内创建任意数量的相同服务器!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!