Inventory::Server

Inventory is an HTTP and SMTP Server that process and index facts produced by facter.
Installation, the Docker way
$ git clone https://github.com/Filirom1/inventory.git
$ cd inventory
$ docker-compose up -d
Installation, the hard way
Install ElasticSearch, Kibana, ruby >=1.9 and bundler manually
$ git clone https://github.com/Filirom1/inventory.git
$ cd inventory
$ bundle install
$ bundle exec rackup # to start the HTTP Server
$ bundle exec bin/inventory-smtpd # to start the SMTP Server
Usage
Send facts by HTTP:
$ facter --json | curl -d @- localhost:9292/api/v1/facts/`hostname`
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | facts_parser.rb:20 | Facts parser
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | json_schema_valid...:14 | JSON Schema Validator
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | json_schema_valid...:24 | No JSON Schema found at /etc/inventory/json_schema/facts/1-0-0.json, skip validation
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | index.rb:23 | Index
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | index.rb:38 | {"_index":"inventory_facts","_type":"1-0-0","_id":"dahu","_version":2,"created":false}
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | http_server.rb:16 | 127.0.0.1 - - [01/Mar/2015 19:03:39] "POST /api/v1/facts/dahu HTTP/1.1" 200 36 0.0383
127.0.0.1 - - [01/Mar/2015 19:03:39] "POST /api/v1/facts/dahu HTTP/1.1" 200 36 0.0390
{"id":"dahu","ok":true,"status":200}
Or send facts by Email:
facter --json | mail -s `hostname` inventory@localdomain
2015-03-01 19:43:35 +0100 t-70045727140840 [ ] INFO | email_parser.rb:9 | Email parser
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | facts_parser.rb:20 | Facts parser
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | json_schema_valid...:14 | JSON Schema Validator
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | json_schema_valid...:24 | No JSON Schema found at /etc/inventory/json_schema/facts/1-0-0.json, skip validation
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | index.rb:23 | Index
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | index.rb:38 | {"_index":"inventory_facts","_type":"1-0-0","_id":"dahu","_version":6,"created":false}
Plugins
Inventory is built with plugins in mind. The default plugins could be found in the plugins dir. The default execution order is this one: log_failures_on_disk,facts_parser,json_schema_validator,index
To add/remove plugins or change the order, you have to change 2 configurations options (see configurations options below)
plugins_pathplugins
You could create your own plugin, copy the example plugins/sample.rb to start.
log_failures_on_disk
If an error is raised during the processing, the received facts will be stored in the file failed_facts_dir/$ID and the error message, stacktrace and context will be written to failed_facts_dir/$ID.log
facts_parser
Transform JSON, YAML, XML and XML with __base64__ into a ruby hash
json_schema_validator
Check if the received facts are compliant with the JSON Schema in json_schema_dir/$TYPE/$VERSION.json
index
Index the received facts in ElasticSearch
Configuration
Configuration options could be set via environment variables. Each option should be prefixed with INVENTORY_. For exemple: export INVENTORY_LOG_LEVEL=ERROR
Configurations could also be defined in a YAML file: /etc/inventory/inventory.yml
The following options are configurable:
host(default: '127.0.0.1'): SMTP host to bind onsmtp_port(default: 2525): SMTP portmax_connections(default: 4): SMTP maximum number of simultaneus allowed connexionses_host(default: 'http//localhost9200'): ElasticSearch URLes_index_prefix(default: 'inventory_'): ElasticSearch index prefixfailed_facts_dir(default: '/var/log/inventory/failures'): Dir where failed facts will be written tologger(default: 'stdout'): stout/stderr or file for log destinationlog_level(default: 'INFO'): DEBUG/INFO/WARN/ERRORdebug(default: false): Show more details, need log_level on DEBUGtype_key(default: 'type'): Facts key that will be used as a typetype_default(default: 'facts'): Default type iftype_keynot found in factsversion_key(default: 'version'): Facts key that wll be used as a versionversion_default(default: '1-0-0'): Default version if notversion_keyfoundjson_schema_dir(default: '/etc/inventory/json_schema'): directory containing JSON Schemaplugins_path(default: ''): a directory containing middlewares.plugins(default:log_failures_on_disk,facts_parser,json_schema_validator,index): a comma separated list of plugins that will be executed in order.
Contributing
- Fork it ( https://github.com/Filirom1/inventory-server/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request