使用Vagrant/Puppet与Django -- URL是什么?
我之前在使用Vagrant和Puppet搭建Apache/MySQL/PHP环境时一切顺利,但现在我想尝试搭建Python/Django环境。一个热门的Github项目里有一些文件,不过那些文件有点过时——我修正了它们,现在运行Vagrant和Puppet时没有错误,但我却无法访问它。
这是我的文件:
VagrantFile
# -*- 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 = "hashicorp/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://puppet-vagrant-boxes.puppetlabs.com/ubuntu-1310-x64-virtualbox-puppet.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, 8080
# 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_data", "../data"
# Provisioning
config.vm.provision :shell do |shell|
shell.inline = "mkdir -p /etc/puppet/modules;
# (puppet module install stankevich-python; true)
"
end
# 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 site.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.pm.com",
# "aliases" => "*.dev.pm.com",
# "hostname" => "dev",
# "docroot" => '/var/www/html/',
#}
puppet.manifests_path = "manifests"
puppet.manifest_file = "site.pp"
end
end
site.pp
Exec { path => '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin' }
# Global variables
$inc_file_path = '/vagrant/manifests/files' # Absolute path to the files directory (If you're using vagrant, you can leave it alone.)
$tz = 'America/Los_Angeles' # Timezone
$user = 's98' # User to create
$password = 'password' # The user's password
$project = 's98pm' # Used in nginx and uwsgi
$domain_name = 'dev.pm.com' # Used in nginx, uwsgi and virtualenv directory
$db_name = 's98pm' # Mysql database name to create
$db_user = 'pmadmin' # Mysql username to create
$db_password = 'pass123' # Mysql password for $db_user
include timezone
include user
include apt
include nginx
#include python
include uwsgi
include mysql
include virtualenv
include pildeps
include software
class timezone {
package { "tzdata":
ensure => latest,
require => Class['apt']
}
file { "/etc/localtime":
require => Package["tzdata"],
source => "file:///usr/share/zoneinfo/${tz}",
}
}
class user {
exec { 'add user':
command => "sudo useradd -m -G sudo -s /bin/bash ${user}",
unless => "id -u ${user}"
}
exec { 'set password':
command => "echo \"${user}:${password}\" | sudo chpasswd",
require => Exec['add user']
}
# Prepare user's project directories
file { ["/home/${user}/virtualenvs",
"/home/${user}/public_html",
"/home/${user}/public_html/${domain_name}",
"/home/${user}/public_html/${domain_name}/static"
]:
ensure => directory,
owner => "${user}",
group => "${user}",
require => Exec['add user'],
before => File['media dir']
}
file { 'media dir':
path => "/home/${user}/public_html/${domain_name}/media",
ensure => directory,
owner => "${user}",
group => 'www-data',
mode => 0775,
require => Exec['add user']
}
}
class apt {
exec { 'apt-get update':
timeout => 0
}
package { 'python-software-properties':
ensure => latest,
require => Exec['apt-get update']
}
exec { 'add-apt-repository ppa:nginx/stable':
require => Package['python-software-properties'],
before => Exec['last ppa']
}
exec { 'last ppa':
command => 'add-apt-repository ppa:git-core/ppa',
require => Package['python-software-properties']
}
exec { 'apt-get update again':
command => 'apt-get update',
timeout => 0,
require => Exec['last ppa']
}
}
class nginx {
package { 'nginx':
ensure => latest,
require => Class['apt']
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx']
}
file { '/etc/nginx/sites-enabled/default':
ensure => absent,
require => Package['nginx']
}
file { 'sites-available config':
path => "/etc/nginx/sites-available/${domain_name}",
ensure => file,
content => template("${inc_file_path}/nginx/nginx.conf.erb"),
require => Package['nginx']
}
file { "/etc/nginx/sites-enabled/${domain_name}":
ensure => link,
target => "/etc/nginx/sites-available/${domain_name}",
require => File['sites-available config'],
notify => Service['nginx']
}
}
package { 'curl':
ensure => latest,
require => Class['apt']
}
class { 'python':
version => 'system',
pip => true,
dev => true,
virtualenv => true,
gunicorn => true,
}
class uwsgi {
$sock_dir = '/tmp/uwsgi' # Without a trailing slash
$uwsgi_user = 'www-data'
$uwsgi_group = 'www-data'
package { 'uwsgi':
ensure => latest,
provider => pip,
require => Class['python']
}
service { 'uwsgi':
ensure => running,
enable => true,
require => File['apps-enabled config']
}
# Prepare directories
file { ['/var/log/uwsgi', '/etc/uwsgi', '/etc/uwsgi/apps-available', '/etc/uwsgi/apps-enabled']:
ensure => directory,
require => Package['uwsgi'],
before => File['apps-available config']
}
# Prepare a directory for sock file
file { [$sock_dir]:
ensure => directory,
owner => "${uwsgi_user}",
require => Package['uwsgi']
}
# Upstart file
file { '/etc/init/uwsgi.conf':
ensure => file,
source => "${inc_file_path}/uwsgi/uwsgi.conf",
require => Package['uwsgi']
}
# Vassals ini file
file { 'apps-available config':
path => "/etc/uwsgi/apps-available/${project}.ini",
ensure => file,
content => template("${inc_file_path}/uwsgi/uwsgi.ini.erb")
}
file { 'apps-enabled config':
path => "/etc/uwsgi/apps-enabled/${project}.ini",
ensure => link,
target => "/etc/uwsgi/apps-available/${project}.ini",
require => File['apps-available config']
}
}
class mysql {
$create_db_cmd = "CREATE DATABASE ${db_name} CHARACTER SET utf8;"
$create_user_cmd = "CREATE USER '${db_user}'@localhost IDENTIFIED BY '${db_password}';"
$grant_db_cmd = "GRANT ALL PRIVILEGES ON ${db_name}.* TO '${db_user}'@localhost;"
package { 'mysql-server':
ensure => latest,
require => Class['apt']
}
package { 'libmysqlclient-dev':
ensure => latest,
require => Class['apt']
}
service { 'mysql':
ensure => running,
enable => true,
require => Package['mysql-server']
}
exec { 'grant user db':
command => "mysql -u root -e \"${create_db_cmd}${create_user_cmd}${grant_db_cmd}\"",
unless => "mysqlshow -u${db_user} -p${db_password} ${db_name}",
require => Service['mysql']
}
}
class virtualenv {
package { 'virtualenv':
ensure => latest,
provider => pip,
require => Class['python', 'user']
}
exec { 'create virtualenv':
command => "virtualenv ${domain_name}",
cwd => "/home/${user}/virtualenvs",
user => $user,
creates => "/home/${user}/virtualenvs/${domain_name}",
require => Package['virtualenv']
}
file { "/home/${user}/virtualenvs/${domain_name}/requirements.txt":
ensure => file,
owner => "${user}",
group => "${user}",
mode => 0644,
source => "${inc_file_path}/virtualenv/requirements.txt",
require => Exec['create virtualenv']
}
}
class pildeps {
package { ['python-imaging', 'libjpeg-dev', 'libfreetype6-dev']:
ensure => latest,
require => Class['apt'],
before => Exec['pil png', 'pil jpg', 'pil freetype']
}
exec { 'pil png':
command => 'sudo ln -s /usr/lib/`uname -i`-linux-gnu/libz.so /usr/lib/',
unless => 'test -L /usr/lib/libz.so'
}
exec { 'pil jpg':
command => 'sudo ln -s /usr/lib/`uname -i`-linux-gnu/libjpeg.so /usr/lib/',
unless => 'test -L /usr/lib/libjpeg.so'
}
exec { 'pil freetype':
command => 'sudo ln -s /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/',
unless => 'test -L /usr/lib/libfreetype.so'
}
}
class software {
package { 'git':
ensure => latest,
require => Class['apt']
}
package { 'vim':
ensure => latest,
require => Class['apt']
}
}
我尝试访问以下网址:
127.0.0.1
127.0.0.1:8000
dev.pm.com
dev.pm.com:8000
我漏掉了什么吗?
1 个回答
2
我猜你想从虚拟机外部访问在Vagrant里运行的应用程序。为了做到这一点,你需要把虚拟机内部运行的Django应用程序的端口转发到主机上。使用Vagrantfile API v2,这样设置:
config.vm.network :forwarded_port, host: 8000, guest: 80
这段代码告诉Vagrant,你的应用在虚拟机内部的80端口上运行(我猜是这样,因为你有nginx的配置),所以它会把这个80端口转发到你主机的8000端口上。这样,如果你用这个配置启动虚拟机,任何在虚拟机内部80端口上运行的服务器,都可以通过你主机上的 http://127.0.0.1:8000/
访问到。