Project

General

Profile

Support #691

Updated by Daniel Curtis over 8 years ago

{{>toc}} 

 This is a simple guide to setup a Puppet Master server along with Puppet Dashboard and Icinga2 with PostgreSQL as the database backend on FreeBSD 9.2. 

 This will set up 2 web applications that can be viewed in any modern web browser at: 
 * *Default blank landing page* - http://puppet.example.com 
 * *Puppet Dashboard* - http://puppet.example.com:3000 
 * *Icinga* - http://icinga.example.com:8000  
 * *Puppet Master* - https://puppet.example.com:8140 

 h1. Prepare the Server 

 * Once the server baseline has been installed and root access has been obtained make sure the server is up to date: 
 <pre> 
 pkg update && upgrade 
 portsnap fetch extract 
 </pre> 

 * Portmaster will be useful for upgrading packages: 
 <pre> 
 pkg install portmaster 
 pkg2ng 
 </pre> 

 --- 

 h1. Install PostgreSQL 9.4 

 * Install PostgreSQL: 
 <pre> 
 pkg install postgresql94-{server,client} 
 </pre> 

 * Enable PostgreSQL at boot: 
 <pre> 
 echo 'postgresql_enable="YES"' >> /etc/rc.conf 
 </pre> 

 * Initialize the database: 
 <pre> 
 service postgresql initdb 
 </pre> 

 * Start PostgreSQL: 
 <pre> 
 service postgresql start 
 </pre> 

 * Edit the postgres config file: 
 <pre> 
 vi /usr/local/pgsql/data/postgresql.conf 
 </pre> 
 #* And modify the following: 
 <pre> 
 listen_addresses = '*' 
 </pre> 

 * Edit the pg_hba config file: 
 <pre> 
 vi /usr/local/etc/pgsql/data/pg_hba.conf 
 </pre> 
 #* And modify the following: 
 <pre> 
 # TYPE    DATABASE      USER          CIDR-ADDRESS            METHOD only 

 # Local connections 
 local     all           all                                 trust 

 # IPv4 local connections: 
 host      all           all           127.0.0.1/32            trust 

 # IPv6 local connections: 
 host      all           all           ::1/128                 trust 

 # IPv4 connections: 
 host      all           all           192.168.10.0/24         md5 

 # IPv6 local connections: 
 host      all           all           1234::abcd/64           md5 
 </pre> 

 * Restart postgresql: 
 <pre> 
 service postgresql restart 
 </pre> 

 h2. Create a new user and database 

 * Switch to the pgsql user and enter into the psql prompt: 
 <pre> 
 su pgsql 
 psql -d template1 
 </pre> 
 #* Create the *puppetmaster* user and database: 
 <pre> 
 CREATE USER puppetmasteruser WITH PASSWORD 'SuperSecretPuppetmasterPassword'; 

 CREATE DATABASE puppetmasterdb OWNER puppetmasteruser; 

 GRANT ALL PRIVILEGES ON DATABASE "puppetmasterdb" to puppetmasteruser; 
 </pre> 
 #* Create the *dashboard* user and database: 
 <pre> 
 CREATE USER dashboarduser WITH PASSWORD 'SuperSecretDashboardPassword'; 

 CREATE DATABASE dashboarddb OWNER dashboarduser; 

 GRANT ALL PRIVILEGES ON DATABASE "dashboarddb" to dashboarduser; 
 </pre> 
 #* Create the *icinga* user and database: 
 <pre> 
 CREATE USER icingauser WITH PASSWORD 'SuperSecretIcingaPassword'; 

 CREATE DATABASE icingadb OWNER icingauser; 

 GRANT ALL PRIVILEGES ON DATABASE "icingadb" to icingauser; 
 </pre> 

 * Exit from the postgres user 
 <pre> 
 \q 
 exit 
 </pre> 

 * Test the connection on a remote host: 
 <pre> 
 psql -h pg.example.com -U puppetmasteruser -W puppetmasterdb 
 </pre> 

 --- 

 h1. Install Puppet Master 

 * Install the puppet package 
 <pre> 
 pkg install puppet rubygem-rake rubygem-bundler rubygem-activerecord rubygem-sqlite3 rubygem-pg libxslt git node portupgrade 
 </pre> 

 * Create a puppet config from the package sample: 
 <pre> 
 cp /usr/local/etc/puppet/puppet.conf-dist /usr/local/etc/puppet/puppet.conf 
 </pre> 

 * Configure your @[puppetmasterd]@ section to reflect these settings: 
 <pre> 
 vi /usr/local/etc/puppet/puppet.conf 
 </pre> 
 #* And add the following to the bottom of the file: 
 <pre> 
 [main] 
   logdir=/var/log/puppet 
   vardir=/var/puppet 
   ssldir=/var/puppet/ssl 
   rundir=/var/run/puppet 
   factpath=$vardir/lib/facter 
   server=puppetmaster.example.com 
   report=true 
   pluginsync=true 
   environment = production 
   confdir = /usr/local/etc/puppet 

 [agent] 
   report = true 
   show_diff = true 
   environment = production 

 [master] 
   storeconfigs = true 
   dbadapter = postgresql 
   dbuser = puppetmasteruser 
   dbpassword = SuperSecretPuppetmasterPassword 
   dbserver = localhost 
   dbname = puppetmasterdb 
 </pre> 

 * Create folders for node and class definition files: 
 <pre> 
 mkdir /usr/local/etc/puppet/manifests/nodes 
 mkdir /usr/local/etc/puppet/manifests/classes 
 </pre> 

 * Then create a default site.pp file: 
 <pre> 
 import "nodes/*.pp" 
 vi /usr/local/etc/puppet/manifests/site.pp 
 </pre> 
 #* And add the following: 
 <pre> 
 node default { 
   notify { "Hey ! It works !": } 
 } 

 # The filebucket option allows for file backups to the server 
 filebucket { main: server => 'puppetmaster.altservice.com', path=> false, } 

 # Set global defaults - including backing up all files to the main filebucket and adds a global path 
 File { backup => main } 
 Exec { path => "/usr/bin:/usr/sbin/:/bin:/sbin" } 
 </pre> 

 * Create a puppet node config for *puppetmaster.example.com*: 
 <pre> 
 vi /usr/local/etc/puppet/manifests/nodes/puppetmaster.example.com.pp 
 </pre> 
 #* And Add the following: 
 <pre> 
 node 'puppetmaster.example.com' { 
   notify { "Hey ! It works !": } 
 } 
 </pre> 

 * Create a puppet node config for *client.example.com*: 
 <pre> 
 vi /usr/local/etc/puppet/manifests/nodes/client.example.com.pp 
 </pre> 
 #* And Add the following: 
 <pre> 
 node 'client.example.com' { 
   notify { "Hey ! It works !": } 
 } 
 </pre> 

 * Enable puppet in @/etc/rc.conf@: 
 <pre> 
 echo 'puppet_enable="YES"' >> /etc/rc.conf 
 </pre> 

 * At this point, Puppet needs to be started so that all its SSL keys can be generated. This gives the chance to test that Puppet does work before anything else gets stacked on as well as ensures the SSL keys referenced by Nginx's config file are generated and in place before that step. 
 <pre> 
 echo 'puppetmaster_enable="YES"' >> /etc/rc.conf 
 service puppetmaster start 
 </pre> 

 * On *puppetmaster.example.com* - start Puppet on the client system 
 <pre> 
 puppet agent -vt 
 </pre> 

 h3. Add Pkgng Module 

 * Install the pkgng module to add the pkgng package provider: 
 <pre> 
 puppet module install zleslie-pkgng 
 </pre> 
 #* Now packages can be installed using pkgng as the package manager: 
 <pre> 
 package { 'puppet': 
   ensure => installed, 
   provider => pkgng, 
 } 
 </pre> 

 h3. Enable Puppet File Server 

 * Make the path for the puppet files to be served from: 
 <pre> 
 mkdir /usr/local/etc/puppet/files 
 </pre> 

 * Create the puppet fileserver configuration: 
 <pre> 
 vi /usr/local/etc/puppet/fileserver.conf 
 </pre> 
 #* And put the name of your mount point, the path, and an allow * directive.: 
 <pre> 
 [files] 
   path /usr/local/etc/puppet/files 
   allow * 
 </pre> 


 Next, edit the puppet authorization configuration: 
 <pre> 
 vi /usr/local/etc/puppet/auth.conf 
 </pre> 
 #* Use a regular expression path to match both the file_metadata and file_content endpoints followed by the name of your custom mount point. Then, use any combination of allow and allow_ip directives to control access. Add the following before the @path /@ statement: 
 <pre> 
 path ~ ^/file_(metadata|content)/files/ 
 auth yes 
 allow /^(.+\.)?example.com$/ 
 allow_ip 192.168.100.0/24 
 </pre> 

 h2. Install Puppet on Remote Node 

 * Install puppet: 
 <pre> 
 pkg install puppet portupgrade 
 </pre> 

 * Create a basic puppet config: 
 <pre> 
 vi /usr/local/etc/puppet/puppet.conf 
 </pre> 
 #* And add the following: 
 <pre> 
 [main] 
   logdir=/var/log/puppet 
   vardir=/var/puppet 
   ssldir=/var/puppet/ssl 
   rundir=/var/run/puppet 
   factpath=$vardir/lib/facter 
   configtimeout=600 
   runinterval=28800 
   report=true 
   pluginsync=true 
   server=puppetmaster.example.com 
 </pre> 

 * Generate a puppet private key and send the CSR to the puppetmaster node for signing: 
 <pre> 
 puppet agent -vt --waitforcert 30 
 </pre> 

 h3. Sign the Puppet CSR 

 * On the *puppetmaster.example.com* node run the following to sign the certi 
 <pre> 
 puppet cert sign client.example.com 
 </pre> 

 --- 

 h1. Install Puppet Dashboard 

 Now its time to install Puppet Dashboard, a web frontend to display puppet reports. 

 * Install puppet-dashboard from git 
 <pre> 
 cd /usr/local/www 
 git clone git://github.com/sodabrew/puppet-dashboard.git 
 </pre> 

 * Manually create the 'puppet-dashboard' user and group: 
 <pre> 
 pw groupadd -n puppet-dashboard -g 800 
 pw useradd -n puppet-dashboard -c "Puppet Dashboard,,," -u 800 -g puppet-dashboard -s /usr/sbin/nologin 
 </pre> 

 * Then provide the required permissions to @/usr/local/www/puppet-dashboard@ 
 <pre> 
 chown -R puppet-dashboard:puppet-dashboard /usr/local/www/puppet-dashboard 
 </pre> 

 h2. Configure Puppet Dashboard 

 * Copy the example database YAML file and update with database information: 
 <pre> 
 cd /usr/local/www/puppet-dashboard/config 
 cp database.yml.example database.yml 
 </pre> 

 * Then edit the database.yml with the corrected information; make sure to replace the +password+ and +host+: 
 <pre> 
 vi database.yml  
 </pre> 
 #* and modify the following parameter accordingly: 
 <pre> 
 production: 
   database: dashboarddb 
   username: dashboarduser 
   password: SuperSecretDashboardPassword 
   encoding: utf8 
   adapter: postgresql 
   host: localhost 
 </pre> 

 * Change the ownership and harden the permissions: 
 <pre> 
 chown puppet-dashboard:puppet-dashboard database.yml 
 chmod 660 database.yml 
 </pre> 

 * Copy the example settings YAML file, no changes needed: 
 <pre> 
 cd /usr/local/www/puppet-dashboard/config 
 cp settings.yml.example settings.yml 
 chown puppet-dashboard:puppet-dashboard settings.yml 
 chmod 660 settings.yml 
 </pre> 

 * Fix shebang line in External Node Classifier Script. 
 <pre> 
 sed -i '' -e 's/#! \/usr\/bin\/ruby/#!\/usr\/local\/bin\/ruby/' /usr/local/www/puppet-dashboard/bin/external_node 
 </pre> 

 * Install gems required via bundler: 
 <pre> 
 cd /usr/local/www/puppet-dashboard 
 bundle install --without mysql --path vendor/bundle 
 </pre> 

 * Generate secret_token. Cleanup any errors and the default token after generating the new one. 
 <pre> 
 echo "secret_token: `bundle exec rake secret`" >> config/settings.yml 
 vi config/settings.yml 
 </pre> 

 * At this point the database was already installed with some blank tables. We need to run rake to finish the process with the database structure needed: 
 <pre> 
 cd /usr/local/www/puppet-dashboard 
 env RAILS_ENV=production bundle exec rake db:setup 
 </pre> 

 * Before going into a production environment, Dashboard 2.0 must precompile assets for production: 
 <pre> 
 env RAILS_ENV=production bundle exec rake assets:precompile 
 </pre> 

 * Chown any files created up until now to the right owner: 
 <pre> 
 chown -R puppet-dashboard:puppet-dashboard /usr/local/www/puppet-dashboard 
 </pre> 

 * Run Dashboard using Ruby's built-in WEBrick server to validate functionality. It will be available at http://puppet.example.com:3000 
 <pre> 
 cd /usr/local/www/puppet-dashboard 
 su -m puppet-dashboard -c 'env RAILS_ENV=production bundle exec rails server' 
 </pre> 

 All agent nodes have to be configured to submit reports to the master. The master has to be configured to send reports to Dashboard. If you already have a working Puppet installation you can configure it to distribute the updated puppet.conf to your hosts. 

 * Edit the *@puppet.conf@* on the Puppetmaster node: 
 <pre> 
 vi /usr/local/etc/puppet/puppet.conf 
 </pre> 
 #* And add the following to the [master] section: 
 <pre> 
 [master] 
   storeconfigs = true 
   dbadapter = postgresql 
   dbuser = puppetmasteruser 
   dbpassword = SuperSecretPuppetmasterPassword 
   dbserver = localhost 
   dbname = puppetmasterdb 
   reports = store, http 
   reporturl = http://puppet.example.com:3000/reports/upload 
   node_terminus = exec 
   external_nodes = /usr/bin/env PUPPET_DASHBOARD_URL=http://puppet.example.com:3000 /usr/local/www/puppet-dashboard/bin/external_node 
 </pre> 

 * Testing Puppet's Connection to Dashboard. A new background task should show in the Dashboard UI at http://puppet.example.com:3000 
 <pre> 
 puppet agent --test 
 </pre> 

 * Dashboard ships a worker process manager under script/delayed_job. It can manually start delayed jobs via the following command: 
 <pre> 
 su -m puppet-dashboard -c 'env RAILS_ENV=production bundle exec script/delayed_job -p dashboard -n 2 -m start' 
 </pre> 

 h2. Delayed Job Worker Init Script 

 However, rather than manually triggering background workers, this rc script will accomplish the same thing and ensure the background jobs get started on the next reboot. 

 * Create puppet dashboard FreeBSD init script: 
 <pre> 
 vi /usr/local/etc/rc.d/dashboard_workers 
 </pre> 
 #* and add the following 
 <pre> 
 #!/bin/sh 

 # PROVIDE: dashboard_workers 
 # REQUIRE: LOGIN 
 # KEYWORD: shutdown 

 # By default dashboard_workers uses flags '-n 1' for 1 worker.    This should be 
 # adjusted to the number of CPU cores. 
 dashboard_workers_enable=${dashboard_workers_enable:-"NO"} 
 dashboard_workers_flags=${dashboard_workers_flags:-"-n 1"} 
 # The default rails environment is set to production 
 dashboard_workers_env=${dashboard_workers_env:-"/usr/bin/env PATH=${PATH}:/usr/local/bin RAILS_ENV=production"} 
 # The default user is set to puppet-dashboard and install location is set to 
 # /usr/local/share/puppet-dashboard. 
 dashboard_workers_user=${dashboard_workers_user:-"puppet-dashboard"} 
 dashboard_workers_chdir=${dashboard_workers_chdir:-"/usr/local/www/puppet-dashboard"} 

 . /etc/rc.subr 

 name="dashboard_workers" 
 rcvar="dashboard_workers_enable" 
 load_rc_config $name 
 extra_commands="reload run zap status" 

 # All commands call the same function and strip the fast|one|quiet prefix 
 # to deliver to the bundler. 
 reload_cmd="f_dashboard_workers reload" 
 restart_cmd="f_dashboard_workers restart" 
 run_cmd="f_dashboard_workers run" 
 start_cmd="f_dashboard_workers start" 
 status_cmd="f_dashboard_workers status" 
 stop_cmd="f_dashboard_workers stop" 
 zap_cmd="f_dashboard_workers zap" 

 # Use the function's ARVG $1 as the bundler program's '-m' flag 
 f_dashboard_workers() { 
     cd $dashboard_workers_chdir && \ 
     su -m "$dashboard_workers_user" \ 
         -c "${dashboard_workers_env} bundle exec script/delayed_job ${rc_flags} -p dashboard -m $1" || \ 
     echo "Failed to $1 dashboard_workers" 
 } 

 run_rc_command "$1" 
 </pre> 
 #* And make it executable: 
 <pre> 
 chmod +x /usr/local/etc/rc.d/dashboard_workers 
 </pre> 

 * With that in place, we need to override the defaults and enable the script along with setting '-n 4' workers to match the number of processor cores and ensure it's ready for a production workload. 
 <pre> 
 echo 'dashboard_workers_enable="YES"' >> /etc/rc.conf 
 echo 'dashboard_workers_flags="-n 4"' >> /etc/rc.conf 
 service dashboard_workers start 
 </pre> 

 --- 

 h1. Puppet Dashboard with Nginx and Passenger 

 * Install the Passenger gem: 
 <pre> 
 portmaster www/rubygem-passenger 
 </pre> 
 *NOTE*: Make sure to enable +(*)NGINX and [X]SYMLINK+ when running @make config@ 

 * Install Nginx with Passenger 
 <pre> 
 portmaster www/nginx 
 </pre> 
 *NOTE*: Make sure to enable +[X]PASSENGER+ during the nginx configuration. 

 * Create a configuration directory to make managing individual server blocks easier 
 <pre> 
 mkdir /usr/local/etc/nginx/conf.d 
 </pre> 

 * Configuring Nginx with Passenger, edit the *main nginx configuration file*: 
 <pre> 
 vi /usr/local/etc/nginx/nginx.conf 
 </pre> 
 #* And add/modify the following 
 <pre> 
 user    www www; 
 worker_processes    4; 
 error_log    /var/log/nginx_error.log notice; 
 pid          /var/run/nginx.pid; 

 events { 
   worker_connections    1024; 
 } 

 http { 
     passenger_root /usr/local/lib/ruby/gems/2.1/gems/passenger; 
     passenger_ruby /usr/local/bin/ruby; 
     passenger_max_pool_size 15; 
     passenger_pool_idle_time 300; 

     include         mime.types; 
     default_type    application/octet-stream; 
     sendfile        on; 
     tcp_nopush      on; 
     keepalive_timeout    65; 
     tcp_nodelay          on; 

     # Load config files from the /etc/nginx/conf.d directory 
     include /usr/local/etc/nginx/conf.d/*.conf; 
 } 
 </pre> 

 * And create a *puppet dashboard server block*: 
 <pre> 
 vi /usr/local/etc/nginx/conf.d/puppet-dashboard.conf 
 </pre> 
 #* And add the following: 
 <pre> 
 server { 
   listen         3000; 
   server_name    puppet.example.com; 

   passenger_enabled on; 
   passenger_user      puppet-dashboard; 
   passenger_group     puppet-dashboard; 

   access_log          /var/log/nginx_dashboard_access.log; 

   root                /usr/local/www/puppet-dashboard/public; 
 } 
 </pre> 

 * Enable a daily log file rotation via @newsyslog.conf@: 
 <pre> 
 printf "/var/log/nginx/*.log\t\t\t644 7\t * @T00 JG /var/run/nginx.pid 30\n" >> /etc/newsyslog.conf 
 </pre> 

 * Enable nginx service and start it. At this point basic functionality is online: 
 <pre> 
 echo 'nginx_enable="YES"' >> /etc/rc.conf 
 service nginx start 
 </pre> 

 * Edit the *@auth.conf@* file on the puppetmaster 
 <pre> 
 vi /usr/local/etc/puppet/auth.conf 
 </pre> 
 #* Add the following: 
 <pre> 
 path /facts 
 auth yes 
 method find, search 
 allow dashboard 
 </pre> 

 * Edit the *@site.pp@* on the Puppet master: 
 <pre> 
 vi /usr/local/etc/puppet/manifests/site.pp 
 </pre> 
 #* Add the following: 
 <pre> 
 filebucket { server => "{ main: server => 'puppetmaster.example.com', path=> false, }", 
   path => false, 
 } 
 </pre> 
 #* In either site.pp, in an individual init.pp, or in a specific manifest. 
 <pre> 
 File { backup => "main" } 
 </pre> 

 * Go back and add the line for Inventory Support 
 <pre> 
 vi /usr/local/www/puppet-dashboard/config/settings.yml 
 </pre> 
 #* And change the following parameters: 
 <pre> 
 enable_inventory_service: true 
 use_file_bucket_diffs: true 
 </pre> 

 * With all the updates made, restart so that it takes effect: 
 <pre> 
 service nginx restart 
 </pre> 

 * For future maintenance, periodic jobs to prune old reports and run DB optimization. 
 <pre> 
 mkdir -p /usr/local/etc/periodic/monthly 
 vi /usr/local/etc/periodic/monthly/clean_dashboard_database.sh 
 </pre> 
 #* And add the following: 
 <pre> 
 #!/bin/sh 
 cd /usr/local/share/puppet-dashboard && \ 
     echo "Pruning Old Reports from Puppet Dashboard Database" && \ 
     /usr/bin/su -m puppet-dashboard -c '/usr/local/bin/bundle exec rake RAILS_ENV=production reports:prune upto=3 unit=mon'    && \ 
     echo "Optimizing Database" && \ 
     /usr/bin/su -m puppet-dashboard -c '/usr/local/bin/bundle exec rake RAILS_ENV=production db:raw:optimize' 
 </pre> 
 #* And make it executable: 
 <pre> 
 chmod 755 /usr/local/etc/periodic/monthly/clean_dashboard_database.sh 
 </pre> 

 * And create a weekly script: 
 <pre> 
 mkdir -p /usr/local/etc/periodic/weekly 
 vi /usr/local/etc/periodic/weekly/clean_puppet_reports.sh 
 </pre> 
 </pre> 
 #* And add the following: 
 <pre> 
 #!/bin/sh 
 echo "Pruning Puppetmaster Reports greater than 7 days old" 
 echo -n "    Reports Removed:" 
 find /var/puppet/reports -mtime 7 | xargs rm -v | wc -l 
 </pre> 
 #* And make it executable: 
 <pre> 
 chmod 755 /usr/local/etc/periodic/weekly/clean_puppet_reports.sh 
 </pre> 

 --- 

 h1. Install Icinga2 

 * Start by installing icinga2: icinga2 and fcgiwrap: 
 <pre> 
 pkg install icinga2 
 </pre> 
 *NOTE*: Make sure to uncheck *[ ]MYSQL* during the icinga2 package configuration.  

 * Start and enable the service to start at boot: 
 <pre> 
 echo 'icinga2_enable="YES"' >> /etc/rc.conf 
 service icinga2 start 
 </pre> 

 * Enable the icinga2 ido-pgsql feature: 
 <pre> 
 ln -s /usr/local/etc/icinga2/features-available/ido-pgsql.conf /usr/local/etc/icinga2/features-enabled/ /usr/local/etc/icinga2/features-enabled/ido-pgsql.conf 
 </pre> 

 * Edit the icinga2 ido-pgsql config: 
 <pre> 
 vi /usr/local/etc/icinga2/features-enabled/ido-pgsql.conf 
 </pre> 
 #* And modify the following: 
 <pre> 
 object IdoPgsqlConnection "ido-pgsql" { 
   user = "icingauser" 
   password = "SuperSecretIcingaPassword" 
   host = "localhost" 
   database = "icingadb" 
 } 
 </pre> 

 * Load the icinga2 ido-pgsql schema 
 <pre> 
 psql -h localhost -U icingauser -W -d icingadb < /usr/local/share/icinga2-ido-pgsql/schema/pgsql.sql 
 </pre> 

 * Start and enable the service to start at boot: Restart icinga2: 
 <pre> 
 echo 'icinga2_enable="YES"' >> /etc/rc.conf 
 service icinga2 start restart 
 </pre> 

 h2. Install Icingaweb2 

 * Install icingaweb2: 
 <pre> 
 pkg install icingaweb2 php56-pgsql pecl-imagick 
 </pre> 

 * Configure the default PHP settings 
 <pre> 
 cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini 
 </pre> 

 * Set the local timezone in the php config: timezone: 
 <pre> 
 sed -i '' -e 's/;date.timezone\ =/date.timezone\ =\ America\/Los_Angeles/' /usr/local/etc/php.ini 
 </pre> 

 * Edit /usr/local/etc/php-fpm.conf: 
 <pre> 
 vi /usr/local/etc/php-fpm.conf 
 </pre> 
 #* Make the following changes: 
 <pre> 
 listen = /var/run/php-fpm.sock 
 listen.owner = www 
 listen.group = www 
 listen.mode = 0660 
 </pre> 

 * Start and enable PHP-FPM at boot: 
 <pre> 
 echo 'php_fpm_enable="YES"' >> /etc/rc.conf 
 service php-fpm start 
 </pre> 

 * Next, create the *nagios server block*: 
 <pre> 
 vi /usr/local/etc/nginx/conf.d/icinga.conf 
 </pre> 
 #* And add the following 
 <pre> 
 server { 
   listen 8000 default; 
   server_name server icinga.example.com; 

   index index.html index.php; 
   root /usr/local/www/icingaweb2/public; /usr/local/www; 

   # IP and IP ranges which should get access 
   allow 10.0.0.0/24; 
   allow 10.1.0.1; 
   # all else will be denied 
   deny all; 

   location ~ \.php$ ^/icingaweb2/index\.php(.*)$ { 
     root /usr/local/www/icingaweb2/public 
     fastcgi_pass unix:/var/run/php-fpm.sock; 
     fastcgi_index index.php; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; /usr/local/www/icingaweb2/public/index.php; 
     fastcgi_param ICINGAWEB_CONFIGDIR /usr/local/etc/icingaweb2; 
     fastcgi_param REMOTE_USER $remote_user; 
   } 

   location / ~ ^/icingaweb2(.+)? { 
     root alias /usr/local/www/icingaweb2/public; 
     autoindex on; 
     index index.php; 
     try_files $1 $uri $uri/ /icingaweb2/index.php$is_args$args; 
   } 
 } 
 </pre> 

 * Restart nginx: 
 <pre> 
 service nginx restart 
 </pre> 

 * Now create a configuration token: 
 <pre> 
 cd /usr/local/www/icingaweb2 && ./bin/icingacli setup token create --config=/usr/local/etc/icingaweb2 
 </pre> 

 * Enter the this token created earlier on Icinga Web 2's setup interface at http://icinga.example.com:8000/setup then complete the setup process. http://localhost:8000/icingaweb2/setup 

 --- 

 h1. Resources 

 * http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#configuring-dashboard 
 * http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#installing-puppet-dashboard 
 * http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#creating-and-configuring-a-mysql-database 
 * http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#testing-that-dashboard-is-working 
 http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#configuring-puppet 
 * http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#starting-and-managing-delayed-job-workers 
 * http://docs.puppetlabs.com/dashboard/manual/1.2/bootstrapping.html#running-dashboard-in-a-production-quality-server 
 * http://docs.puppetlabs.com/puppet/latest/reference/config_important_settings.html 
 * http://z0mbix.github.io/blog/2012/03/01/use-nginx-and-passenger-to-power-your-puppet-master/ 
 * http://www.watters.ws/mediawiki/index.php/Configure_puppet_master_using_nginx_and_mod_passenger 
 * http://docs.puppetlabs.com/dashboard/manual/1.2/configuring.html 
 * https://forums.freebsd.org/viewtopic.php?&t=42071 
 * http://projects.puppetlabs.com/issues/16686 
 * http://rlaskey.org/words/897/nagios-nginx-freebsd/ 
 * http://www.unixmen.com/it-appears-as-though-you-do-not-have-permission-to-view-information-for-any-of-the-hosts-you-requested/

Back