[puppet] Added nailgun module

This commit is contained in:
Vladimir Kozhukalov
2012-10-23 17:49:13 +04:00
committed by default
parent 4afc4e4bbe
commit 58858c7f0f
33 changed files with 941 additions and 146 deletions

3
.gitmodules vendored
View File

@@ -4,9 +4,6 @@
[submodule "puppet/mysql"]
path = puppet/mysql
url = git@github.com:kozhukalov/puppetlabs-mysql.git
[submodule "puppet/mcollective"]
path = puppet/mcollective
url = gitolite@gitolite.mirantis.com:fuel/deployment/puppet/mcollective
[submodule "puppet/cobbler"]
path = puppet/cobbler
url = gitolite@gitolite.mirantis.com:fuel/deployment/puppet/cobbler.git

View File

@@ -17,14 +17,19 @@ autopart
#logvol swap --fstype swap --name=swap --vgname=Nailgun --size=512 --grow --maxsize=4096
%packages --nobase --excludedocs
mcollective
@Core
wget
curl
crontabs
cronie
puppet
man
yum
%post --log=/root/post-log
function setconf {
echo
echo -n "Enter hostname: "; read hostname
echo -n "Enter hostname (FQDN): "; read hostname
echo -n "Enter device name: "; read device
echo -n "Enter ip: "; read ip
echo -n "Enter netmask: "; read netmask
@@ -82,7 +87,7 @@ function save_cfg {
set -- `cat /proc/cmdline`
for I in $*; do case "$I" in *=*) eval $I;; esac ; done
hostname="nailgun"
hostname="nailgun.mirantis.com"
ip=$ip
netmask=$netmask
gw=$gw
@@ -118,27 +123,51 @@ mkdir /tmp/cdrom
mount /dev/cdrom /tmp/cdrom
# Copying Repo to the nailgun /var/www directory
repodir="/var/www"
mkdir -p ${repodir}/centos
cp -r /tmp/cdrom/images ${repodir}/centos
cp -r /tmp/cdrom/isolinux ${repodir}/centos
cp -r /tmp/cdrom/repodata ${repodir}/centos
cp -r /tmp/cdrom/Packages ${repodir}/centos
repodir="/var/www/nailgun"
mkdir -p ${repodir}/centos/6.3/nailgun/x86_64
cp -r /tmp/cdrom/images ${repodir}/centos/6.3/nailgun/x86_64
cp -r /tmp/cdrom/isolinux ${repodir}/centos/6.3/nailgun/x86_64
cp -r /tmp/cdrom/repodata ${repodir}/centos/6.3/nailgun/x86_64
cp -r /tmp/cdrom/Packages ${repodir}/centos/6.3/nailgun/x86_64
# Copying centos .ISO to the nailgun directory
cp /tmp/cdrom/netinstall/*.iso ${repodir}/nailgun
cp -r /tmp/cdrom/iso ${repodir}
# Copying eggs/gems to the nailgun directory
cp -r /tmp/cdrom/eggs ${repodir}/nailgun
cp -r /tmp/cdrom/gems ${repodir}/nailgun
cp -r /tmp/cdrom/eggs ${repodir}
cp -r /tmp/cdrom/gems ${repodir}
# Copying rabbitmq plugins
cp -r /tmp/rabbitmq-plugins ${repodir}
# Copying bootstrap image
mkdir -p ${repodir}/bootstrap
cp -r /tmp/cdrom/bootstrap/initramfs.img ${repodir}/bootstrap
cp -r /tmp/cdrom/bootstrap/linux ${repodir}/bootstrap
mkdir -p /root/.ssh
chmod 700 /root/.ssh
cp /tmp/cdrom/bootstrap/bootstrap.rsa /root/.ssh
# Copying puppet manifests
cp -r /tmp/cdrom/puppet/* /etc/puppet/modules/
# Prepare local repository specification
rm /etc/yum.repos.d/CentOS*.repo
cat > /etc/yum.repos.d/nailgun.repo << EOF
[nailgun]
name=Nailgun Local Repo
baseurl=file:/var/www/nailgun/centos/6.3/nailgun/x86_64
gpgcheck=0
EOF
# Disable GSSAPI in ssh server config
sed -i -e "/^\s*GSSAPICleanupCredentials yes/d" -e "/^\s*GSSAPIAuthentication yes/d" /etc/ssh/sshd_config
# Copying bootstrap_admin_node.sh , chmod it and adding to the rc.local to run it once
cp /tmp/cdrom/bootstrap_admin_node.sh /tmp
chmod 0777 /tmp/bootstrap_admin_node.sh
echo "/tmp/bootstrap_admin_node.sh" >> /etc/rc.local
#echo "/tmp/bootstrap_admin_node.sh" >> /etc/rc.local
# Unmounting cd to succesfull eject
umount -f /dev/cdrom

View File

@@ -35,7 +35,7 @@ $(addprefix $(ISOROOT)/isolinux/,$(ISOLINUX_FILES)):
$(ISOROOT)/isolinux/isolinux.cfg: iso/isolinux/isolinux.cfg ; $(ACTION.COPY)
$(ISOROOT)/netinstall/$(NETINSTALL_ISO): $(CENTOS_ISO_DIR)/$(NETINSTALL_ISO)
$(ISOROOT)/iso/$(NETINSTALL_ISO): $(CENTOS_ISO_DIR)/$(NETINSTALL_ISO)
@mkdir -p $(@D)
cp $(CENTOS_ISO_DIR)/$(@F) $(@D)
@@ -52,21 +52,17 @@ $(addprefix $(ISOROOT)/EFI/BOOT/,$(EFI_FILES)):
@mkdir -p $(@D)
cp $(CENTOS_REPO_DIR)EFI/BOOT/$(@F) $(@D)
$(addprefix $(ISOROOT)/rabbitmq-plugins/,$(RABBITMQ_PLUGINS)):
$(addprefix $(ISOROOT)/rabbitmq-plugins/v$(RABBITMQ_VERSION)/,$(RABBITMQ_PLUGINS)):
@mkdir -p $(@D)
wget -O $@ $(RABBITMQ_PLUGINS_URL)/$(@F)
$/isoroot-prepare.done:\
$(ISOROOT)/netinstall/$(NETINSTALL_ISO) \
$(ISOROOT)/iso/$(NETINSTALL_ISO) \
$(addprefix $(ISOROOT)/images/,$(IMAGES_FILES)) \
$(addprefix $(ISOROOT)/EFI/BOOT/,$(EFI_FILES)) \
$(addprefix $(ISOROOT)/,$(GPGFILES)) \
$(addprefix $(ISOROOT)/rabbitmq-plugins/,$(RABBITMQ_PLUGINS)) \
$(addprefix $(ISOROOT)/rabbitmq-plugins/v$(RABBITMQ_VERSION)/,$(RABBITMQ_PLUGINS)) \
$(ACTION.TOUCH)
$(addprefix $(ISOROOT)/,$(GPGFILES)):
wget -O $@ $(CENTOS_GPG)/$(@F)
$/isoroot-bootstrap.done: \
$(ISOROOT)/bootstrap/bootstrap.rsa \
$(addprefix $(ISOROOT)/bootstrap/, $(BOOTSTRAP_FILES))
@@ -115,12 +111,9 @@ $/isoroot.done: \
$(ISOROOT)/bootstrap_admin_node.sh \
$/isoroot-eggs.done \
$/isoroot-gems.done \
$(addprefix $(ISOROOT)/sync/,$(call find-files,iso/sync)) \
$(addprefix $(ISOROOT)/puppet/,$(call find-files,puppet))
$(ACTION.TOUCH)
$(ISOROOT)/sync/%: iso/sync/% ; $(ACTION.COPY)
$(ISOROOT)/ks.cfg: iso/ks.cfg ; $(ACTION.COPY)
$(ISOROOT)/bootstrap_admin_node.sh: iso/bootstrap_admin_node.sh ; $(ACTION.COPY)
$(ISOROOT)/.discinfo: iso/.discinfo ; $(ACTION.COPY)

View File

@@ -1 +0,0 @@
*/5 * * * * root flock -w 0 -o /var/lock/chef-solo.lock -c "apt-get update; /usr/bin/chef-solo -l debug -c /opt/nailgun/solo/solo.rb -j /opt/nailgun/solo/solo.json"

View File

@@ -1,22 +0,0 @@
#!/bin/sh -e
nodeip=`/sbin/ifconfig eth0 | perl -wne 's/^\s*inet addr:((\d{1,3}\.){3}\d{1,3}).*$/$1/ && print;'`
cat > /etc/issue <<EOF
Welcome to Nailgun Admin Node (based on Ubuntu 12.04 LTS)
DEFAULT USERNAME: ubuntu
DEFAULT PASSWORD: r00tme
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DO NOT FORGET TO CHANGE DEFAULTS IN ORDER TO PROTECT YOUR SYSTEM
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TO GET ACCESS TO NAILGUN WEBAPPLICATION GO TO http://${nodeip}:8000
EOF
apt-get update
flock -w 0 -o /var/lock/chef-solo.lock -c "/usr/bin/chef-solo -l debug -c /opt/nailgun/solo/solo.rb -j /opt/nailgun/solo/solo.json" || true
exit 0

View File

@@ -1,2 +0,0 @@
:programname, contains, "chef-solo" /var/log/chef/solo.log
:programname, contains, "chef-solo" ~

View File

@@ -4,33 +4,20 @@
import os
import sys
import argparse
import logging
import code
import logging
logging.basicConfig(level="DEBUG")
import web
from sqlalchemy.orm import scoped_session, sessionmaker
from nailgun.settings import settings
here = os.path.abspath(os.path.dirname(__file__))
settings.update({
'STATIC_DIR': os.path.join(here, 'static'),
'TEMPLATE_DIR': os.path.join(here, 'static'),
'LOGFILE': os.path.join(here, 'nailgun.log'),
'DATABASE_ENGINE': 'sqlite:///%s' %
os.path.join(here, 'nailgun.sqlite')})
from nailgun.api.handlers import check_client_content_type
from nailgun.api.models import engine
from nailgun.db import load_db_driver, syncdb
from nailgun.db import syncdb
from nailgun.unit_test import TestRunner
from nailgun.urls import urls
from nailgun.logger import Log
from nailgun.wsgi import app
logging.basicConfig(level="DEBUG")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
@@ -44,12 +31,9 @@ if __name__ == "__main__":
'-p', '--port', dest='port', action='store', type=str,
help='application port', default='8000'
)
runwsgi_parser = subparsers.add_parser(
'runwsgi', help='run WSGI application'
)
runwsgi_parser.add_argument(
'-p', '--port', dest='port', action='store', type=str,
help='application port', default='8000'
run_parser.add_argument(
'-a', '--address', dest='address', action='store', type=str,
help='application address', default='0.0.0.0'
)
test_parser = subparsers.add_parser(
'test', help='run unit tests'
@@ -86,32 +70,14 @@ if __name__ == "__main__":
logging.info("Done")
else:
parser.print_help()
elif params.action in ("run", "runwsgi"):
from nailgun.rpc import threaded
import eventlet
eventlet.monkey_patch()
q = threaded.rpc_queue
rpc_thread = threaded.RPCThread()
if params.action == "run":
sys.argv.insert(1, params.port)
app.run()
else:
logging.info("Running WSGI app...")
server = web.httpserver.WSGIServer(
("0.0.0.0", int(params.port)),
app.wsgifunc(Log)
)
try:
rpc_thread.start()
server.start()
except KeyboardInterrupt:
logging.info("Stopping RPC thread...")
rpc_thread.running = False
logging.info("Stopping WSGI app...")
server.stop()
logging.info("Done")
elif params.action in ("run",):
from nailgun.wsgi import appstart
settings.update({
'LISTEN_PORT': int(params.port),
'LISTEN_ADDRESS': params.address})
appstart()
elif params.action == "shell":
from nailgun.api.models import engine
orm = scoped_session(sessionmaker(bind=engine))
code.interact(local={'orm': orm})
orm.commit()

View File

@@ -10,26 +10,11 @@ class NailgunSettings:
self.logger = logging.getLogger(__name__)
settings_files = []
try:
self.logger.debug("Looking for settings.yaml package config "
self.logger.debug("Looking for settings.yaml package config "
"using old style __file__")
project_path = os.path.dirname(__file__)
project_settings_file = os.path.join(project_path, 'settings.yaml')
except:
self.logger.error("Error while reading old style settings.yaml "
"package config")
else:
settings_files.append(project_settings_file)
try:
self.logger.debug("Looking for settings.yaml package config "
"using setuptools")
local_settings_file = resource_filename(__name__, 'settings.yaml')
except:
self.logger.error("Error while finding old style settings.yaml "
"package config")
else:
settings_files.append(local_settings_file)
project_path = os.path.dirname(__file__)
project_settings_file = os.path.join(project_path, 'settings.yaml')
settings_files.append(project_settings_file)
settings_files.append('/etc/nailgun/settings.yaml')
self.config = {}
@@ -40,7 +25,7 @@ class NailgunSettings:
with open(sf, 'r') as f:
self.config.update(yaml.load(f.read()))
except Exception as e:
self.logger.error("Error while reading config file %s: %s" %
self.logger.debug("Error while reading config file %s: %s" %
(sf, str(e)))
def update(self, dct):
@@ -51,3 +36,13 @@ class NailgunSettings:
settings = NailgunSettings()
if int(settings.DEVELOPMENT):
here = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
settings.update({
'STATIC_DIR': os.path.join(here, 'static'),
'TEMPLATE_DIR': os.path.join(here, 'static'),
'LOGFILE': os.path.join(here, 'nailgun.log'),
'DATABASE_ENGINE': 'sqlite:///%s' %
os.path.join(here, 'nailgun.sqlite')})

View File

@@ -1,3 +1,6 @@
LISTEN_ADDRESS: "0.0.0.0"
LISTEN_PORT: "8000"
DEVELOPMENT: "1"
DATABASE_ENGINE: "sqlite:////var/tmp/nailgun.sqlite"
STATIC_DIR: "/var/tmp/nailgun_static"
TEMPLATE_DIR: "/var/tmp/nailgun_static"

View File

@@ -9,11 +9,39 @@ sys.path.insert(0, curdir)
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
from nailgun.settings import settings
from nailgun.api.handlers import check_client_content_type
from nailgun.db import load_db_driver
from nailgun.urls import urls
from nailgun.logger import Log
app = web.application(urls, locals())
app.add_processor(load_db_driver)
app.add_processor(check_client_content_type)
def appstart():
from nailgun.rpc import threaded
import eventlet
eventlet.monkey_patch()
q = threaded.rpc_queue
rpc_thread = threaded.RPCThread()
server = web.httpserver.WSGIServer(
(settings.LISTEN_ADDRESS, int(settings.LISTEN_PORT)),
app.wsgifunc(Log)
)
try:
rpc_thread.start()
server.start()
except KeyboardInterrupt:
logging.info("Stopping RPC thread...")
rpc_thread.running = False
logging.info("Stopping WSGI app...")
server.stop()
logging.info("Done")
application = app.wsgifunc()

View File

@@ -10,21 +10,23 @@ from setuptools import find_packages
# README = open(os.path.join(here, 'README.txt')).read()
requires = [
'SQLAlchemy==0.7.9',
'web.py==0.37',
'uWSGI==1.3',
'greenlet==0.4.0',
'eventlet==0.9.17',
'kombu==2.4.7',
'netaddr==0.7.10',
'simplejson==2.6.2',
'amqplib==1.0.2',
'anyjson==0.3.1',
'argparse==1.2.1',
'Paste==1.7.5.1',
'eventlet==0.9.17',
'greenlet==0.4.0',
'kombu==2.1.8',
'nose==1.1.2',
'nose2==0.4.1',
'netaddr==0.7.10',
'pycrypto==2.6',
'PyYAML==3.10',
'SQLAlchemy==0.7.8',
'simplejson==2.6.2',
'web.py==0.37',
'wsgilog==0.3',
'wsgiref==0.1.2',
'argparse==1.2.1',
'nose==1.2.1',
'nose2==0.4.1',
# 'cobbler',
]
@@ -68,6 +70,7 @@ if __name__ == "__main__":
entry_points={
'console_scripts': [
'nailgun_syncdb = nailgun.db:syncdb',
'nailgund = nailgun.wsgi:appstart',
],
},
data_files=recursive_data_files([('usr/share/nailgun', 'static')])

View File

@@ -0,0 +1,101 @@
node default {
Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
$centos_repos =
[
{
"name" => "Nailgun",
"url" => "http://${ipaddress}/centos/6.3/x86_64"
},
]
$centos_iso = "file:///var/www/nailgun/iso/CentOS-6.3-x86_64-netinstall-EFI.iso"
$cobbler_user = "cobbler"
$cobbler_password = "cobbler"
$mco_pskey = "un0aez2ei9eiGaequaey4loocohjuch4Ievu3shaeweeg5Uthi"
$mco_stompuser = "mcollective"
$mso_stomppassword = "AeN5mi5thahz2Aiveexo"
$pip_repo = "/var/www/nailgun/eggs"
$gem_repo = "/var/www/nailgun/gems"
class { "cobbler::server":
server => $ipaddress,
domain_name => $domain,
name_server => $ipaddress,
next_server => $ipaddress,
dhcp_start_address => ipcalc_network_nth_address($ipaddress, $netmask, "first"),
dhcp_end_address => ipcalc_network_nth_address($ipaddress, $netmask, "last"),
dhcp_netmask => $netmask,
dhcp_gateway => $ipaddress,
dhcp_interface => 'eth0',
cobbler_user => $cobbler_user,
cobbler_password => $cobbler_password,
pxetimeout => '0'
} ->
class { "cobbler::distro::centos63-x86_64":
http_iso => $centos_iso,
ks_url => "cobbler",
} ->
class { "cobbler::profile::centos63-x86_64":
ks_repo => $centos_repos,
}
class { "mcollective::rabbitmq":
stompuser => "mcollective",
stomppassword => "AeN5mi5thahz2Aiveexo",
rabbitmq_plugins_repo => "file:///var/www/rabbitmq-plugins",
}
class { "mcollective::client":
pskey => $mco_pskey,
stompuser => $mco_stompuser,
stomppassword => $mco_stomppassword,
stomphost => $ipaddress,
stompport => "61613"
}
class { "puppetmaster" :
puppet_master_hostname => "${hostname}.${domain}"
}
class { "nailgun":
package => "Nailgun",
version => "0.1.0",
nailgun_group => "nailgun",
nailgun_user => "nailgun",
venv => "/opt/nailgun",
pip_index => "--no-index",
pip_find_links => "-f file://${pip_repo}",
gem_repo => $gem_repo,
databasefile => "/var/tmp/nailgun.sqlite",
staticdir => "/opt/nailgun/usr/share/nailgun/static",
templatedir => "/opt/nailgun/usr/share/nailgun/static",
logfile => "/var/tmp/nailgun.log",
cobbler_url => "http://localhost/cobbler_api",
cobbler_user => $cobbler_user,
cobbler_password => $cobbler_password,
mco_pskey => $mco_pskey,
mco_stompuser => $mco_stompuser,
mco_stomppassword => $mco_stomppassword,
naily_user => "naily",
naily_password => "Pheilohv6iso",
puppet_master_host => "${hostname}.${domain}"
}
}

View File

@@ -0,0 +1,111 @@
node default {
Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
# $centos_repos =
# [
# {
# "name" => "Puppet",
# "url" => "http://yum.puppetlabs.com/el/6/products/x86_64"
# },
# {
# "name" => "Stanford",
# "url" => "http://mirror.stanford.edu/yum/pub/centos/6.3/os/x86_64"
# },
# ]
$centos_iso = "file:///var/www/nailgun/iso/CentOS-6.3-x86_64-minimal.iso"
$cobbler_user = "cobbler"
$cobbler_password = "cobbler"
$mco_pskey = "un0aez2ei9eiGaequaey4loocohjuch4Ievu3shaeweeg5Uthi"
$mco_stompuser = "mcollective"
$mso_stomppassword = "AeN5mi5thahz2Aiveexo"
$pip_repo = "/root/eggs"
$gem_repo = "/root/gems"
$nailgun_package = "Nailgun"
$nailgun_version = "0.1.0"
$nailgun_group = "nailgun"
$nailgun_user = "nailgun"
class { "cobbler::server":
server => $ipaddress,
domain_name => $domain,
name_server => $ipaddress,
next_server => $ipaddress,
dhcp_start_address => ipcalc_network_nth_address($ipaddress, $netmask, "first"),
dhcp_end_address => ipcalc_network_nth_address($ipaddress, $netmask, "last"),
dhcp_netmask => $netmask,
dhcp_gateway => $ipaddress,
dhcp_interface => 'eth0',
cobbler_user => $cobbler_user,
cobbler_password => $cobbler_password,
pxetimeout => '0'
} ->
class { "cobbler::distro::centos63-x86_64":
http_iso => $centos_iso,
ks_url => "cobbler",
} ->
class { "cobbler::profile::centos63-x86_64":
ks_repo => $centos_repos,
}
class { "mcollective::rabbitmq":
stompuser => "mcollective",
stomppassword => "AeN5mi5thahz2Aiveexo",
}
class { "mcollective::client":
pskey => $mco_pskey,
stompuser => $mco_stompuser,
stomppassword => $mco_stomppassword,
stomphost => $ipaddress,
stompport => "61613"
}
class { "puppetmaster" :
puppet_master_hostname => "${hostname}.${domain}"
}
class { "nailgun":
package => $nailgun_package,
version => $nailgun_version,
nailgun_group => $nailgun_group,
nailgun_user => $nailgun_user,
venv => "/opt/nailgun",
# pip_index => "--no-index",
pip_find_links => "-f file://${pip_repo}",
gem_repo => $gem_repo,
databasefile => "/var/tmp/nailgun.sqlite",
staticdir => "/opt/nailgun/usr/share/nailgun/static",
templatedir => "/opt/nailgun/usr/share/nailgun/static",
logfile => "/var/tmp/nailgun.log",
cobbler_url => "http://localhost/cobbler_api",
cobbler_user => $cobbler_user,
cobbler_password => $cobbler_password,
mco_pskey => $mco_pskey,
mco_stompuser => $mco_stompuser,
mco_stomppassword => $mco_stomppassword,
naily_user => "naily",
naily_password => "Pheilohv6iso",
puppet_master_host => "${hostname}.${domain}"
}
}

View File

@@ -0,0 +1,22 @@
module Puppet::Parser::Functions
newfunction(:ipcalc_network_by_address_netmask, :type => :rvalue, :doc => <<-EOS
Returns network address by host ip address and netmask.
EOS
) do |arguments|
require 'ipaddr'
if (arguments.size != 2) then
raise(Puppet::ParseError, "ipcalc_network_by_address_netmask(): Wrong number of arguments "+
"given #{arguments.size} for 2")
end
begin
ip = IPAddr.new("#{arguments[0]}/#{arguments[1]}")
rescue ArgumentError
raise(Puppet::ParseError, "ipcalc_network_nth_address(): bad arguments #{arguments[0]} #{arguments[1]}")
end
return ip.to_s
end
end

View File

@@ -0,0 +1,28 @@
module Puppet::Parser::Functions
newfunction(:ipcalc_network_nth_address, :type => :rvalue, :doc => <<-EOS
Returns N-th address of network.
EOS
) do |arguments|
require 'ipaddr'
if (arguments.size != 3) then
raise(Puppet::ParseError, "ipcalc_network_nth_address(): Wrong number of arguments "+
"given #{arguments.size} for 3")
end
begin
ip = IPAddr.new("#{arguments[0]}/#{arguments[1]}")
rescue ArgumentError
raise(Puppet::ParseError, "ipcalc_network_nth_address(): bad arguments #{arguments[0]} #{arguments[1]} #{arguments[2]}")
end
if arguments[2] =~ /^last$/
return ip.to_range.to_a[-2].to_s
elsif arguments[2] =~ /^first$/
return ip.to_range.to_a[1].to_s
else
return ip.to_range.to_a[arguments[2]].to_s
end
end
end

View File

@@ -0,0 +1,136 @@
class nailgun(
$package,
$version,
$nailgun_group = "nailgun",
$nailgun_user = "nailgun",
$venv = "/opt/nailgun",
$pip_index = "",
$pip_find_links = "",
$gem_repo = "/var/www/gems",
$databasefile = "/var/tmp/nailgun.sqlite",
$staticdir = "/opt/nailgun/usr/share/nailgun/static",
$templatedir = "/opt/nailgun/usr/share/nailgun/static",
$logfile = "/var/log/nailgun/nailgun.log",
$rundir = "/var/run/nailgun",
$cobbler_url = "http://localhost/cobbler_api",
$cobbler_user = "cobbler",
$cobbler_password = "cobbler",
$mco_pskey = "123456",
$mco_stompuser = "mcollective",
$mco_stomppassword = "mcollective",
$naily_user = "naily",
$naily_password = "naily",
$puppet_master_host = "${hostname}.${domain}",
) {
$logparentdir = inline_template("<%= logfile.match(%r!(.+)/.+!)[1] %>")
$database_engine = "sqlite:///${databasefile}"
anchor { "nailgun-begin": }
anchor { "nailgun-end": }
Anchor<| title == "nailgun-begin" |> ->
Class["nailgun::packages"] ->
Class["nailgun::iptables"] ->
Class["nailgun::user"] ->
Class["nailgun::venv"] ->
Class["nailgun::nginx"] ->
Class["nailgun::supervisor"] ->
Anchor<| title == "nailgun-end" |>
class { "nailgun::packages": }
class { "nailgun::iptables": }
class { "nailgun::user":
nailgun_group => $nailgun_group,
nailgun_user => $nailgun_user,
}
class { "nailgun::venv":
venv => $venv,
venv_opts => "--system-site-packages",
package => $package,
version => $version,
pip_opts => "${pip_index} ${pip_find_links}"
}
class { "nailgun::supervisor":
venv => $venv,
}
class { "nailgun::nginx":
staticdir => $staticdir,
rundir => $rundir,
}
file { $logparentdir:
ensure => directory,
recurse => true,
owner => 'root',
group => 'root',
mode => 0755,
}
file { $rundir:
ensure => directory,
owner => $nailgun_user,
group => $nailgun_group,
mode => 0755,
}
file { "/etc/nailgun":
ensure => directory,
owner => 'root',
group => 'root',
mode => 0755,
}
file { "/etc/nailgun/uwsgi.ini":
content => template("nailgun/uwsgi.ini.erb"),
owner => 'root',
group => 'root',
mode => 0644,
require => File["/etc/nailgun"],
}
file { "/etc/nailgun/settings.yaml":
content => template("nailgun/settings.yaml.erb"),
owner => 'root',
group => 'root',
mode => 0644,
require => File["/etc/nailgun"],
}
exec {"nailgun_syncdb":
command => "${venv}/bin/nailgun_syncdb",
creates => $databasefile,
require => [
File["/etc/nailgun/settings.yaml"],
Class["nailgun::venv"],
]
}
rabbitmq_user { $naily_user:
admin => true,
password => $naily_password,
provider => 'rabbitmqctl',
require => Class['rabbitmq::server'],
}
rabbitmq_user_permissions { "${naily_user}@/":
configure_permission => '.*',
write_permission => '.*',
read_permission => '.*',
provider => 'rabbitmqctl',
require => Class['rabbitmq::server'],
}
}

View File

@@ -0,0 +1,15 @@
class nailgun::iptables {
define access_to_nailgun_port($port, $protocol='tcp') {
$rule = "-p $protocol -m state --state NEW -m $protocol --dport $port -j ACCEPT"
exec { "access_to_cobbler_${protocol}_port: $port":
command => "iptables -t filter -I INPUT 1 $rule; \
/etc/init.d/iptables save",
unless => "iptables -t filter -S INPUT | grep -q \"^-A INPUT $rule\""
}
}
access_to_nailgun_port { "nailgun_web": port => '8000' }
access_to_nailgun_port { "nailgun_repo": port => '8080' }
}

View File

@@ -0,0 +1,31 @@
class nailgun::nginx(
$staticdir,
$rundir,
) {
file { "/etc/nginx/conf.d/nailgun.conf":
content => template("nailgun/nginx_nailgun.conf.erb"),
owner => 'root',
group => 'root',
mode => 0644,
require => Package["nginx"],
notify => Service["nginx"],
}
file { "/etc/nginx/conf.d/repo.conf":
content => template("nailgun/nginx_nailgun_repo.conf.erb"),
owner => 'root',
group => 'root',
mode => 0644,
require => Package["nginx"],
notify => Service["nginx"],
}
# service { "nginx":
# enable => true,
# ensure => "running",
# require => Package["nginx"]
# }
}

View File

@@ -0,0 +1,15 @@
class nailgun::packages {
define nailgun_safe_package(){
if ! defined(Package[$name]){
@package { $name : }
}
}
nailgun_safe_package { "supervisor": }
nailgun_safe_package { "nginx": }
nailgun_safe_package { "python-virtualenv": }
nailgun_safe_package { "python-devel": }
nailgun_safe_package { "gcc": }
nailgun_safe_package { "make": }
}

View File

@@ -0,0 +1,20 @@
class nailgun::supervisor(
$venv,
) {
file { "/etc/supervisord.conf":
content => template("nailgun/supervisord.conf.erb"),
owner => 'root',
group => 'root',
mode => 0644,
require => Package["supervisor"],
notify => Service["supervisord"],
}
service { "supervisord":
ensure => "running",
enable => true,
require => Package["supervisor"],
}
}

View File

@@ -0,0 +1,22 @@
class nailgun::user(
$nailgun_group = "nailgun",
$nailgun_user = "nailgun",
) {
group { $nailgun_group :
provider => "groupadd",
ensure => "present",
}
user { $nailgun_user :
ensure => "present",
gid => $nailgun_group,
home => "/",
shell => "/bin/false",
require => Group[$nailgun_group],
}
user {"nginx":
groups => [$nailgun_group],
}
}

View File

@@ -0,0 +1,28 @@
class nailgun::venv(
$venv,
$venv_opts = "",
$package,
$version,
$pip_opts = "",
) {
nailgun::venv::venv { $venv:
ensure => "present",
venv => $venv,
opts => $venv_opts,
require => Package["python-virtualenv"],
}
nailgun::venv::pip { "$venv_$package":
package => "$package==$version",
opts => $pip_opts,
venv => $venv,
require => [
Nailgun::Venv::Venv[$venv],
Package["python-devel"],
Package["gcc"],
Package["make"],
]
}
}

View File

@@ -0,0 +1,38 @@
define nailgun::venv::pip(
$package,
$venv,
$opts = "",
$ensure = "present",
$owner = undef,
$group = undef,
) {
$grep_regex = $package ? {
/==/ => "^${package}\$",
default => "^${package}==",
}
Exec {
user => $owner,
group => $group,
cwd => "/tmp",
}
if $ensure == 'present' {
exec { "$venv/bin/pip install $name":
command => "$venv/bin/pip install $opts $package",
unless => "$venv/bin/pip freeze | grep -e $grep_regex"
}
}
elsif $ensure == 'latest' {
exec { "pip install $name":
command => "$venv/bin/pip install $opts -U $package",
}
}
else {
exec { "pip install $name":
command => "$venv/bin/pip uninstall $package",
onlyif => "$venv/bin/pip freeze | grep -e $grep_regex"
}
}
}

View File

@@ -0,0 +1,51 @@
define nailgun::venv::venv(
$venv,
$opts = "",
$owner = undef,
$group = undef,
$ensure = "present",
) {
if $ensure == 'present' {
$root_parent = inline_template("<%= venv.match(%r!(.+)/.+!)[1] %>")
if !defined(File[$root_parent]) {
file { $root_parent:
ensure => directory,
recurse => true
}
}
Exec {
user => $owner,
group => $group,
cwd => "/tmp",
}
exec { "nailgun::venv $root":
command => "virtualenv ${opts} ${venv}",
creates => $venv,
notify => Exec["update distribute and pip in $venv"],
require => [File[$root_parent],
Package["python-virtualenv"]],
}
exec { "update distribute and pip in $venv":
command => "$venv/bin/pip install -U distribute pip",
refreshonly => true,
}
}
elsif $ensure == 'absent' {
file { $venv:
ensure => $ensure,
recurse => true,
purge => true,
force => true,
}
}
}

View File

@@ -0,0 +1,36 @@
upstream nailgun-application {
server 127.0.0.1:8001;
}
server {
listen 8000;
server_name localhost;
access_log on;
error_log /var/log/nginx/error.log debug;
charset utf-8;
client_max_body_size 10M;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location /static {
autoindex on;
alias <%= staticdir %>;
}
location / {
proxy_pass http://nailgun-application;
proxy_read_timeout 15;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

View File

@@ -0,0 +1,21 @@
server {
listen 8080;
server_name localhost;
access_log on;
error_log /var/log/nginx/error.log debug;
charset utf-8;
client_max_body_size 2M;
location / {
autoindex on;
root /var/www/nailgun;
}
location ~ /\.ht {
deny all;
}
}

View File

@@ -0,0 +1,52 @@
LISTEN_ADDRESS: "127.0.0.1"
LISTEN_PORT: "8001"
DEVELOPMENT: "1"
DATABASE_ENGINE: "<%= database_engine %>"
STATIC_DIR: "<%= staticdir %>"
TEMPLATE_DIR: "<%= templatedir %>"
NETWORK_POOLS:
public:
- "240.0.0.0/16"
private10:
- "10.0.0.0/8"
private172:
- "172.16.0.0/12"
private192:
- "192.168.0.0/16"
NET_EXCLUDE:
- "10.20.0.0/24"
VLANS_RANGE_START: "100"
VLANS_RANGE_END: "1000"
RABBITMQ:
fake: "0"
hostname: "127.0.0.1"
port: 5672
userid: "<%= naily_user %>"
password: "<%= naily_password %>"
virtual_host: "/"
LOGFILE: "<%= logfile %>"
PATH_TO_SSH_KEY: = "/root/.ssh/id_rsa"
PATH_TO_BOOTSTRAP_SSH_KEY: "/root/.ssh/bootstrap.rsa"
COBBLER_URL: "<%= cobbler_url %>"
COBBLER_USER: "<%= cobbler_user %>"
COBBLER_PASSWORD: "<%= cobbler_password %>"
COBBLER_PROFILE: "centos-6.3-x86_64"
MCO_PSKEY: "<%= mco_pskey %>"
MCO_STOMPHOST: "localhost"
MCO_STOMPPORT: "61613"
MCO_STOMPUSER: "<%= mco_stompuser %>"
MCO_STOMPPASSWORD: "<%= mco_stomppassword %>"
PUPPET_MASTER_HOST: "<%= puppet_master_host %>"
PUPPET_VERSION: "2.7.19"
DNS_DOMAIN: "<%= domain %>"
DNS_SERVERS: "127.0.0.1"
DNS_SEARCH: "<%= domain %>"

View File

@@ -0,0 +1,40 @@
[supervisord]
http_port=/var/run/supervisor.sock
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=debug
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
childlogdir=/var/log/supervisor
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[program:nailgun]
command=<%= venv %>/bin/nailgund
process_name=%(program_name)s
numprocs=1
numprocs_start=0
autostart=true
autorestart=true
startsecs=1
startretries=3
exitcodes=0,2
stopsignal=INT
stopwaitsecs=60
redirect_stderr=true
stdout_logfile=/var/log/nailgun/app.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stdout_capture_maxbytes=0
stdout_events_enabled=false
stderr_logfile=/var/log/nailgun/err.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
stderr_capture_maxbytes=0
stderr_events_enabled=false
serverurl=AUTO

View File

@@ -0,0 +1,17 @@
[uwsgi]
autoload = true
master = true
no-orphans = true
log-date = true
log-maxsize = 50M
vacuum = true
pidfile = <%= rundir %>/nailgun.pid
max-requests = 5000
socket = <%= rundir %>/nailgun.sock
chmod-socket = 660
workers = 2
module = nailgun.wsgi
uid = <%= nailgun_user %>
gid = <%= nailgun_group %>

View File

@@ -1,12 +1,17 @@
amqplib 1.0.2
anyjson 0.3.1
Paste 1.7.5.1
eventlet 0.9.17
greenlet 0.4.0
kombu 2.1.8
nose 1.1.2
netaddr 0.7.10
pycrypto 2.6
SQLAlchemy 0.7.8
web.py 0.37
wsgilog 0.3
amqplib 1.0.2
anyjson 0.3.1
argparse 1.2.1
Paste 1.7.5.1
eventlet 0.9.17
greenlet 0.4.0
kombu 2.1.8
nose 1.1.2
nose2 0.4.1
netaddr 0.7.10
pycrypto 2.6
PyYAML 3.10
SQLAlchemy 0.7.8
simplejson 2.6.2
web.py 0.37
wsgilog 0.3
wsgiref 0.1.2

View File

@@ -22,3 +22,6 @@ systemu 2.5.2
treetop 1.4.10
uuidtools 2.1.2
yajl-ruby 1.1.0
rails 3.0.10
activerecord 3.0.10
mysql 2.8.1

View File

@@ -2,6 +2,7 @@ autoconf
automake
byacc
cobbler
cobbler-web
cronie
crontabs
curl
@@ -11,29 +12,42 @@ flex
gcc
gcc-c++
make
man
mcollective
mcollective-client
mysql
mysql-devel
mysql-server
nginx
novnc
ntp
numpy
openssh-clients
openssh-server
openstack-dashboard
openstack-glance
openstack-keystone
openstack-nova
openstack-nova-novncproxy
policycoreutils
puppet-2.7.19
python-devel
novnc
python-virtualenv
rabbitmq-server
ruby
ruby-augeas
ruby-devel
rubygems
ruby-mysql
ruby-rdoc
ruby-ri
ruby-shadow
rubygems
scapy
supervisor
syslinux
tcpdump
tftp-server
vim-enhanced
wget
xinetd
yum