Code Monkey home page Code Monkey logo

puppet-pm2's Introduction

puppet-pm2

Puppet Module to deploy a nodejs application using PM2

This is a pretty hacky first version. It relies on puppet module willdurand/nodejs to install nodejs and npm. It would be good to make the create_app a provider called say pm2_app. and use the nodejs::npm provider instead of executing npm install etc.

Minimal Usage:

 class { 'pm2': }

 class { 'pm2::create_app':
   name    => 'my-nodejs-app',
   require => Class['pm2']
 } 

Detailed Usage:

 class { 'pm2':
   npm_repository    => "https://mylocal.repo",
   npm_auth          => 'Ashtyhy=+as',
   npm_always_auth   => true,
   pm2_version       => "latest",
   install_root      => '/opt',
   install_dir       => 'nodejs',
   max_restarts      => 10,
   min_uptime        => 3500,
   deamon_user       => 'nodejs',  
 }

 class { 'pm2::create_app':
   name            => 'my-nodejs-app',
   app             => 'myapp',
   appversion      => 'latest',
   path            => "/opt/nodejs/myapp",
   script          => "lib/app.js",              
   args            => ["arg1","arg2"],
   env             => '{ "env.NODE_ENV" : "test" }',
   install_root    => '/opt',
   install_dir     => 'nodejs',
   max_restarts    => 10,
   min_uptime      => 3500,       
   deamon_user     => 'nodejs',     
   require => Class['pm2']
 } 

App Deployment:

 Instead of deploying the nodejs app at puppet configuration time a bash script is generated by puppet 
 so deployment can be done later via ssh: 
 To do deployment this way run: 
    sudo su - nodejs
    /opt/nodejs/deploy_app.sh myapp 0.0.1-110  serve_app.js '{ "env.NODE_ENV" : "test" }'  "[arg='value']"
 This way a generic nodejs/pm2 server can be build and ssh used to deploy a given app as part of a continuous integration 
 workflow using tools like jenkins or teamcity.

 It is also possible to test that a deployment was successful by running via ssh: 
    sudo -u nodejs /opt/nodejs/deploy_test.sh 

 NOTE: Both the puppet and bash script deployment is done via npm so the application is assumed to be in a public or private 
 repository like sinopia. The other alternative is deploy from a source repository like git. PM2-Deploy supports this form of 
 deployment but currently there is no puppet or bash script to support this but it can be easily done.  
 
 NOTE: To use nar(NPM Archive) as an alternative to npm install 
 To do deployment this way run: 
    sudo su - nodejs
    /opt/nodejs/deploy_app_nar.sh myapp-0.0.1-110.nar  myapp 0.0.1-110  serve_app.js '{ "env.NODE_ENV" : "test" }'  "[arg='value']"
 The nar file will first need to be download from a remote source like AWS S3.  

Nodejs Configuration:

Module "willdurand/nodejs" is called to do the nodejs install. Assuming using puppet 3.x with hiera then nodejs can be configured by setting the parameters in hiera:

 nodejs::version:          'stable'   ('vX.Y.Z', 'latest' or 'stable')
 nodejs::target_dir:       '/usr/local/bin'
 nodejs::with_npm:         true
 nodejs::make_install:     true

Also you need to set the path in Factor before running this as willdurand/nodejs relies on the $::path variable

 set path to '/usr/local/node/node-default/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin'

Working with PM2 - Commands, Debugging etc.

logon to to the daemon user (by default nodejs) and you will be in home directory (/opt/nodejs by default)

To show running apps:

 pm2 list

To restart my-app

In the home directory (/opt/nodejs by default)

pm2 kill
pm2 start "my-app/pm2.json" --name "my-app"

To see the logs

pm2 logs 

Deploying my-app

sudo -u nodejs /opt/nodejs/deploy_app.sh my-app 0.1.182 lib/app.js '{ "env.NODE_ENV" : "dev"}' 

puppet-pm2's People

Contributors

jnpwebdeveloper avatar neillturner avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

puppet-pm2's Issues

What's this exec for?

https://github.com/neillturner/puppet-pm2/blob/master/manifests/init.pp#L73

In PE 3.7/3.8, the exec seems to happen first, which is perplexing enough. Because I'm not sure what the point of it is, I removed it from my fork and it seems to at least get past the error I was getting:

"Error: Failed to apply catalog: Validation of Exec[pm2 init] failed: 'pm2 status' is not qualified and no path was specified. Please qualify the command or specify a path. at /etc/puppetlabs/puppet/environments/sand/modules/pm2/manifests/init.pp:73"

However, if it really is needed, then I'll need to revisit.

How/where is create_symlinks used?

I don't see anything in the wildurand nodejs repo that uses this line:

nodejs::create_symlinks: false

I search for create_symlinks in that repo and nothing is found.

Can you tell me how/where you are using it?

Remove auth info from Detailed Usage example

Some people like myself who are trying to learn puppet & nodejs will likely just copy/paste your examples initially like I did and suddenly they can't install any packages via npm. Might change it to not require auth initially then they can add it later if they like.

class { 'pm2':
npm_repository => "https://registry.npmjs.org",
npm_auth => '',
npm_always_auth => false,
pm2_version => "latest",

$name redefines a built in parameter

The parameter $name redefines a built in parameter in the Host Class Definition

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Resource Statement, Cannot alias File[/opt/nodejs/] to ["/opt/nodejs"] at /etc/puppetlabs/code/environments/production/modules/pm2/manifests/create_app.pp:21; resource ["File", "/opt/nodejs"] already declared at /etc/puppetlabs/code/environments/production/modules/pm2/manifests/init.pp:40 at /etc/puppetlabs/code/environments/production/modules/pm2/manifests/create_app.pp:21:3 on node node1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.