6

我第一次尝试使用 Vagrant + Puppet Provisioning 脚本来改进我的开发工作流程。

我目前正在尝试为 L4 开发设置一个开发箱 - 并且正在使用https://github.com/paolooo/vagrant-lamphttps://github.com/paolooo/puppet-laravel

按照说明:

克隆 LAMP 框:

git clone git://github.com/paolooo/vagrant-lamp.git lamp
cd lamp

添加 Puppet 配置脚本:

git submodule add https://github.com/paolooo/puppet-laravel.git extras/modules/laravel

然后更新子模块:

git submodule update --init --recursive

到目前为止很棒 - 简单的东西......

所以现在准备运行vagrant up- 这似乎可以很好地配置 VM,并启动它。

然而,当 init.pp 脚本运行时,我的问题似乎开始了。运行时我得到了很多 404 apt-get <<package>>

我的第一个想法是网络接口可能已关闭 - 但mysql-client下载工作(我认为)查看日志。

我在 OSX 和 Windows 机器上试过这个。

任何帮助将不胜感激 - 我不想在第一个障碍中跌倒。

我的木偶脚本:

# Default path
Exec { path => ['/usr/bin', '/bin', '/usr/sbin', '/sbin', '/usr/local/bin', '/usr/local/sbin', '/opt/local/bin'] }
exec { 'apt-get update':
  command => '/usr/bin/apt-get update --fix-missing',
  require => Exec['add php54 apt-repo']
}

# Configuration
if $db_name == '' { $db_name = 'development' }
if $db_location == '' { $db_location  = '/vagrant/db/development.sqlite' }
if $username == '' { $username = 'root' }
if $password == '' { $password = '123' }
if $host == '' { $host = 'localhost' }

# Setup

## PHP
include php54
class { 'php': version => latest, }

## APACHE2
include apache
class {'apache::mod::php': }

## PACKAGES
## 'vim','curl','unzip','git','php5-mysql','php5-sqlite','php5-mcrypt','php5-memcache',
## 'php5-suhosin','php5-xsl','php5-tidy','php5-dev','php5-pgsql','php5-odbc', 'php5-ldap','php5-xmlrpc','php5-intl','php5-fpm'
package { ['vim','curl','unzip','git','php5-mcrypt','php5-memcached']:
  ensure  => installed,
  require => Exec['apt-get update'],
}

package { ['php5-mysql','php5-sqlite']:
  ensure  => installed,
  require => Exec['apt-get update'],
}

include pear
include composer

### Apache
apache::vhost { $fqdn:
  priority  => '20',
  port => '80',
  docroot => $docroot,
  logroot => $docroot, # access_log and error_log
  configure_firewall  => false,
}
a2mod { 'rewrite': ensure => present }

## Ruby
class { "ruby": 
  gems_version => "latest"
}

## Nodejs
class { "nodejs": }

## PHP MODULES
php::module { ['curl', 'gd']:
  notify  => [ Service['httpd'], ],
}

## PEAR
pear::package { "PEAR": }
pear::package { "PHPUnit": 
  version     => "latest",
  repository  => "pear.phpunit.de",
  require     => Pear::Package["PEAR"],
}
pear::package { "Yaml": 
  version     => "latest",
  repository  => "pear.symfony.com",
  require     => Pear::Package["PEAR"]
}

## DB
### MySQL
class { 'mysql::server':
  config_hash => { 'root_password' => "${password}" }
}
class { 'mysql': }
mysql::db { "${db_name}":
  user  => "${username}",
  password  => "${password}",
  host  =>  "${host}",
  grant => ['all'],
  charset => 'utf8',
}

### PostgreSQL
class { 'postgresql':
  version => 'latest',
}
class { 'postgresql::server': }
postgresql::db { "${db_name}":
  owner => "${username}",
  password  => "${password}",
}

### SQLite Config
class { 'sqlite': }
define sqlite::db(
    $location   = '',
    $owner      = 'root',
    $group      = 0,
    $mode       = '755',
    $ensure     = present,
    $sqlite_cmd = 'sqlite3'
  ) {

      file { $safe_location:
        ensure  => $ensure,
        owner   => $owner,
        group   => $group,
        notify  => Exec['create_development_db']
      }

      exec { 'create_development_db':
        command     => "${sqlite_cmd} $db_location",
        path        => '/usr/bin:/usr/local/bin',
        refreshonly => true,
      }
  }

## phpmyadmin
class { 'phpmyadmin': } 

我的流浪文件:

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

Vagrant::Config.run do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "precise32"

  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"

  # Boot with a GUI so you can see the screen. (Default is headless)
  # config.vm.boot_mode = :gui

  # 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"

  # Assign this VM to a bridged network, allowing you to connect directly to a
  # network using the host's network device. This makes the VM appear as another
  # physical device on your network.
  # config.vm.network :bridged

  # 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, 8082

  # Share an additional folder to the guest VM. The first argument is
  # an identifier, the second is the path on the guest to mount the
  # folder, and the third is the path on the host to the actual folder.
  config.vm.share_folder "v-data", "/vagrant/db", "./db"
  config.vm.share_folder "v-web", "/vagrant/www", "c:\\www"

  # Enable provisioning with Puppet stand alone.  Puppet manifests
  # are contained in a directory path relative to this Vagrantfile.
  # You will need to create the manifests directory and a manifest in
  # the file base.pp in the manifests_path directory.
  #
  # An example Puppet manifest to provision the message of the day:
  #
  # # group { "puppet":
  # #   ensure => "present",
  # # }
  # #
  # # File { owner => 0, group => 0, mode => 0644 }
  # #
  # # file { '/etc/motd':
  # #   content => "Welcome to your Vagrant-built virtual machine!
  # #               Managed by Puppet.\n"
  # # }
  #
  config.vm.provision :puppet do |puppet|
    puppet.facter = {
      "fqdn"      => "dev.lamp.mysql",
      "hostname"  => "www",
      "docroot"   => "/vagrant/www",
      "host"      => 'localhost',
      "username"  => 'root',
      "password"  => '123',
      "db_name"   => "development",
      "db_location" => "/vagrant/db/development.sqlite"
    }
    puppet.manifests_path = "puppet/manifests"
    puppet.module_path = ["puppet/modules", "extras/modules"]
    puppet.manifest_file  = "init.pp"
  end

  # Enable provisioning with chef solo, specifying a cookbooks path, roles
  # path, and data_bags path (all relative to this Vagrantfile), and adding 
  # some recipes and/or roles.
  #
  # config.vm.provision :chef_solo do |chef|
  #   chef.cookbooks_path = "../my-recipes/cookbooks"
  #   chef.roles_path = "../my-recipes/roles"
  #   chef.data_bags_path = "../my-recipes/data_bags"
  #   chef.add_recipe "mysql"
  #   chef.add_role "web"
  #
  #   # You may also specify custom JSON attributes:
  #   chef.json = { :mysql_password => "foo" }
  # end

  # Enable provisioning with chef server, specifying the chef server URL,
  # and the path to the validation key (relative to this Vagrantfile).
  #
  # The Opscode Platform uses HTTPS. Substitute your organization for
  # ORGNAME in the URL and validation key.
  #
  # If you have your own Chef Server, use the appropriate URL, which may be
  # HTTP instead of HTTPS depending on your configuration. Also change the
  # validation key to validation.pem.
  #
  # config.vm.provision :chef_client do |chef|
  #   chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
  #   chef.validation_key_path = "ORGNAME-validator.pem"
  # end
  #
  # If you're using the Opscode platform, your validator client is
  # ORGNAME-validator, replacing ORGNAME with your organization name.
  #
  # IF you have your own Chef Server, the default validation client name is
  # chef-validator, unless you changed the configuration.
  #
  #   chef.validation_client_name = "ORGNAME-validator"
end
4

2 回答 2

5

看来问题是正在执行 apt-get update note,不知道为什么会这样,因为我的 Puppet 脚本似乎已正确配置为调用它...

但是 - 我能够通过在我的 Vagrant 文件中添加以下行来解决这个问题:

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

不过很想知道 puppet 配置有什么问题,因为能够避免将其放入 Vagrant 文件中会很好。

于 2013-04-15T10:51:42.513 回答
2

首先,您引用了一些未包含在您的帖子中的类,所以我无法评论这些。

看起来您有木偶订购问题;我建议再次运行它并确定哪些特定的包部署失败并确定它们属于哪个类。因此,例如,如果类 y 中的某个包 x 失败,请将以下内容添加到您的初始化脚本中,就在相关类的右括号之前 -

class y {

    package { "x":

       ensure  => installed,
    }

    Exec["apt-get update"] -> Class["y"]  

}

以上将确保apt-get update在运行任何类“y”配置之前完成。

或者,对于包资源类型,您可以继续添加 -

require => Exec['apt-get update'] ,但我发现类排序更整洁。

于 2013-04-15T13:29:55.827 回答