├── .gitignore ├── .rspec ├── .rubocop.yml ├── .travis.yml ├── Gemfile ├── Guardfile ├── README.md ├── Rakefile ├── examples ├── example.json ├── example.yaml └── sample-inventory.json ├── lib ├── puppet │ ├── application │ │ └── inventory.rb │ └── face │ │ └── inventory.rb └── puppet_x │ └── puppetlabs │ ├── facts_inventory.rb │ └── inventory.rb ├── metadata.json └── spec ├── acceptance ├── inventory_spec.rb └── nodesets │ ├── centos-7.yml │ ├── default.yml │ ├── ubuntu-14.04.yml │ └── ubuntu-16.04.yml ├── spec_helper.rb ├── spec_helper_acceptance.rb └── unit ├── facts_inventory_spec.rb ├── inventory_face_spec.rb └── inventory_spec.rb /.gitignore: -------------------------------------------------------------------------------- 1 | .*.sw? 2 | /pkg 3 | /spec/fixtures/manifests 4 | /spec/fixtures/modules 5 | /.rspec_system 6 | /.vagrant 7 | /.bundle 8 | /vendor 9 | /Gemfile.lock 10 | /junit 11 | /log 12 | .yardoc 13 | coverage 14 | doc 15 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | #require: rubocop-rspec 2 | AllCops: 3 | #TargetRubyVersion: 1.9 4 | Include: 5 | - ./**/*.rb 6 | Exclude: 7 | - vendor/**/* 8 | - .vendor/**/* 9 | - pkg/**/* 10 | - spec/fixtures/**/* 11 | Lint/ConditionPosition: 12 | Enabled: True 13 | 14 | Lint/ElseLayout: 15 | Enabled: True 16 | 17 | Lint/UnreachableCode: 18 | Enabled: True 19 | 20 | Lint/UselessComparison: 21 | Enabled: True 22 | 23 | Lint/EnsureReturn: 24 | Enabled: True 25 | 26 | Lint/HandleExceptions: 27 | Enabled: True 28 | 29 | Lint/LiteralInCondition: 30 | Enabled: True 31 | 32 | Lint/ShadowingOuterLocalVariable: 33 | Enabled: True 34 | 35 | Lint/LiteralInInterpolation: 36 | Enabled: True 37 | 38 | Style/HashSyntax: 39 | Enabled: True 40 | 41 | Style/RedundantReturn: 42 | Enabled: True 43 | 44 | Lint/AmbiguousOperator: 45 | Enabled: True 46 | 47 | Lint/AssignmentInCondition: 48 | Enabled: True 49 | 50 | Layout/SpaceBeforeComment: 51 | Enabled: True 52 | 53 | Style/AndOr: 54 | Enabled: True 55 | 56 | Style/RedundantSelf: 57 | Enabled: True 58 | 59 | # Method length is not necessarily an indicator of code quality 60 | Metrics/MethodLength: 61 | Enabled: False 62 | 63 | # Module length is not necessarily an indicator of code quality 64 | Metrics/ModuleLength: 65 | Enabled: False 66 | 67 | Style/WhileUntilModifier: 68 | Enabled: True 69 | 70 | Lint/AmbiguousRegexpLiteral: 71 | Enabled: True 72 | 73 | Security/Eval: 74 | Enabled: True 75 | 76 | Lint/BlockAlignment: 77 | Enabled: True 78 | 79 | Lint/DefEndAlignment: 80 | Enabled: True 81 | 82 | Lint/EndAlignment: 83 | Enabled: True 84 | 85 | Lint/DeprecatedClassMethods: 86 | Enabled: True 87 | 88 | Lint/Loop: 89 | Enabled: True 90 | 91 | Lint/ParenthesesAsGroupedExpression: 92 | Enabled: True 93 | 94 | Lint/RescueException: 95 | Enabled: True 96 | 97 | Lint/StringConversionInInterpolation: 98 | Enabled: True 99 | 100 | Lint/UnusedBlockArgument: 101 | Enabled: True 102 | 103 | Lint/UnusedMethodArgument: 104 | Enabled: True 105 | 106 | Lint/UselessAccessModifier: 107 | Enabled: True 108 | 109 | Lint/UselessAssignment: 110 | Enabled: True 111 | 112 | Lint/Void: 113 | Enabled: True 114 | 115 | Layout/AccessModifierIndentation: 116 | Enabled: True 117 | 118 | Style/AccessorMethodName: 119 | Enabled: True 120 | 121 | Style/Alias: 122 | Enabled: True 123 | 124 | Layout/AlignArray: 125 | Enabled: True 126 | 127 | Layout/AlignHash: 128 | Enabled: True 129 | 130 | Layout/AlignParameters: 131 | Enabled: True 132 | 133 | Metrics/BlockNesting: 134 | Enabled: True 135 | 136 | Style/AsciiComments: 137 | Enabled: True 138 | 139 | Style/Attr: 140 | Enabled: True 141 | 142 | Style/BracesAroundHashParameters: 143 | Enabled: True 144 | 145 | Style/CaseEquality: 146 | Enabled: True 147 | 148 | Layout/CaseIndentation: 149 | Enabled: True 150 | 151 | Style/CharacterLiteral: 152 | Enabled: True 153 | 154 | Style/ClassAndModuleCamelCase: 155 | Enabled: True 156 | 157 | Style/ClassAndModuleChildren: 158 | Enabled: False 159 | 160 | Style/ClassCheck: 161 | Enabled: True 162 | 163 | # Class length is not necessarily an indicator of code quality 164 | Metrics/ClassLength: 165 | Enabled: False 166 | 167 | Style/ClassMethods: 168 | Enabled: True 169 | 170 | Style/ClassVars: 171 | Enabled: True 172 | 173 | Style/WhenThen: 174 | Enabled: True 175 | 176 | Style/WordArray: 177 | Enabled: True 178 | 179 | Style/UnneededPercentQ: 180 | Enabled: True 181 | 182 | Layout/Tab: 183 | Enabled: True 184 | 185 | Layout/SpaceBeforeSemicolon: 186 | Enabled: True 187 | 188 | Layout/TrailingBlankLines: 189 | Enabled: True 190 | 191 | Layout/SpaceInsideBlockBraces: 192 | Enabled: True 193 | 194 | Layout/SpaceInsideBrackets: 195 | Enabled: True 196 | 197 | Layout/SpaceInsideHashLiteralBraces: 198 | Enabled: True 199 | 200 | Layout/SpaceInsideParens: 201 | Enabled: True 202 | 203 | Layout/LeadingCommentSpace: 204 | Enabled: True 205 | 206 | Layout/SpaceBeforeFirstArg: 207 | Enabled: True 208 | 209 | Layout/SpaceAfterColon: 210 | Enabled: True 211 | 212 | Layout/SpaceAfterComma: 213 | Enabled: True 214 | 215 | Layout/SpaceAfterMethodName: 216 | Enabled: True 217 | 218 | Layout/SpaceAfterNot: 219 | Enabled: True 220 | 221 | Layout/SpaceAfterSemicolon: 222 | Enabled: True 223 | 224 | Layout/SpaceAroundEqualsInParameterDefault: 225 | Enabled: True 226 | 227 | Layout/SpaceAroundOperators: 228 | Enabled: True 229 | 230 | Layout/SpaceBeforeBlockBraces: 231 | Enabled: True 232 | 233 | Layout/SpaceBeforeComma: 234 | Enabled: True 235 | 236 | Style/CollectionMethods: 237 | Enabled: True 238 | 239 | Layout/CommentIndentation: 240 | Enabled: True 241 | 242 | Style/ColonMethodCall: 243 | Enabled: True 244 | 245 | Style/CommentAnnotation: 246 | Enabled: True 247 | 248 | # 'Complexity' is very relative 249 | Metrics/CyclomaticComplexity: 250 | Enabled: False 251 | 252 | Style/ConstantName: 253 | Enabled: True 254 | 255 | Style/Documentation: 256 | Enabled: False 257 | 258 | Style/DefWithParentheses: 259 | Enabled: True 260 | 261 | Style/PreferredHashMethods: 262 | Enabled: True 263 | 264 | Layout/DotPosition: 265 | EnforcedStyle: trailing 266 | 267 | Style/DoubleNegation: 268 | Enabled: True 269 | 270 | Style/EachWithObject: 271 | Enabled: True 272 | 273 | Layout/EmptyLineBetweenDefs: 274 | Enabled: True 275 | 276 | Layout/IndentArray: 277 | Enabled: True 278 | 279 | Layout/IndentHash: 280 | Enabled: True 281 | 282 | Layout/IndentationConsistency: 283 | Enabled: True 284 | 285 | Layout/IndentationWidth: 286 | Enabled: True 287 | 288 | Layout/EmptyLines: 289 | Enabled: True 290 | 291 | Layout/EmptyLinesAroundAccessModifier: 292 | Enabled: True 293 | 294 | Style/EmptyLiteral: 295 | Enabled: True 296 | 297 | # Configuration parameters: AllowURI, URISchemes. 298 | Metrics/LineLength: 299 | Enabled: False 300 | 301 | Style/MethodCallWithoutArgsParentheses: 302 | Enabled: True 303 | 304 | Style/MethodDefParentheses: 305 | Enabled: True 306 | 307 | Style/LineEndConcatenation: 308 | Enabled: True 309 | 310 | Layout/TrailingWhitespace: 311 | Enabled: True 312 | 313 | Style/StringLiterals: 314 | Enabled: True 315 | 316 | Style/TrailingCommaInArguments: 317 | Enabled: True 318 | 319 | Style/TrailingCommaInLiteral: 320 | Enabled: True 321 | 322 | Style/GlobalVars: 323 | Enabled: True 324 | 325 | Style/GuardClause: 326 | Enabled: True 327 | 328 | Style/IfUnlessModifier: 329 | Enabled: True 330 | 331 | Style/MultilineIfThen: 332 | Enabled: True 333 | 334 | Style/NegatedIf: 335 | Enabled: True 336 | 337 | Style/NegatedWhile: 338 | Enabled: True 339 | 340 | Style/Next: 341 | Enabled: True 342 | 343 | Style/SingleLineBlockParams: 344 | Enabled: True 345 | 346 | Style/SingleLineMethods: 347 | Enabled: True 348 | 349 | Style/SpecialGlobalVars: 350 | Enabled: True 351 | 352 | Style/TrivialAccessors: 353 | Enabled: True 354 | 355 | Style/UnlessElse: 356 | Enabled: True 357 | 358 | Style/VariableInterpolation: 359 | Enabled: True 360 | 361 | Style/VariableName: 362 | Enabled: True 363 | 364 | Style/WhileUntilDo: 365 | Enabled: True 366 | 367 | Style/EvenOdd: 368 | Enabled: True 369 | 370 | Style/FileName: 371 | Enabled: False 372 | 373 | Style/For: 374 | Enabled: True 375 | 376 | Style/Lambda: 377 | Enabled: True 378 | 379 | Style/MethodName: 380 | Enabled: True 381 | 382 | Style/MultilineTernaryOperator: 383 | Enabled: True 384 | 385 | Style/NestedTernaryOperator: 386 | Enabled: True 387 | 388 | Style/NilComparison: 389 | Enabled: True 390 | 391 | Style/FormatString: 392 | Enabled: True 393 | 394 | Style/MultilineBlockChain: 395 | Enabled: True 396 | 397 | Style/Semicolon: 398 | Enabled: True 399 | 400 | Style/SignalException: 401 | Enabled: True 402 | 403 | Style/NonNilCheck: 404 | Enabled: True 405 | 406 | Style/Not: 407 | Enabled: True 408 | 409 | Style/NumericLiterals: 410 | Enabled: True 411 | 412 | Style/OneLineConditional: 413 | Enabled: True 414 | 415 | Style/OpMethod: 416 | Enabled: True 417 | 418 | Style/ParenthesesAroundCondition: 419 | Enabled: True 420 | 421 | Style/PercentLiteralDelimiters: 422 | Enabled: True 423 | 424 | Style/PerlBackrefs: 425 | Enabled: True 426 | 427 | Style/PredicateName: 428 | Enabled: True 429 | 430 | Style/RedundantException: 431 | Enabled: True 432 | 433 | Style/SelfAssignment: 434 | Enabled: True 435 | 436 | Style/Proc: 437 | Enabled: True 438 | 439 | Style/RaiseArgs: 440 | Enabled: True 441 | 442 | Style/RedundantBegin: 443 | Enabled: True 444 | 445 | Style/RescueModifier: 446 | Enabled: True 447 | 448 | # based on https://github.com/voxpupuli/modulesync_config/issues/168 449 | Style/RegexpLiteral: 450 | EnforcedStyle: percent_r 451 | Enabled: True 452 | 453 | Lint/UnderscorePrefixedVariableName: 454 | Enabled: True 455 | 456 | Metrics/ParameterLists: 457 | Enabled: False 458 | 459 | Lint/RequireParentheses: 460 | Enabled: True 461 | 462 | Layout/SpaceBeforeFirstArg: 463 | Enabled: True 464 | 465 | Style/ModuleFunction: 466 | Enabled: True 467 | 468 | Lint/Debugger: 469 | Enabled: True 470 | 471 | Style/IfWithSemicolon: 472 | Enabled: True 473 | 474 | Style/Encoding: 475 | Enabled: True 476 | 477 | Style/BlockDelimiters: 478 | Enabled: True 479 | 480 | Layout/MultilineBlockLayout: 481 | Enabled: True 482 | 483 | # 'Complexity' is very relative 484 | Metrics/AbcSize: 485 | Enabled: False 486 | 487 | # 'Complexity' is very relative 488 | Metrics/PerceivedComplexity: 489 | Enabled: False 490 | 491 | Lint/UselessAssignment: 492 | Enabled: True 493 | 494 | Layout/ClosingParenthesisIndentation: 495 | Enabled: False 496 | 497 | # RSpec 498 | 499 | # We don't use rspec in this way 500 | #RSpec/DescribeClass: 501 | # Enabled: False 502 | 503 | # Example length is not necessarily an indicator of code quality 504 | #RSpec/ExampleLength: 505 | # Enabled: False 506 | 507 | #RSpec/NamedSubject: 508 | # Enabled: False 509 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: ruby 3 | cache: bundler 4 | script: bundle exec rake test 5 | dist: trusty 6 | matrix: 7 | fast_finish: true 8 | include: 9 | - rvm: 2.3.1 10 | sudo: required 11 | bundler_args: --without system_tests 12 | env: PUPPET_GEM_VERSION="~>4.0" 13 | - rvm: 2.1.7 14 | sudo: required 15 | bundler_args: --without system_tests 16 | env: PUPPET_GEM_VERSION="~>4.0" 17 | - rvm: 2.3.1 18 | sudo: required 19 | dist: trusty 20 | services: docker 21 | env: PUPPET_INSTALL_TYPE=agent BEAKER_set="centos-7" 22 | script: bundle exec rake beaker 23 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Find a location or specific version for a gem. place_or_version can be a 4 | # version, which is most often used. It can also be git, which is specified as 5 | # `git://somewhere.git#branch`. You can also use a file source location, which 6 | # is specified as `file://some/location/on/disk`. 7 | def location_for(place_or_version, fake_version = nil) 8 | if place_or_version =~ %r{^(git[:@][^#]*)#(.*)} 9 | [fake_version, { git: Regexp.last_match(1), branch: Regexp.last_match(2), require: false }].compact 10 | elsif place_or_version =~ %r{^file:\/\/(.*)} 11 | ['>= 0', { path: File.expand_path(Regexp.last_match(1)), require: false }] 12 | else 13 | [place_or_version, { require: false }] 14 | end 15 | end 16 | 17 | # Used for gem conditionals 18 | ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments 19 | minor_version = "#{ruby_version_segments[0]}.#{ruby_version_segments[1]}" 20 | 21 | group :development do 22 | gem "puppet-module-posix-default-r#{minor_version}", require: false, platforms: 'ruby' 23 | gem "puppet-module-posix-dev-r#{minor_version}", require: false, platforms: 'ruby' 24 | gem "puppet-module-win-default-r#{minor_version}", require: false, platforms: %w[mswin mingw x64_mingw] 25 | gem "puppet-module-win-dev-r#{minor_version}", require: false, platforms: %w[mswin mingw x64_mingw] 26 | gem 'fast_gettext', '1.1.0', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0') 27 | gem 'fast_gettext', require: false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0') # rubocop:disable Bundler/DuplicatedGem 28 | gem 'guard-rake' 29 | gem 'json_pure', '<= 2.0.1', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0') 30 | gem 'simplecov-console' 31 | gem 'travis' 32 | gem 'travis-lint' 33 | end 34 | 35 | group :system_tests do 36 | gem "puppet-module-posix-system-r#{minor_version}", require: false, platforms: 'ruby' 37 | gem "puppet-module-win-system-r#{minor_version}", require: false, platforms: %w[mswin mingw x64_mingw] 38 | gem 'beaker', *location_for(ENV['BEAKER_VERSION'] || '>= 3') 39 | gem 'beaker-abs', *location_for(ENV['BEAKER_ABS_VERSION'] || '~> 0.1') 40 | gem 'beaker-hostgenerator', *location_for(ENV['BEAKER_HOSTGENERATOR_VERSION']) 41 | gem 'beaker-pe', require: false 42 | gem 'beaker-rspec', *location_for(ENV['BEAKER_RSPEC_VERSION']) 43 | gem 'beaker_spec_helper' 44 | end 45 | 46 | gem 'puppet', *location_for(ENV['PUPPET_GEM_VERSION']) 47 | -------------------------------------------------------------------------------- /Guardfile: -------------------------------------------------------------------------------- 1 | notification :off 2 | 3 | guard 'rake', task: 'test' do 4 | watch(%r{^manifests\/(.+)\.pp$}) 5 | watch(%r{^spec\/(.+)\.rb$}) 6 | watch(%r{^lib\/(.+)\.rb$}) 7 | end 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | `inventory` provides a new Puppet command which outputs a data structure 2 | describing properties of the system on which it's run. 3 | 4 | [![Puppet Forge](http://img.shields.io/puppetforge/v/puppetlabs/inventory.svg)](https://forge.puppetlabs.com/puppetlabs/inventory) [![Build Status](https://secure.travis-ci.org/puppetlabs/puppetlabs-inventory.png)](http://travis-ci.org/puppetlabs/puppetlabs-inventory) 5 | 6 | Here's a quick example: 7 | 8 | ``` 9 | $ puppet inventory | head -n 20 10 | { 11 | "schema_version": 1, 12 | "created": "2016-07-14T07:42:01Z", 13 | "resources": [ 14 | { 15 | "title": "root", 16 | "resource": "group", 17 | "gid": 0 18 | }, 19 | { 20 | "title": "bin", 21 | "resource": "group", 22 | "gid": 1 23 | }, 24 | { 25 | "title": "daemon", 26 | "resource": "group", 27 | "gid": 2 28 | }, 29 | { 30 | ``` 31 | 32 | Specifically `inventory` outputs information on: 33 | 34 | * Users 35 | * Groups 36 | * Packages 37 | * Services 38 | * Facts 39 | 40 | If you have the [Lumogon 41 | module](https://forge.puppet.com/puppetlabs/lumogon) installed then it 42 | will also detect information about running Docker containers. 43 | 44 | All of this information is already available via the RAL and `puppet 45 | resource` or via `facter`. `inventory` simply offers a higher-level 46 | interface, a single command that outputs everything in a simplified data 47 | format. 48 | 49 | 50 | ## Installation 51 | 52 | `inventory` is packaged as a Puppet Module, and can be installed from 53 | the Forge like so: 54 | 55 | puppet module install puppetlabs-inventory 56 | 57 | You can also include in your `Puppetfile` if using r10k or 58 | librarian-puppet: 59 | 60 | mod 'puppetlabs/inventory' 61 | 62 | 63 | ## Demonstration 64 | 65 | A simple way of demonstrating the module is to use Docker. Docker is 66 | not required, it just makes for nice single line examples. The following 67 | should be run from a checkout of this repository. 68 | 69 | Output inventory information for the `puppet/puppet-agent-alpine` image 70 | from Hub: 71 | 72 | docker run --rm -it -v $(pwd):/src:ro -e RUBYLIB=/src/lib puppet/puppet-agent-alpine inventory 73 | 74 | Output the same information but instead of formatted JSON render the 75 | output as YAML: 76 | 77 | docker run --rm -it -v $(pwd):/src:ro -e RUBYLIB=/src/lib puppet/puppet-agent-alpine inventory --render-as yaml 78 | 79 | Only generate the resources portion of the output: 80 | 81 | docker run --rm -it -v $(pwd):/src:ro -e RUBYLIB=/src/lib puppet/puppet-agent-alpine inventory resources 82 | 83 | Only generate the facts portion of the output: 84 | 85 | docker run --rm -it -v $(pwd):/src:ro -e RUBYLIB=/src/lib puppet/puppet-agent-alpine inventory facts 86 | 87 | If you're doing something specific to Puppet you can also output the 88 | full Puppet Catalog. This is also an easy way of seeing how Puppet works 89 | under the hood. 90 | 91 | docker run --rm -it -v $(pwd):/src:ro -e RUBYLIB=/src/lib puppet/puppet-agent-alpine inventory catalog 92 | 93 | The above examples all use images which already have Puppet installed on 94 | them. This example runs an inventory of the vanilla `centos` image, 95 | which does not have Puppet installed. It does that by mounting Puppet 96 | from another container as described in the [Puppet-in-Docker 97 | examples](https://github.com/puppetlabs/puppet-in-docker-examples/tree/master/puppet-at-runtime): 98 | 99 | docker run --name puppet-agent -v /opt/puppetlabs puppet/puppet-agent-ubuntu --version 100 | docker run --rm -it --volumes-from=puppet-agent -v $(pwd):/src:ro -e RUBYLIB=/src/lib centos /opt/puppetlabs/bin/puppet inventory all 101 | 102 | Puppet inventory is also available as a [Docker Image from 103 | Hub](https://hub.docker.com/r/puppet/puppet-inventory/). So the 104 | following is a clearer way of doing the above 105 | 106 | docker run --name puppet-inventory puppet/puppet-inventory 107 | docker run --rm -it --volumes-from=puppet-inventory centos /opt/puppetlabs/bin/puppet inventory 108 | 109 | 110 | ## Status and Schema Version 111 | 112 | This is an early prototype at the moment and based on experience with 113 | writing clients for the generated format the structure of the data 114 | produced may change a lot between now and a 1.0 release of the module. I 115 | will increment the `schema_version` key in the output if/when I make 116 | changes but until the module hits a 1.0 release don't expect any 117 | backwards compatibility guarantees. 118 | 119 | 120 | ## Maintainers 121 | 122 | This repository is maintained by: Gareth Rushgrove . 123 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'bundler/setup' 3 | 4 | require 'rubocop/rake_task' 5 | require 'puppetlabs_spec_helper/rake_tasks' 6 | require 'puppet-lint/tasks/puppet-lint' 7 | require 'puppet-syntax/tasks/puppet-syntax' 8 | 9 | # These gems aren't always present, for instance 10 | # on Travis with --without development 11 | 12 | begin 13 | require 'puppet_blacksmith/rake_tasks' 14 | rescue LoadError # rubocop:disable Lint/HandleExceptions 15 | end 16 | 17 | RuboCop::RakeTask.new 18 | 19 | task test: %i[ 20 | rubocop 21 | metadata_lint 22 | spec 23 | ] 24 | -------------------------------------------------------------------------------- /examples/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "resources": [ 3 | { 4 | "title": "root", 5 | "resource": "group", 6 | "gid": 0 7 | }, 8 | { 9 | "title": "bin", 10 | "resource": "group", 11 | "gid": 1 12 | }, 13 | { 14 | "title": "daemon", 15 | "resource": "group", 16 | "gid": 2 17 | }, 18 | { 19 | "title": "sys", 20 | "resource": "group", 21 | "gid": 3 22 | }, 23 | { 24 | "title": "adm", 25 | "resource": "group", 26 | "gid": 4 27 | }, 28 | { 29 | "title": "tty", 30 | "resource": "group", 31 | "gid": 5 32 | }, 33 | { 34 | "title": "disk", 35 | "resource": "group", 36 | "gid": 6 37 | }, 38 | { 39 | "title": "lp", 40 | "resource": "group", 41 | "gid": 7 42 | }, 43 | { 44 | "title": "mem", 45 | "resource": "group", 46 | "gid": 8 47 | }, 48 | { 49 | "title": "kmem", 50 | "resource": "group", 51 | "gid": 9 52 | }, 53 | { 54 | "title": "wheel", 55 | "resource": "group", 56 | "gid": 10 57 | }, 58 | { 59 | "title": "floppy", 60 | "resource": "group", 61 | "gid": 11 62 | }, 63 | { 64 | "title": "mail", 65 | "resource": "group", 66 | "gid": 12 67 | }, 68 | { 69 | "title": "news", 70 | "resource": "group", 71 | "gid": 13 72 | }, 73 | { 74 | "title": "uucp", 75 | "resource": "group", 76 | "gid": 14 77 | }, 78 | { 79 | "title": "man", 80 | "resource": "group", 81 | "gid": 15 82 | }, 83 | { 84 | "title": "cron", 85 | "resource": "group", 86 | "gid": 16 87 | }, 88 | { 89 | "title": "console", 90 | "resource": "group", 91 | "gid": 17 92 | }, 93 | { 94 | "title": "audio", 95 | "resource": "group", 96 | "gid": 18 97 | }, 98 | { 99 | "title": "cdrom", 100 | "resource": "group", 101 | "gid": 19 102 | }, 103 | { 104 | "title": "dialout", 105 | "resource": "group", 106 | "gid": 20 107 | }, 108 | { 109 | "title": "ftp", 110 | "resource": "group", 111 | "gid": 21 112 | }, 113 | { 114 | "title": "sshd", 115 | "resource": "group", 116 | "gid": 22 117 | }, 118 | { 119 | "title": "at", 120 | "resource": "group", 121 | "gid": 25 122 | }, 123 | { 124 | "title": "tape", 125 | "resource": "group", 126 | "gid": 26 127 | }, 128 | { 129 | "title": "video", 130 | "resource": "group", 131 | "gid": 27 132 | }, 133 | { 134 | "title": "netdev", 135 | "resource": "group", 136 | "gid": 28 137 | }, 138 | { 139 | "title": "readproc", 140 | "resource": "group", 141 | "gid": 30 142 | }, 143 | { 144 | "title": "squid", 145 | "resource": "group", 146 | "gid": 31 147 | }, 148 | { 149 | "title": "xfs", 150 | "resource": "group", 151 | "gid": 33 152 | }, 153 | { 154 | "title": "kvm", 155 | "resource": "group", 156 | "gid": 34 157 | }, 158 | { 159 | "title": "games", 160 | "resource": "group", 161 | "gid": 35 162 | }, 163 | { 164 | "title": "shadow", 165 | "resource": "group", 166 | "gid": 42 167 | }, 168 | { 169 | "title": "postgres", 170 | "resource": "group", 171 | "gid": 70 172 | }, 173 | { 174 | "title": "cdrw", 175 | "resource": "group", 176 | "gid": 80 177 | }, 178 | { 179 | "title": "nut", 180 | "resource": "group", 181 | "gid": 84 182 | }, 183 | { 184 | "title": "usb", 185 | "resource": "group", 186 | "gid": 85 187 | }, 188 | { 189 | "title": "vpopmail", 190 | "resource": "group", 191 | "gid": 89 192 | }, 193 | { 194 | "title": "users", 195 | "resource": "group", 196 | "gid": 100 197 | }, 198 | { 199 | "title": "ntp", 200 | "resource": "group", 201 | "gid": 123 202 | }, 203 | { 204 | "title": "nofiles", 205 | "resource": "group", 206 | "gid": 200 207 | }, 208 | { 209 | "title": "smmsp", 210 | "resource": "group", 211 | "gid": 209 212 | }, 213 | { 214 | "title": "locate", 215 | "resource": "group", 216 | "gid": 245 217 | }, 218 | { 219 | "title": "abuild", 220 | "resource": "group", 221 | "gid": 300 222 | }, 223 | { 224 | "title": "utmp", 225 | "resource": "group", 226 | "gid": 406 227 | }, 228 | { 229 | "title": "ping", 230 | "resource": "group", 231 | "gid": 999 232 | }, 233 | { 234 | "title": "nogroup", 235 | "resource": "group", 236 | "gid": 65533 237 | }, 238 | { 239 | "title": "nobody", 240 | "resource": "group", 241 | "gid": 65534 242 | }, 243 | { 244 | "title": "WARNING: Ignoring APKINDEX.167438ca.tar.gz: No such file or directory", 245 | "resource": "package", 246 | "provider": "apk", 247 | "versions": [ 248 | "WARNING: Ignoring APKINDEX.167438ca.tar.gz: No such file or directory" 249 | ] 250 | }, 251 | { 252 | "title": "WARNING: Ignoring APKINDEX.a2e6dac0.tar.gz: No such file or directory", 253 | "resource": "package", 254 | "provider": "apk", 255 | "versions": [ 256 | "WARNING: Ignoring APKINDEX.a2e6dac0.tar.gz: No such file or directory" 257 | ] 258 | }, 259 | { 260 | "title": "WARNING: Ignoring APKINDEX.b83cced8.tar.gz: No such file or directory", 261 | "resource": "package", 262 | "provider": "apk", 263 | "versions": [ 264 | "WARNING: Ignoring APKINDEX.b83cced8.tar.gz: No such file or directory" 265 | ] 266 | }, 267 | { 268 | "title": "musl", 269 | "resource": "package", 270 | "provider": "apk", 271 | "versions": [ 272 | "1.1.14-r9" 273 | ] 274 | }, 275 | { 276 | "title": "busybox", 277 | "resource": "package", 278 | "provider": "apk", 279 | "versions": [ 280 | "1.24.2-r8" 281 | ] 282 | }, 283 | { 284 | "title": "alpine-baselayout", 285 | "resource": "package", 286 | "provider": "apk", 287 | "versions": [ 288 | "3.0.2-r0" 289 | ] 290 | }, 291 | { 292 | "title": "alpine-keys", 293 | "resource": "package", 294 | "provider": "apk", 295 | "versions": [ 296 | "1.1-r0" 297 | ] 298 | }, 299 | { 300 | "title": "zlib", 301 | "resource": "package", 302 | "provider": "apk", 303 | "versions": [ 304 | "1.2.8-r2" 305 | ] 306 | }, 307 | { 308 | "title": "libcrypto1.0", 309 | "resource": "package", 310 | "provider": "apk", 311 | "versions": [ 312 | "1.0.2h-r0" 313 | ] 314 | }, 315 | { 316 | "title": "libssl1.0", 317 | "resource": "package", 318 | "provider": "apk", 319 | "versions": [ 320 | "1.0.2h-r0" 321 | ] 322 | }, 323 | { 324 | "title": "apk-tools", 325 | "resource": "package", 326 | "provider": "apk", 327 | "versions": [ 328 | "2.6.7-r0" 329 | ] 330 | }, 331 | { 332 | "title": "scanelf", 333 | "resource": "package", 334 | "provider": "apk", 335 | "versions": [ 336 | "1.1.6-r0" 337 | ] 338 | }, 339 | { 340 | "title": "musl-utils", 341 | "resource": "package", 342 | "provider": "apk", 343 | "versions": [ 344 | "1.1.14-r9" 345 | ] 346 | }, 347 | { 348 | "title": "libc-utils", 349 | "resource": "package", 350 | "provider": "apk", 351 | "versions": [ 352 | "0.7-r0" 353 | ] 354 | }, 355 | { 356 | "title": "ca-certificates", 357 | "resource": "package", 358 | "provider": "apk", 359 | "versions": [ 360 | "20160104-r4" 361 | ] 362 | }, 363 | { 364 | "title": "hwdata-pci", 365 | "resource": "package", 366 | "provider": "apk", 367 | "versions": [ 368 | "0.282-r0" 369 | ] 370 | }, 371 | { 372 | "title": "pciutils-libs", 373 | "resource": "package", 374 | "provider": "apk", 375 | "versions": [ 376 | "3.4.1-r1" 377 | ] 378 | }, 379 | { 380 | "title": "pciutils", 381 | "resource": "package", 382 | "provider": "apk", 383 | "versions": [ 384 | "3.4.1-r1" 385 | ] 386 | }, 387 | { 388 | "title": "ncurses-terminfo-base", 389 | "resource": "package", 390 | "provider": "apk", 391 | "versions": [ 392 | "6.0-r7" 393 | ] 394 | }, 395 | { 396 | "title": "ncurses-terminfo", 397 | "resource": "package", 398 | "provider": "apk", 399 | "versions": [ 400 | "6.0-r7" 401 | ] 402 | }, 403 | { 404 | "title": "ncurses-libs", 405 | "resource": "package", 406 | "provider": "apk", 407 | "versions": [ 408 | "6.0-r7" 409 | ] 410 | }, 411 | { 412 | "title": "libedit", 413 | "resource": "package", 414 | "provider": "apk", 415 | "versions": [ 416 | "20150325.3.1-r3" 417 | ] 418 | }, 419 | { 420 | "title": "libffi", 421 | "resource": "package", 422 | "provider": "apk", 423 | "versions": [ 424 | "3.2.1-r2" 425 | ] 426 | }, 427 | { 428 | "title": "gdbm", 429 | "resource": "package", 430 | "provider": "apk", 431 | "versions": [ 432 | "1.11-r1" 433 | ] 434 | }, 435 | { 436 | "title": "gmp", 437 | "resource": "package", 438 | "provider": "apk", 439 | "versions": [ 440 | "6.1.0-r0" 441 | ] 442 | }, 443 | { 444 | "title": "yaml", 445 | "resource": "package", 446 | "provider": "apk", 447 | "versions": [ 448 | "0.1.6-r1" 449 | ] 450 | }, 451 | { 452 | "title": "ruby-libs", 453 | "resource": "package", 454 | "provider": "apk", 455 | "versions": [ 456 | "2.3.1-r0" 457 | ] 458 | }, 459 | { 460 | "title": "ruby", 461 | "resource": "package", 462 | "provider": "apk", 463 | "versions": [ 464 | "2.3.1-r0" 465 | ] 466 | }, 467 | { 468 | "title": "ruby-irb", 469 | "resource": "package", 470 | "provider": "apk", 471 | "versions": [ 472 | "2.3.1-r0" 473 | ] 474 | }, 475 | { 476 | "title": "ruby-json", 477 | "resource": "package", 478 | "provider": "apk", 479 | "versions": [ 480 | "2.3.1-r0" 481 | ] 482 | }, 483 | { 484 | "title": "ruby-rdoc", 485 | "resource": "package", 486 | "provider": "apk", 487 | "versions": [ 488 | "2.3.1-r0" 489 | ] 490 | }, 491 | { 492 | "title": "linux-pam", 493 | "resource": "package", 494 | "provider": "apk", 495 | "versions": [ 496 | "1.2.1-r0" 497 | ] 498 | }, 499 | { 500 | "title": "shadow", 501 | "resource": "package", 502 | "provider": "apk", 503 | "versions": [ 504 | "4.2.1-r3" 505 | ] 506 | }, 507 | { 508 | "title": "did_you_mean", 509 | "resource": "package", 510 | "provider": "gem", 511 | "versions": [ 512 | "1.0.0" 513 | ] 514 | }, 515 | { 516 | "title": "facter", 517 | "resource": "package", 518 | "provider": "gem", 519 | "versions": [ 520 | "2.4.6" 521 | ] 522 | }, 523 | { 524 | "title": "hiera", 525 | "resource": "package", 526 | "provider": "gem", 527 | "versions": [ 528 | "3.2.0" 529 | ] 530 | }, 531 | { 532 | "title": "json", 533 | "resource": "package", 534 | "provider": "gem", 535 | "versions": [ 536 | "1.8.3" 537 | ] 538 | }, 539 | { 540 | "title": "json_pure", 541 | "resource": "package", 542 | "provider": "gem", 543 | "versions": [ 544 | "2.0.1" 545 | ] 546 | }, 547 | { 548 | "title": "minitest", 549 | "resource": "package", 550 | "provider": "gem", 551 | "versions": [ 552 | "5.8.3" 553 | ] 554 | }, 555 | { 556 | "title": "net-telnet", 557 | "resource": "package", 558 | "provider": "gem", 559 | "versions": [ 560 | "0.1.1" 561 | ] 562 | }, 563 | { 564 | "title": "power_assert", 565 | "resource": "package", 566 | "provider": "gem", 567 | "versions": [ 568 | "0.2.6" 569 | ] 570 | }, 571 | { 572 | "title": "psych", 573 | "resource": "package", 574 | "provider": "gem", 575 | "versions": [ 576 | "2.0.17" 577 | ] 578 | }, 579 | { 580 | "title": "puppet", 581 | "resource": "package", 582 | "provider": "gem", 583 | "versions": [ 584 | "4.5.2" 585 | ] 586 | }, 587 | { 588 | "title": "rake", 589 | "resource": "package", 590 | "provider": "gem", 591 | "versions": [ 592 | "10.4.2" 593 | ] 594 | }, 595 | { 596 | "title": "rdoc", 597 | "resource": "package", 598 | "provider": "gem", 599 | "versions": [ 600 | "4.2.1" 601 | ] 602 | }, 603 | { 604 | "title": "test-unit", 605 | "resource": "package", 606 | "provider": "gem", 607 | "versions": [ 608 | "3.1.5" 609 | ] 610 | }, 611 | { 612 | "title": "root", 613 | "resource": "user", 614 | "uid": 0, 615 | "gid": 0, 616 | "groups": [ 617 | "root", 618 | "bin", 619 | "daemon", 620 | "sys", 621 | "adm", 622 | "disk", 623 | "wheel", 624 | "floppy", 625 | "dialout", 626 | "tape", 627 | "video" 628 | ], 629 | "home": "/root", 630 | "shell": "/bin/ash", 631 | "comment": "root" 632 | }, 633 | { 634 | "title": "bin", 635 | "resource": "user", 636 | "uid": 1, 637 | "gid": 1, 638 | "groups": [ 639 | "bin", 640 | "daemon", 641 | "sys" 642 | ], 643 | "home": "/bin", 644 | "shell": "/sbin/nologin", 645 | "comment": "bin" 646 | }, 647 | { 648 | "title": "daemon", 649 | "resource": "user", 650 | "uid": 2, 651 | "gid": 2, 652 | "groups": [ 653 | "bin", 654 | "daemon", 655 | "adm" 656 | ], 657 | "home": "/sbin", 658 | "shell": "/sbin/nologin", 659 | "comment": "daemon" 660 | }, 661 | { 662 | "title": "adm", 663 | "resource": "user", 664 | "uid": 3, 665 | "gid": 4, 666 | "groups": [ 667 | "sys", 668 | "adm", 669 | "disk" 670 | ], 671 | "home": "/var/adm", 672 | "shell": "/sbin/nologin", 673 | "comment": "adm" 674 | }, 675 | { 676 | "title": "lp", 677 | "resource": "user", 678 | "uid": 4, 679 | "gid": 7, 680 | "groups": [ 681 | "lp" 682 | ], 683 | "home": "/var/spool/lpd", 684 | "shell": "/sbin/nologin", 685 | "comment": "lp" 686 | }, 687 | { 688 | "title": "sync", 689 | "resource": "user", 690 | "uid": 5, 691 | "gid": 0, 692 | "groups": [ 693 | 694 | ], 695 | "home": "/sbin", 696 | "shell": "/bin/sync", 697 | "comment": "sync" 698 | }, 699 | { 700 | "title": "shutdown", 701 | "resource": "user", 702 | "uid": 6, 703 | "gid": 0, 704 | "groups": [ 705 | 706 | ], 707 | "home": "/sbin", 708 | "shell": "/sbin/shutdown", 709 | "comment": "shutdown" 710 | }, 711 | { 712 | "title": "halt", 713 | "resource": "user", 714 | "uid": 7, 715 | "gid": 0, 716 | "groups": [ 717 | 718 | ], 719 | "home": "/sbin", 720 | "shell": "/sbin/halt", 721 | "comment": "halt" 722 | }, 723 | { 724 | "title": "mail", 725 | "resource": "user", 726 | "uid": 8, 727 | "gid": 12, 728 | "groups": [ 729 | "mail" 730 | ], 731 | "home": "/var/spool/mail", 732 | "shell": "/sbin/nologin", 733 | "comment": "mail" 734 | }, 735 | { 736 | "title": "news", 737 | "resource": "user", 738 | "uid": 9, 739 | "gid": 13, 740 | "groups": [ 741 | "news" 742 | ], 743 | "home": "/usr/lib/news", 744 | "shell": "/sbin/nologin", 745 | "comment": "news" 746 | }, 747 | { 748 | "title": "uucp", 749 | "resource": "user", 750 | "uid": 10, 751 | "gid": 14, 752 | "groups": [ 753 | "uucp" 754 | ], 755 | "home": "/var/spool/uucppublic", 756 | "shell": "/sbin/nologin", 757 | "comment": "uucp" 758 | }, 759 | { 760 | "title": "operator", 761 | "resource": "user", 762 | "uid": 11, 763 | "gid": 0, 764 | "groups": [ 765 | 766 | ], 767 | "home": "/root", 768 | "shell": "/bin/sh", 769 | "comment": "operator" 770 | }, 771 | { 772 | "title": "man", 773 | "resource": "user", 774 | "uid": 13, 775 | "gid": 15, 776 | "groups": [ 777 | "man" 778 | ], 779 | "home": "/usr/man", 780 | "shell": "/sbin/nologin", 781 | "comment": "man" 782 | }, 783 | { 784 | "title": "postmaster", 785 | "resource": "user", 786 | "uid": 14, 787 | "gid": 12, 788 | "groups": [ 789 | 790 | ], 791 | "home": "/var/spool/mail", 792 | "shell": "/sbin/nologin", 793 | "comment": "postmaster" 794 | }, 795 | { 796 | "title": "cron", 797 | "resource": "user", 798 | "uid": 16, 799 | "gid": 16, 800 | "groups": [ 801 | "cron" 802 | ], 803 | "home": "/var/spool/cron", 804 | "shell": "/sbin/nologin", 805 | "comment": "cron" 806 | }, 807 | { 808 | "title": "ftp", 809 | "resource": "user", 810 | "uid": 21, 811 | "gid": 21, 812 | "groups": [ 813 | 814 | ], 815 | "home": "/var/lib/ftp", 816 | "shell": "/sbin/nologin", 817 | "comment": "" 818 | }, 819 | { 820 | "title": "sshd", 821 | "resource": "user", 822 | "uid": 22, 823 | "gid": 22, 824 | "groups": [ 825 | 826 | ], 827 | "home": "/dev/null", 828 | "shell": "/sbin/nologin", 829 | "comment": "sshd" 830 | }, 831 | { 832 | "title": "at", 833 | "resource": "user", 834 | "uid": 25, 835 | "gid": 25, 836 | "groups": [ 837 | "at" 838 | ], 839 | "home": "/var/spool/cron/atjobs", 840 | "shell": "/sbin/nologin", 841 | "comment": "at" 842 | }, 843 | { 844 | "title": "squid", 845 | "resource": "user", 846 | "uid": 31, 847 | "gid": 31, 848 | "groups": [ 849 | "squid" 850 | ], 851 | "home": "/var/cache/squid", 852 | "shell": "/sbin/nologin", 853 | "comment": "Squid" 854 | }, 855 | { 856 | "title": "xfs", 857 | "resource": "user", 858 | "uid": 33, 859 | "gid": 33, 860 | "groups": [ 861 | "xfs" 862 | ], 863 | "home": "/etc/X11/fs", 864 | "shell": "/sbin/nologin", 865 | "comment": "X Font Server" 866 | }, 867 | { 868 | "title": "games", 869 | "resource": "user", 870 | "uid": 35, 871 | "gid": 35, 872 | "groups": [ 873 | "users" 874 | ], 875 | "home": "/usr/games", 876 | "shell": "/sbin/nologin", 877 | "comment": "games" 878 | }, 879 | { 880 | "title": "postgres", 881 | "resource": "user", 882 | "uid": 70, 883 | "gid": 70, 884 | "groups": [ 885 | 886 | ], 887 | "home": "/var/lib/postgresql", 888 | "shell": "/bin/sh", 889 | "comment": "" 890 | }, 891 | { 892 | "title": "nut", 893 | "resource": "user", 894 | "uid": 84, 895 | "gid": 84, 896 | "groups": [ 897 | 898 | ], 899 | "home": "/var/state/nut", 900 | "shell": "/sbin/nologin", 901 | "comment": "nut" 902 | }, 903 | { 904 | "title": "cyrus", 905 | "resource": "user", 906 | "uid": 85, 907 | "gid": 12, 908 | "groups": [ 909 | 910 | ], 911 | "home": "/usr/cyrus", 912 | "shell": "/sbin/nologin", 913 | "comment": "" 914 | }, 915 | { 916 | "title": "vpopmail", 917 | "resource": "user", 918 | "uid": 89, 919 | "gid": 89, 920 | "groups": [ 921 | 922 | ], 923 | "home": "/var/vpopmail", 924 | "shell": "/sbin/nologin", 925 | "comment": "" 926 | }, 927 | { 928 | "title": "ntp", 929 | "resource": "user", 930 | "uid": 123, 931 | "gid": 123, 932 | "groups": [ 933 | 934 | ], 935 | "home": "/var/empty", 936 | "shell": "/sbin/nologin", 937 | "comment": "NTP" 938 | }, 939 | { 940 | "title": "smmsp", 941 | "resource": "user", 942 | "uid": 209, 943 | "gid": 209, 944 | "groups": [ 945 | "smmsp" 946 | ], 947 | "home": "/var/spool/mqueue", 948 | "shell": "/sbin/nologin", 949 | "comment": "smmsp" 950 | }, 951 | { 952 | "title": "guest", 953 | "resource": "user", 954 | "uid": 405, 955 | "gid": 100, 956 | "groups": [ 957 | 958 | ], 959 | "home": "/dev/null", 960 | "shell": "/sbin/nologin", 961 | "comment": "guest" 962 | }, 963 | { 964 | "title": "nobody", 965 | "resource": "user", 966 | "uid": 65534, 967 | "gid": 65534, 968 | "groups": [ 969 | 970 | ], 971 | "home": "/", 972 | "shell": "/sbin/nologin", 973 | "comment": "nobody" 974 | } 975 | ], 976 | "facts": { 977 | "operatingsystem": "Alpine", 978 | "os": { 979 | "name": "Alpine", 980 | "family": "Linux", 981 | "release": { 982 | "major": "3", 983 | "minor": "4", 984 | "full": "3.4.0" 985 | } 986 | }, 987 | "kernel": "Linux", 988 | "osfamily": "Linux", 989 | "version": "2.4.6", 990 | "system_uptime": { 991 | "seconds": 3702, 992 | "hours": 1, 993 | "days": 0, 994 | "uptime": "1:01 hours" 995 | }, 996 | "selinux": false, 997 | "domain": "local", 998 | "processors": { 999 | "models": [ 1000 | "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1001 | "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1002 | "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1003 | "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz" 1004 | ], 1005 | "count": 4, 1006 | "physicalcount": 4 1007 | }, 1008 | "architecture": "x86_64", 1009 | "hardwaremodel": "x86_64", 1010 | "processor0": "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1011 | "processor1": "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1012 | "processor2": "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1013 | "processor3": "Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz", 1014 | "processorcount": 4, 1015 | "ps": "ps -ef", 1016 | "ipaddress": "172.17.0.2", 1017 | "timezone": "UTC", 1018 | "rubysitedir": "/usr/local/lib/site_ruby/2.3.0", 1019 | "id": "root", 1020 | "uptime_hours": 1, 1021 | "interfaces": "eth0,ip6gre0,ip6tnl0,lo,sit0", 1022 | "ipaddress_eth0": "172.17.0.2", 1023 | "macaddress_eth0": "02:42:AC:11:00:02", 1024 | "netmask_eth0": "255.255.0.0", 1025 | "mtu_eth0": 1500, 1026 | "mtu_ip6gre0": 1448, 1027 | "mtu_ip6tnl0": 1452, 1028 | "ipaddress_lo": "127.0.0.1", 1029 | "netmask_lo": "255.0.0.0", 1030 | "mtu_lo": 65536, 1031 | "mtu_sit0": 1480, 1032 | "path": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 1033 | "macaddress": "02:42:AC:11:00:02", 1034 | "fqdn": "5158fc1d57f0.local", 1035 | "facterversion": "2.4.6", 1036 | "uptime": "1:01 hours", 1037 | "virtual": "docker", 1038 | "is_virtual": true, 1039 | "physicalprocessorcount": 4, 1040 | "operatingsystemrelease": "3.4.0", 1041 | "hostname": "5158fc1d57f0", 1042 | "operatingsystemmajrelease": "3", 1043 | "rubyversion": "2.3.1", 1044 | "kernelversion": "4.4.14", 1045 | "puppetversion": "4.5.2", 1046 | "network_eth0": "172.17.0.0", 1047 | "network_lo": "127.0.0.0", 1048 | "uptime_seconds": 3702, 1049 | "rubyplatform": "x86_64-linux-musl", 1050 | "memorysize": "1.95 GB", 1051 | "memoryfree": "1.75 GB", 1052 | "swapsize": "3.91 GB", 1053 | "swapfree": "3.91 GB", 1054 | "swapsize_mb": "4006.00", 1055 | "swapfree_mb": "4006.00", 1056 | "memorysize_mb": "2000.69", 1057 | "memoryfree_mb": "1792.59", 1058 | "kernelrelease": "4.4.14-moby", 1059 | "uptime_days": 0, 1060 | "filesystems": "ext2,ext3,ext4,iso9660,msdos,ntfs,udf,vfat", 1061 | "hardwareisa": "unknown", 1062 | "kernelmajversion": "4.4", 1063 | "partitions": { 1064 | "vda1": { 1065 | "size": "8204288" 1066 | }, 1067 | "vda2": { 1068 | "size": "126011392", 1069 | "mount": "/etc/resolv.conf" 1070 | } 1071 | }, 1072 | "netmask": "255.255.0.0", 1073 | "uniqueid": "00000000", 1074 | "gid": "root" 1075 | } 1076 | } 1077 | -------------------------------------------------------------------------------- /examples/example.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | :schema_version: 1 3 | :created: '2016-07-14T08:51:34Z' 4 | :resources: 5 | - :title: root 6 | :resource: group 7 | :gid: 0 8 | - :title: bin 9 | :resource: group 10 | :gid: 1 11 | - :title: daemon 12 | :resource: group 13 | :gid: 2 14 | - :title: sys 15 | :resource: group 16 | :gid: 3 17 | - :title: adm 18 | :resource: group 19 | :gid: 4 20 | - :title: tty 21 | :resource: group 22 | :gid: 5 23 | - :title: disk 24 | :resource: group 25 | :gid: 6 26 | - :title: lp 27 | :resource: group 28 | :gid: 7 29 | - :title: mem 30 | :resource: group 31 | :gid: 8 32 | - :title: kmem 33 | :resource: group 34 | :gid: 9 35 | - :title: wheel 36 | :resource: group 37 | :gid: 10 38 | - :title: floppy 39 | :resource: group 40 | :gid: 11 41 | - :title: mail 42 | :resource: group 43 | :gid: 12 44 | - :title: news 45 | :resource: group 46 | :gid: 13 47 | - :title: uucp 48 | :resource: group 49 | :gid: 14 50 | - :title: man 51 | :resource: group 52 | :gid: 15 53 | - :title: cron 54 | :resource: group 55 | :gid: 16 56 | - :title: console 57 | :resource: group 58 | :gid: 17 59 | - :title: audio 60 | :resource: group 61 | :gid: 18 62 | - :title: cdrom 63 | :resource: group 64 | :gid: 19 65 | - :title: dialout 66 | :resource: group 67 | :gid: 20 68 | - :title: ftp 69 | :resource: group 70 | :gid: 21 71 | - :title: sshd 72 | :resource: group 73 | :gid: 22 74 | - :title: at 75 | :resource: group 76 | :gid: 25 77 | - :title: tape 78 | :resource: group 79 | :gid: 26 80 | - :title: video 81 | :resource: group 82 | :gid: 27 83 | - :title: netdev 84 | :resource: group 85 | :gid: 28 86 | - :title: readproc 87 | :resource: group 88 | :gid: 30 89 | - :title: squid 90 | :resource: group 91 | :gid: 31 92 | - :title: xfs 93 | :resource: group 94 | :gid: 33 95 | - :title: kvm 96 | :resource: group 97 | :gid: 34 98 | - :title: games 99 | :resource: group 100 | :gid: 35 101 | - :title: shadow 102 | :resource: group 103 | :gid: 42 104 | - :title: postgres 105 | :resource: group 106 | :gid: 70 107 | - :title: cdrw 108 | :resource: group 109 | :gid: 80 110 | - :title: nut 111 | :resource: group 112 | :gid: 84 113 | - :title: usb 114 | :resource: group 115 | :gid: 85 116 | - :title: vpopmail 117 | :resource: group 118 | :gid: 89 119 | - :title: users 120 | :resource: group 121 | :gid: 100 122 | - :title: ntp 123 | :resource: group 124 | :gid: 123 125 | - :title: nofiles 126 | :resource: group 127 | :gid: 200 128 | - :title: smmsp 129 | :resource: group 130 | :gid: 209 131 | - :title: locate 132 | :resource: group 133 | :gid: 245 134 | - :title: abuild 135 | :resource: group 136 | :gid: 300 137 | - :title: utmp 138 | :resource: group 139 | :gid: 406 140 | - :title: ping 141 | :resource: group 142 | :gid: 999 143 | - :title: nogroup 144 | :resource: group 145 | :gid: 65533 146 | - :title: nobody 147 | :resource: group 148 | :gid: 65534 149 | - :title: 'WARNING: Ignoring APKINDEX.167438ca.tar.gz: No such file or directory' 150 | :resource: package 151 | :provider: :apk 152 | :versions: 153 | - 'WARNING: Ignoring APKINDEX.167438ca.tar.gz: No such file or directory' 154 | - :title: 'WARNING: Ignoring APKINDEX.a2e6dac0.tar.gz: No such file or directory' 155 | :resource: package 156 | :provider: :apk 157 | :versions: 158 | - 'WARNING: Ignoring APKINDEX.a2e6dac0.tar.gz: No such file or directory' 159 | - :title: 'WARNING: Ignoring APKINDEX.b83cced8.tar.gz: No such file or directory' 160 | :resource: package 161 | :provider: :apk 162 | :versions: 163 | - 'WARNING: Ignoring APKINDEX.b83cced8.tar.gz: No such file or directory' 164 | - :title: musl 165 | :resource: package 166 | :provider: :apk 167 | :versions: 168 | - 1.1.14-r9 169 | - :title: busybox 170 | :resource: package 171 | :provider: :apk 172 | :versions: 173 | - 1.24.2-r8 174 | - :title: alpine-baselayout 175 | :resource: package 176 | :provider: :apk 177 | :versions: 178 | - 3.0.2-r0 179 | - :title: alpine-keys 180 | :resource: package 181 | :provider: :apk 182 | :versions: 183 | - 1.1-r0 184 | - :title: zlib 185 | :resource: package 186 | :provider: :apk 187 | :versions: 188 | - 1.2.8-r2 189 | - :title: libcrypto1.0 190 | :resource: package 191 | :provider: :apk 192 | :versions: 193 | - 1.0.2h-r0 194 | - :title: libssl1.0 195 | :resource: package 196 | :provider: :apk 197 | :versions: 198 | - 1.0.2h-r0 199 | - :title: apk-tools 200 | :resource: package 201 | :provider: :apk 202 | :versions: 203 | - 2.6.7-r0 204 | - :title: scanelf 205 | :resource: package 206 | :provider: :apk 207 | :versions: 208 | - 1.1.6-r0 209 | - :title: musl-utils 210 | :resource: package 211 | :provider: :apk 212 | :versions: 213 | - 1.1.14-r9 214 | - :title: libc-utils 215 | :resource: package 216 | :provider: :apk 217 | :versions: 218 | - 0.7-r0 219 | - :title: ca-certificates 220 | :resource: package 221 | :provider: :apk 222 | :versions: 223 | - 20160104-r4 224 | - :title: hwdata-pci 225 | :resource: package 226 | :provider: :apk 227 | :versions: 228 | - 0.282-r0 229 | - :title: pciutils-libs 230 | :resource: package 231 | :provider: :apk 232 | :versions: 233 | - 3.4.1-r1 234 | - :title: pciutils 235 | :resource: package 236 | :provider: :apk 237 | :versions: 238 | - 3.4.1-r1 239 | - :title: ncurses-terminfo-base 240 | :resource: package 241 | :provider: :apk 242 | :versions: 243 | - 6.0-r7 244 | - :title: ncurses-terminfo 245 | :resource: package 246 | :provider: :apk 247 | :versions: 248 | - 6.0-r7 249 | - :title: ncurses-libs 250 | :resource: package 251 | :provider: :apk 252 | :versions: 253 | - 6.0-r7 254 | - :title: libedit 255 | :resource: package 256 | :provider: :apk 257 | :versions: 258 | - 20150325.3.1-r3 259 | - :title: libffi 260 | :resource: package 261 | :provider: :apk 262 | :versions: 263 | - 3.2.1-r2 264 | - :title: gdbm 265 | :resource: package 266 | :provider: :apk 267 | :versions: 268 | - 1.11-r1 269 | - :title: gmp 270 | :resource: package 271 | :provider: :apk 272 | :versions: 273 | - 6.1.0-r0 274 | - :title: yaml 275 | :resource: package 276 | :provider: :apk 277 | :versions: 278 | - 0.1.6-r1 279 | - :title: ruby-libs 280 | :resource: package 281 | :provider: :apk 282 | :versions: 283 | - 2.3.1-r0 284 | - :title: ruby 285 | :resource: package 286 | :provider: :apk 287 | :versions: 288 | - 2.3.1-r0 289 | - :title: ruby-irb 290 | :resource: package 291 | :provider: :apk 292 | :versions: 293 | - 2.3.1-r0 294 | - :title: ruby-json 295 | :resource: package 296 | :provider: :apk 297 | :versions: 298 | - 2.3.1-r0 299 | - :title: ruby-rdoc 300 | :resource: package 301 | :provider: :apk 302 | :versions: 303 | - 2.3.1-r0 304 | - :title: linux-pam 305 | :resource: package 306 | :provider: :apk 307 | :versions: 308 | - 1.2.1-r0 309 | - :title: shadow 310 | :resource: package 311 | :provider: :apk 312 | :versions: 313 | - 4.2.1-r3 314 | - :title: did_you_mean 315 | :resource: package 316 | :provider: :gem 317 | :versions: 318 | - 1.0.0 319 | - :title: facter 320 | :resource: package 321 | :provider: :gem 322 | :versions: 323 | - 2.4.6 324 | - :title: hiera 325 | :resource: package 326 | :provider: :gem 327 | :versions: 328 | - 3.2.0 329 | - :title: json 330 | :resource: package 331 | :provider: :gem 332 | :versions: 333 | - 1.8.3 334 | - :title: json_pure 335 | :resource: package 336 | :provider: :gem 337 | :versions: 338 | - 2.0.1 339 | - :title: minitest 340 | :resource: package 341 | :provider: :gem 342 | :versions: 343 | - 5.8.3 344 | - :title: net-telnet 345 | :resource: package 346 | :provider: :gem 347 | :versions: 348 | - 0.1.1 349 | - :title: power_assert 350 | :resource: package 351 | :provider: :gem 352 | :versions: 353 | - 0.2.6 354 | - :title: psych 355 | :resource: package 356 | :provider: :gem 357 | :versions: 358 | - 2.0.17 359 | - :title: puppet 360 | :resource: package 361 | :provider: :gem 362 | :versions: 363 | - 4.5.2 364 | - :title: rake 365 | :resource: package 366 | :provider: :gem 367 | :versions: 368 | - 10.4.2 369 | - :title: rdoc 370 | :resource: package 371 | :provider: :gem 372 | :versions: 373 | - 4.2.1 374 | - :title: test-unit 375 | :resource: package 376 | :provider: :gem 377 | :versions: 378 | - 3.1.5 379 | - :title: root 380 | :resource: user 381 | :uid: 0 382 | :gid: 0 383 | :groups: 384 | - root 385 | - bin 386 | - daemon 387 | - sys 388 | - adm 389 | - disk 390 | - wheel 391 | - floppy 392 | - dialout 393 | - tape 394 | - video 395 | :home: "/root" 396 | :shell: "/bin/ash" 397 | :comment: root 398 | - :title: bin 399 | :resource: user 400 | :uid: 1 401 | :gid: 1 402 | :groups: 403 | - bin 404 | - daemon 405 | - sys 406 | :home: "/bin" 407 | :shell: "/sbin/nologin" 408 | :comment: bin 409 | - :title: daemon 410 | :resource: user 411 | :uid: 2 412 | :gid: 2 413 | :groups: 414 | - bin 415 | - daemon 416 | - adm 417 | :home: "/sbin" 418 | :shell: "/sbin/nologin" 419 | :comment: daemon 420 | - :title: adm 421 | :resource: user 422 | :uid: 3 423 | :gid: 4 424 | :groups: 425 | - sys 426 | - adm 427 | - disk 428 | :home: "/var/adm" 429 | :shell: "/sbin/nologin" 430 | :comment: adm 431 | - :title: lp 432 | :resource: user 433 | :uid: 4 434 | :gid: 7 435 | :groups: 436 | - lp 437 | :home: "/var/spool/lpd" 438 | :shell: "/sbin/nologin" 439 | :comment: lp 440 | - :title: sync 441 | :resource: user 442 | :uid: 5 443 | :gid: 0 444 | :groups: [] 445 | :home: "/sbin" 446 | :shell: "/bin/sync" 447 | :comment: sync 448 | - :title: shutdown 449 | :resource: user 450 | :uid: 6 451 | :gid: 0 452 | :groups: [] 453 | :home: "/sbin" 454 | :shell: "/sbin/shutdown" 455 | :comment: shutdown 456 | - :title: halt 457 | :resource: user 458 | :uid: 7 459 | :gid: 0 460 | :groups: [] 461 | :home: "/sbin" 462 | :shell: "/sbin/halt" 463 | :comment: halt 464 | - :title: mail 465 | :resource: user 466 | :uid: 8 467 | :gid: 12 468 | :groups: 469 | - mail 470 | :home: "/var/spool/mail" 471 | :shell: "/sbin/nologin" 472 | :comment: mail 473 | - :title: news 474 | :resource: user 475 | :uid: 9 476 | :gid: 13 477 | :groups: 478 | - news 479 | :home: "/usr/lib/news" 480 | :shell: "/sbin/nologin" 481 | :comment: news 482 | - :title: uucp 483 | :resource: user 484 | :uid: 10 485 | :gid: 14 486 | :groups: 487 | - uucp 488 | :home: "/var/spool/uucppublic" 489 | :shell: "/sbin/nologin" 490 | :comment: uucp 491 | - :title: operator 492 | :resource: user 493 | :uid: 11 494 | :gid: 0 495 | :groups: [] 496 | :home: "/root" 497 | :shell: "/bin/sh" 498 | :comment: operator 499 | - :title: man 500 | :resource: user 501 | :uid: 13 502 | :gid: 15 503 | :groups: 504 | - man 505 | :home: "/usr/man" 506 | :shell: "/sbin/nologin" 507 | :comment: man 508 | - :title: postmaster 509 | :resource: user 510 | :uid: 14 511 | :gid: 12 512 | :groups: [] 513 | :home: "/var/spool/mail" 514 | :shell: "/sbin/nologin" 515 | :comment: postmaster 516 | - :title: cron 517 | :resource: user 518 | :uid: 16 519 | :gid: 16 520 | :groups: 521 | - cron 522 | :home: "/var/spool/cron" 523 | :shell: "/sbin/nologin" 524 | :comment: cron 525 | - :title: ftp 526 | :resource: user 527 | :uid: 21 528 | :gid: 21 529 | :groups: [] 530 | :home: "/var/lib/ftp" 531 | :shell: "/sbin/nologin" 532 | :comment: '' 533 | - :title: sshd 534 | :resource: user 535 | :uid: 22 536 | :gid: 22 537 | :groups: [] 538 | :home: "/dev/null" 539 | :shell: "/sbin/nologin" 540 | :comment: sshd 541 | - :title: at 542 | :resource: user 543 | :uid: 25 544 | :gid: 25 545 | :groups: 546 | - at 547 | :home: "/var/spool/cron/atjobs" 548 | :shell: "/sbin/nologin" 549 | :comment: at 550 | - :title: squid 551 | :resource: user 552 | :uid: 31 553 | :gid: 31 554 | :groups: 555 | - squid 556 | :home: "/var/cache/squid" 557 | :shell: "/sbin/nologin" 558 | :comment: Squid 559 | - :title: xfs 560 | :resource: user 561 | :uid: 33 562 | :gid: 33 563 | :groups: 564 | - xfs 565 | :home: "/etc/X11/fs" 566 | :shell: "/sbin/nologin" 567 | :comment: X Font Server 568 | - :title: games 569 | :resource: user 570 | :uid: 35 571 | :gid: 35 572 | :groups: 573 | - users 574 | :home: "/usr/games" 575 | :shell: "/sbin/nologin" 576 | :comment: games 577 | - :title: postgres 578 | :resource: user 579 | :uid: 70 580 | :gid: 70 581 | :groups: [] 582 | :home: "/var/lib/postgresql" 583 | :shell: "/bin/sh" 584 | :comment: '' 585 | - :title: nut 586 | :resource: user 587 | :uid: 84 588 | :gid: 84 589 | :groups: [] 590 | :home: "/var/state/nut" 591 | :shell: "/sbin/nologin" 592 | :comment: nut 593 | - :title: cyrus 594 | :resource: user 595 | :uid: 85 596 | :gid: 12 597 | :groups: [] 598 | :home: "/usr/cyrus" 599 | :shell: "/sbin/nologin" 600 | :comment: '' 601 | - :title: vpopmail 602 | :resource: user 603 | :uid: 89 604 | :gid: 89 605 | :groups: [] 606 | :home: "/var/vpopmail" 607 | :shell: "/sbin/nologin" 608 | :comment: '' 609 | - :title: ntp 610 | :resource: user 611 | :uid: 123 612 | :gid: 123 613 | :groups: [] 614 | :home: "/var/empty" 615 | :shell: "/sbin/nologin" 616 | :comment: NTP 617 | - :title: smmsp 618 | :resource: user 619 | :uid: 209 620 | :gid: 209 621 | :groups: 622 | - smmsp 623 | :home: "/var/spool/mqueue" 624 | :shell: "/sbin/nologin" 625 | :comment: smmsp 626 | - :title: guest 627 | :resource: user 628 | :uid: 405 629 | :gid: 100 630 | :groups: [] 631 | :home: "/dev/null" 632 | :shell: "/sbin/nologin" 633 | :comment: guest 634 | - :title: nobody 635 | :resource: user 636 | :uid: 65534 637 | :gid: 65534 638 | :groups: [] 639 | :home: "/" 640 | :shell: "/sbin/nologin" 641 | :comment: nobody 642 | :facts: 643 | operatingsystem: Alpine 644 | os: 645 | name: Alpine 646 | family: Linux 647 | release: 648 | major: '3' 649 | minor: '4' 650 | full: 3.4.0 651 | kernel: Linux 652 | osfamily: Linux 653 | version: 2.4.6 654 | system_uptime: 655 | seconds: 4343 656 | hours: 1 657 | days: 0 658 | uptime: 1:12 hours 659 | selinux: false 660 | domain: local 661 | processors: 662 | models: 663 | - Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 664 | - Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 665 | - Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 666 | - Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 667 | count: 4 668 | physicalcount: 4 669 | architecture: x86_64 670 | hardwaremodel: x86_64 671 | processor0: Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 672 | processor1: Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 673 | processor2: Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 674 | processor3: Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz 675 | processorcount: 4 676 | ps: ps -ef 677 | ipaddress: 172.17.0.3 678 | timezone: UTC 679 | rubysitedir: "/usr/local/lib/site_ruby/2.3.0" 680 | id: root 681 | uptime_hours: 1 682 | interfaces: eth0,ip6gre0,ip6tnl0,lo,sit0 683 | ipaddress_eth0: 172.17.0.3 684 | macaddress_eth0: 02:42:AC:11:00:03 685 | netmask_eth0: 255.255.0.0 686 | mtu_eth0: 1500 687 | mtu_ip6gre0: 1448 688 | mtu_ip6tnl0: 1452 689 | ipaddress_lo: 127.0.0.1 690 | netmask_lo: 255.0.0.0 691 | mtu_lo: 65536 692 | mtu_sit0: 1480 693 | path: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 694 | macaddress: 02:42:AC:11:00:03 695 | fqdn: d0df18874e2f.local 696 | facterversion: 2.4.6 697 | uptime: 1:12 hours 698 | virtual: docker 699 | is_virtual: true 700 | physicalprocessorcount: 4 701 | operatingsystemrelease: 3.4.0 702 | hostname: d0df18874e2f 703 | operatingsystemmajrelease: '3' 704 | rubyversion: 2.3.1 705 | kernelversion: 4.4.14 706 | puppetversion: 4.5.2 707 | network_eth0: 172.17.0.0 708 | network_lo: 127.0.0.0 709 | uptime_seconds: 4343 710 | rubyplatform: x86_64-linux-musl 711 | memorysize: 1.95 GB 712 | memoryfree: 1.72 GB 713 | swapsize: 3.91 GB 714 | swapfree: 3.91 GB 715 | swapsize_mb: '4006.00' 716 | swapfree_mb: '4006.00' 717 | memorysize_mb: '2000.69' 718 | memoryfree_mb: '1761.81' 719 | kernelrelease: 4.4.14-moby 720 | uptime_days: 0 721 | filesystems: ext2,ext3,ext4,iso9660,msdos,ntfs,udf,vfat 722 | hardwareisa: unknown 723 | kernelmajversion: '4.4' 724 | partitions: 725 | vda1: 726 | size: '8204288' 727 | vda2: 728 | size: '126011392' 729 | mount: "/etc/resolv.conf" 730 | netmask: 255.255.0.0 731 | uniqueid: '00000000' 732 | gid: root 733 | -------------------------------------------------------------------------------- /examples/sample-inventory.json: -------------------------------------------------------------------------------- 1 | {"resources":[{"title":"root","resource":"group","gid":0},{"title":"daemon","resource":"group","gid":1},{"title":"bin","resource":"group","gid":2},{"title":"sys","resource":"group","gid":3},{"title":"adm","resource":"group","gid":4},{"title":"tty","resource":"group","gid":5},{"title":"disk","resource":"group","gid":6},{"title":"lp","resource":"group","gid":7},{"title":"mail","resource":"group","gid":8},{"title":"news","resource":"group","gid":9},{"title":"uucp","resource":"group","gid":10},{"title":"man","resource":"group","gid":12},{"title":"proxy","resource":"group","gid":13},{"title":"kmem","resource":"group","gid":15},{"title":"dialout","resource":"group","gid":20},{"title":"fax","resource":"group","gid":21},{"title":"voice","resource":"group","gid":22},{"title":"cdrom","resource":"group","gid":24},{"title":"floppy","resource":"group","gid":25},{"title":"tape","resource":"group","gid":26},{"title":"sudo","resource":"group","gid":27},{"title":"audio","resource":"group","gid":29},{"title":"dip","resource":"group","gid":30},{"title":"www-data","resource":"group","gid":33},{"title":"backup","resource":"group","gid":34},{"title":"operator","resource":"group","gid":37},{"title":"list","resource":"group","gid":38},{"title":"irc","resource":"group","gid":39},{"title":"src","resource":"group","gid":40},{"title":"gnats","resource":"group","gid":41},{"title":"shadow","resource":"group","gid":42},{"title":"utmp","resource":"group","gid":43},{"title":"video","resource":"group","gid":44},{"title":"sasl","resource":"group","gid":45},{"title":"plugdev","resource":"group","gid":46},{"title":"staff","resource":"group","gid":50},{"title":"games","resource":"group","gid":60},{"title":"users","resource":"group","gid":100},{"title":"nogroup","resource":"group","gid":65534},{"title":"systemd-journal","resource":"group","gid":101},{"title":"systemd-timesync","resource":"group","gid":102},{"title":"systemd-network","resource":"group","gid":103},{"title":"systemd-resolve","resource":"group","gid":104},{"title":"systemd-bus-proxy","resource":"group","gid":105},{"title":"adduser","resource":"package","provider":"apt","versions":["3.113+nmu3ubuntu4"]},{"title":"apt","resource":"package","provider":"apt","versions":["1.2.12~ubuntu16.04.1"]},{"title":"base-files","resource":"package","provider":"apt","versions":["9.4ubuntu4.2"]},{"title":"base-passwd","resource":"package","provider":"apt","versions":["3.5.39"]},{"title":"bash","resource":"package","provider":"apt","versions":["4.3-14ubuntu1.1"]},{"title":"bsdutils","resource":"package","provider":"apt","versions":["1:2.27.1-6ubuntu3.1"]},{"title":"ca-certificates","resource":"package","provider":"apt","versions":["20160104ubuntu1"]},{"title":"coreutils","resource":"package","provider":"apt","versions":["8.25-2ubuntu2"]},{"title":"dash","resource":"package","provider":"apt","versions":["0.5.8-2.1ubuntu2"]},{"title":"debconf","resource":"package","provider":"apt","versions":["1.5.58ubuntu1"]},{"title":"debianutils","resource":"package","provider":"apt","versions":["4.7"]},{"title":"dh-python","resource":"package","provider":"apt","versions":["2.20151103ubuntu1.1"]},{"title":"diffutils","resource":"package","provider":"apt","versions":["1:3.3-3"]},{"title":"distro-info-data","resource":"package","provider":"apt","versions":["0.28ubuntu0.1"]},{"title":"dpkg","resource":"package","provider":"apt","versions":["1.18.4ubuntu1.1"]},{"title":"e2fslibs","resource":"package","provider":"apt","versions":["1.42.13-1ubuntu1"]},{"title":"e2fsprogs","resource":"package","provider":"apt","versions":["1.42.13-1ubuntu1"]},{"title":"file","resource":"package","provider":"apt","versions":["1:5.25-2ubuntu1"]},{"title":"findutils","resource":"package","provider":"apt","versions":["4.6.0+git+20160126-2"]},{"title":"gcc-5-base","resource":"package","provider":"apt","versions":["5.4.0-6ubuntu1~16.04.2"]},{"title":"gcc-6-base","resource":"package","provider":"apt","versions":["6.0.1-0ubuntu1"]},{"title":"gnupg","resource":"package","provider":"apt","versions":["1.4.20-1ubuntu3.1"]},{"title":"gpgv","resource":"package","provider":"apt","versions":["1.4.20-1ubuntu3.1"]},{"title":"grep","resource":"package","provider":"apt","versions":["2.25-1~16.04.1"]},{"title":"gzip","resource":"package","provider":"apt","versions":["1.6-4ubuntu1"]},{"title":"hostname","resource":"package","provider":"apt","versions":["3.16ubuntu2"]},{"title":"init","resource":"package","provider":"apt","versions":["1.29ubuntu2"]},{"title":"init-system-helpers","resource":"package","provider":"apt","versions":["1.29ubuntu2"]},{"title":"initscripts","resource":"package","provider":"apt","versions":["2.88dsf-59.3ubuntu2"]},{"title":"insserv","resource":"package","provider":"apt","versions":["1.14.0-5ubuntu3"]},{"title":"libacl1","resource":"package","provider":"apt","versions":["2.2.52-3"]},{"title":"libapparmor1","resource":"package","provider":"apt","versions":["2.10.95-0ubuntu2.2"]},{"title":"libapt-pkg5.0","resource":"package","provider":"apt","versions":["1.2.12~ubuntu16.04.1"]},{"title":"libattr1","resource":"package","provider":"apt","versions":["1:2.4.47-2"]},{"title":"libaudit-common","resource":"package","provider":"apt","versions":["1:2.4.5-1ubuntu2"]},{"title":"libaudit1","resource":"package","provider":"apt","versions":["1:2.4.5-1ubuntu2"]},{"title":"libblkid1","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"libbz2-1.0","resource":"package","provider":"apt","versions":["1.0.6-8"]},{"title":"libc-bin","resource":"package","provider":"apt","versions":["2.23-0ubuntu3"]},{"title":"libc6","resource":"package","provider":"apt","versions":["2.23-0ubuntu3"]},{"title":"libcap2","resource":"package","provider":"apt","versions":["1:2.24-12"]},{"title":"libcap2-bin","resource":"package","provider":"apt","versions":["1:2.24-12"]},{"title":"libcomerr2","resource":"package","provider":"apt","versions":["1.42.13-1ubuntu1"]},{"title":"libcryptsetup4","resource":"package","provider":"apt","versions":["2:1.6.6-5ubuntu2"]},{"title":"libdb5.3","resource":"package","provider":"apt","versions":["5.3.28-11"]},{"title":"libdebconfclient0","resource":"package","provider":"apt","versions":["0.198ubuntu1"]},{"title":"libdevmapper1.02.1","resource":"package","provider":"apt","versions":["2:1.02.110-1ubuntu10"]},{"title":"libexpat1","resource":"package","provider":"apt","versions":["2.1.0-7ubuntu0.16.04.2"]},{"title":"libfdisk1","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"libgcc1","resource":"package","provider":"apt","versions":["1:6.0.1-0ubuntu1"]},{"title":"libgcrypt20","resource":"package","provider":"apt","versions":["1.6.5-2ubuntu0.2"]},{"title":"libgpg-error0","resource":"package","provider":"apt","versions":["1.21-2ubuntu1"]},{"title":"libidn11","resource":"package","provider":"apt","versions":["1.32-3ubuntu1.1"]},{"title":"libkmod2","resource":"package","provider":"apt","versions":["22-1ubuntu4"]},{"title":"liblz4-1","resource":"package","provider":"apt","versions":["0.0~r131-2ubuntu2"]},{"title":"liblzma5","resource":"package","provider":"apt","versions":["5.1.1alpha+20120614-2ubuntu2"]},{"title":"libmagic1","resource":"package","provider":"apt","versions":["1:5.25-2ubuntu1"]},{"title":"libmount1","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"libmpdec2","resource":"package","provider":"apt","versions":["2.4.2-1"]},{"title":"libncurses5","resource":"package","provider":"apt","versions":["6.0+20160213-1ubuntu1"]},{"title":"libncursesw5","resource":"package","provider":"apt","versions":["6.0+20160213-1ubuntu1"]},{"title":"libpam-modules","resource":"package","provider":"apt","versions":["1.1.8-3.2ubuntu2"]},{"title":"libpam-modules-bin","resource":"package","provider":"apt","versions":["1.1.8-3.2ubuntu2"]},{"title":"libpam-runtime","resource":"package","provider":"apt","versions":["1.1.8-3.2ubuntu2"]},{"title":"libpam0g","resource":"package","provider":"apt","versions":["1.1.8-3.2ubuntu2"]},{"title":"libpcre3","resource":"package","provider":"apt","versions":["2:8.38-3.1"]},{"title":"libprocps4","resource":"package","provider":"apt","versions":["2:3.3.10-4ubuntu2"]},{"title":"libpython3-stdlib","resource":"package","provider":"apt","versions":["3.5.1-3"]},{"title":"libpython3.5-minimal","resource":"package","provider":"apt","versions":["3.5.2-2~16.01"]},{"title":"libpython3.5-stdlib","resource":"package","provider":"apt","versions":["3.5.2-2~16.01"]},{"title":"libreadline6","resource":"package","provider":"apt","versions":["6.3-8ubuntu2"]},{"title":"libseccomp2","resource":"package","provider":"apt","versions":["2.2.3-3ubuntu3"]},{"title":"libselinux1","resource":"package","provider":"apt","versions":["2.4-3build2"]},{"title":"libsemanage-common","resource":"package","provider":"apt","versions":["2.3-1build3"]},{"title":"libsemanage1","resource":"package","provider":"apt","versions":["2.3-1build3"]},{"title":"libsepol1","resource":"package","provider":"apt","versions":["2.4-2"]},{"title":"libsmartcols1","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"libsqlite3-0","resource":"package","provider":"apt","versions":["3.11.0-1ubuntu1"]},{"title":"libss2","resource":"package","provider":"apt","versions":["1.42.13-1ubuntu1"]},{"title":"libssl1.0.0","resource":"package","provider":"apt","versions":["1.0.2g-1ubuntu4.2"]},{"title":"libstdc++6","resource":"package","provider":"apt","versions":["5.4.0-6ubuntu1~16.04.2"]},{"title":"libsystemd0","resource":"package","provider":"apt","versions":["229-4ubuntu7"]},{"title":"libtinfo5","resource":"package","provider":"apt","versions":["6.0+20160213-1ubuntu1"]},{"title":"libudev1","resource":"package","provider":"apt","versions":["229-4ubuntu7"]},{"title":"libusb-0.1-4","resource":"package","provider":"apt","versions":["2:0.1.12-28"]},{"title":"libustr-1.0-1","resource":"package","provider":"apt","versions":["1.0.4-5"]},{"title":"libuuid1","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"locales","resource":"package","provider":"apt","versions":["2.23-0ubuntu3"]},{"title":"login","resource":"package","provider":"apt","versions":["1:4.2-3.1ubuntu5"]},{"title":"lsb-base","resource":"package","provider":"apt","versions":["9.20160110ubuntu0.2"]},{"title":"lsb-release","resource":"package","provider":"apt","versions":["9.20160110ubuntu0.2"]},{"title":"makedev","resource":"package","provider":"apt","versions":["2.3.1-93ubuntu1"]},{"title":"mawk","resource":"package","provider":"apt","versions":["1.3.3-17ubuntu2"]},{"title":"mime-support","resource":"package","provider":"apt","versions":["3.59ubuntu1"]},{"title":"mount","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"multiarch-support","resource":"package","provider":"apt","versions":["2.23-0ubuntu3"]},{"title":"ncurses-base","resource":"package","provider":"apt","versions":["6.0+20160213-1ubuntu1"]},{"title":"ncurses-bin","resource":"package","provider":"apt","versions":["6.0+20160213-1ubuntu1"]},{"title":"openssl","resource":"package","provider":"apt","versions":["1.0.2g-1ubuntu4.2"]},{"title":"passwd","resource":"package","provider":"apt","versions":["1:4.2-3.1ubuntu5"]},{"title":"perl-base","resource":"package","provider":"apt","versions":["5.22.1-9"]},{"title":"procps","resource":"package","provider":"apt","versions":["2:3.3.10-4ubuntu2"]},{"title":"puppet-agent","resource":"package","provider":"apt","versions":["1.6.2-1xenial"]},{"title":"puppetlabs-release-pc1","resource":"package","provider":"apt","versions":["1.1.0-2xenial"]},{"title":"python3","resource":"package","provider":"apt","versions":["3.5.1-3"]},{"title":"python3-minimal","resource":"package","provider":"apt","versions":["3.5.1-3"]},{"title":"python3.5","resource":"package","provider":"apt","versions":["3.5.2-2~16.01"]},{"title":"python3.5-minimal","resource":"package","provider":"apt","versions":["3.5.2-2~16.01"]},{"title":"readline-common","resource":"package","provider":"apt","versions":["6.3-8ubuntu2"]},{"title":"sed","resource":"package","provider":"apt","versions":["4.2.2-7"]},{"title":"sensible-utils","resource":"package","provider":"apt","versions":["0.0.9"]},{"title":"systemd","resource":"package","provider":"apt","versions":["229-4ubuntu7"]},{"title":"systemd-sysv","resource":"package","provider":"apt","versions":["229-4ubuntu7"]},{"title":"sysv-rc","resource":"package","provider":"apt","versions":["2.88dsf-59.3ubuntu2"]},{"title":"sysvinit-utils","resource":"package","provider":"apt","versions":["2.88dsf-59.3ubuntu2"]},{"title":"tar","resource":"package","provider":"apt","versions":["1.28-2.1"]},{"title":"tzdata","resource":"package","provider":"apt","versions":["2016f-0ubuntu0.16.04"]},{"title":"ubuntu-keyring","resource":"package","provider":"apt","versions":["2012.05.19"]},{"title":"util-linux","resource":"package","provider":"apt","versions":["2.27.1-6ubuntu3.1"]},{"title":"wget","resource":"package","provider":"apt","versions":["1.17.1-1ubuntu1"]},{"title":"zlib1g","resource":"package","provider":"apt","versions":["1:1.2.8.dfsg-2ubuntu4"]},{"title":"bigdecimal","resource":"package","provider":"gem","versions":["1.2.4"]},{"title":"deep_merge","resource":"package","provider":"gem","versions":["1.0.1"]},{"title":"facter","resource":"package","provider":"gem","versions":["3.4.1"]},{"title":"hiera","resource":"package","provider":"gem","versions":["3.2.1"]},{"title":"hocon","resource":"package","provider":"gem","versions":["0.9.3"]},{"title":"io-console","resource":"package","provider":"gem","versions":["0.4.3"]},{"title":"json","resource":"package","provider":"gem","versions":["1.8.1"]},{"title":"minitest","resource":"package","provider":"gem","versions":["4.7.5"]},{"title":"net-ssh","resource":"package","provider":"gem","versions":["2.9.2"]},{"title":"psych","resource":"package","provider":"gem","versions":["2.0.5"]},{"title":"puppet","resource":"package","provider":"gem","versions":["4.6.2"]},{"title":"rake","resource":"package","provider":"gem","versions":["10.1.0"]},{"title":"rdoc","resource":"package","provider":"gem","versions":["4.1.0"]},{"title":"semantic_puppet","resource":"package","provider":"gem","versions":["0.1.2"]},{"title":"stomp","resource":"package","provider":"gem","versions":["1.3.3"]},{"title":"test-unit","resource":"package","provider":"gem","versions":["2.1.9.0"]},{"title":"rc","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"urandom","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"mountall.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"killprocs","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"hwclock.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"mountkernfs.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"mountnfs.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"sendsigs","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"umountnfs.sh","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"mountdevsubfs.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"umountroot","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"rc.local","resource":"service","ensure":"running","enable":"true","provider":"debian"},{"title":"hostname.sh","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"ondemand","resource":"service","ensure":"stopped","enable":"true","provider":"debian"},{"title":"mountnfs-bootclean.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"checkroot-bootclean.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"checkfs.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"bootmisc.sh","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"checkroot.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"procps","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"umountfs","resource":"service","ensure":"running","enable":"false","provider":"debian"},{"title":"mountall-bootclean.sh","resource":"service","ensure":"stopped","enable":"false","provider":"debian"},{"title":"root","resource":"user","uid":0,"gid":0,"groups":[],"home":"/root","shell":"/bin/bash","comment":"root"},{"title":"daemon","resource":"user","uid":1,"gid":1,"groups":[],"home":"/usr/sbin","shell":"/usr/sbin/nologin","comment":"daemon"},{"title":"bin","resource":"user","uid":2,"gid":2,"groups":[],"home":"/bin","shell":"/usr/sbin/nologin","comment":"bin"},{"title":"sys","resource":"user","uid":3,"gid":3,"groups":[],"home":"/dev","shell":"/usr/sbin/nologin","comment":"sys"},{"title":"sync","resource":"user","uid":4,"gid":65534,"groups":[],"home":"/bin","shell":"/bin/sync","comment":"sync"},{"title":"games","resource":"user","uid":5,"gid":60,"groups":[],"home":"/usr/games","shell":"/usr/sbin/nologin","comment":"games"},{"title":"man","resource":"user","uid":6,"gid":12,"groups":[],"home":"/var/cache/man","shell":"/usr/sbin/nologin","comment":"man"},{"title":"lp","resource":"user","uid":7,"gid":7,"groups":[],"home":"/var/spool/lpd","shell":"/usr/sbin/nologin","comment":"lp"},{"title":"mail","resource":"user","uid":8,"gid":8,"groups":[],"home":"/var/mail","shell":"/usr/sbin/nologin","comment":"mail"},{"title":"news","resource":"user","uid":9,"gid":9,"groups":[],"home":"/var/spool/news","shell":"/usr/sbin/nologin","comment":"news"},{"title":"uucp","resource":"user","uid":10,"gid":10,"groups":[],"home":"/var/spool/uucp","shell":"/usr/sbin/nologin","comment":"uucp"},{"title":"proxy","resource":"user","uid":13,"gid":13,"groups":[],"home":"/bin","shell":"/usr/sbin/nologin","comment":"proxy"},{"title":"www-data","resource":"user","uid":33,"gid":33,"groups":[],"home":"/var/www","shell":"/usr/sbin/nologin","comment":"www-data"},{"title":"backup","resource":"user","uid":34,"gid":34,"groups":[],"home":"/var/backups","shell":"/usr/sbin/nologin","comment":"backup"},{"title":"list","resource":"user","uid":38,"gid":38,"groups":[],"home":"/var/list","shell":"/usr/sbin/nologin","comment":"Mailing List Manager"},{"title":"irc","resource":"user","uid":39,"gid":39,"groups":[],"home":"/var/run/ircd","shell":"/usr/sbin/nologin","comment":"ircd"},{"title":"gnats","resource":"user","uid":41,"gid":41,"groups":[],"home":"/var/lib/gnats","shell":"/usr/sbin/nologin","comment":"Gnats Bug-Reporting System (admin)"},{"title":"nobody","resource":"user","uid":65534,"gid":65534,"groups":[],"home":"/nonexistent","shell":"/usr/sbin/nologin","comment":"nobody"},{"title":"systemd-timesync","resource":"user","uid":100,"gid":102,"groups":[],"home":"/run/systemd","shell":"/bin/false","comment":"systemd Time Synchronization,,,"},{"title":"systemd-network","resource":"user","uid":101,"gid":103,"groups":[],"home":"/run/systemd/netif","shell":"/bin/false","comment":"systemd Network Management,,,"},{"title":"systemd-resolve","resource":"user","uid":102,"gid":104,"groups":[],"home":"/run/systemd/resolve","shell":"/bin/false","comment":"systemd Resolver,,,"},{"title":"systemd-bus-proxy","resource":"user","uid":103,"gid":105,"groups":[],"home":"/run/systemd","shell":"/bin/false","comment":"systemd Bus Proxy,,,"},{"title":"_apt","resource":"user","uid":104,"gid":65534,"groups":[],"home":"/nonexistent","shell":"/bin/false","comment":""}]} 2 | -------------------------------------------------------------------------------- /lib/puppet/application/inventory.rb: -------------------------------------------------------------------------------- 1 | require 'puppet/application/face_base' 2 | 3 | class Puppet::Application::Inventory < Puppet::Application::FaceBase 4 | end 5 | -------------------------------------------------------------------------------- /lib/puppet/face/inventory.rb: -------------------------------------------------------------------------------- 1 | require 'puppet/face' 2 | require 'puppet_x/puppetlabs/inventory' 3 | require 'puppet_x/puppetlabs/facts_inventory' 4 | 5 | Puppet::Face.define(:inventory, '0.1.0') do # rubocop:disable Metrics/BlockLength 6 | summary 'Use Puppet as a way to inventory systems' 7 | option '--ignore-facts STRING' do 8 | summary 'A comma separated list of top level facts to ignore' 9 | default_to { '' } 10 | end 11 | 12 | action(:resources) do 13 | summary 'Discover resources (including packages, services, users and groups)' 14 | when_invoked do |*_options| 15 | inventory = PuppetX::Puppetlabs::Inventory.new 16 | inventory.generate 17 | end 18 | when_rendering :console do |return_value| 19 | JSON.pretty_generate(return_value) 20 | end 21 | end 22 | 23 | action(:all) do 24 | default 25 | summary 'Discover resources (including packages, services, users and groups) along with facts about the system' 26 | when_invoked do |*options| 27 | args = options.pop 28 | inventory = PuppetX::Puppetlabs::Inventory.new 29 | facts = PuppetX::Puppetlabs::FactsInventory.new(ignore: args[:ignore_facts].split(',')) 30 | { 31 | schema_version: 1, 32 | created: Time.now.utc.iso8601, 33 | resources: inventory.generate, 34 | facts: facts.generate 35 | } 36 | end 37 | when_rendering :console do |return_value| 38 | JSON.pretty_generate(return_value) 39 | end 40 | end 41 | 42 | action(:facts) do 43 | summary 'Discover facts about the system' 44 | when_invoked do |*options| 45 | args = options.pop 46 | facts = PuppetX::Puppetlabs::FactsInventory.new(ignore: args[:ignore_facts].split(',')) 47 | facts.generate 48 | end 49 | when_rendering :console do |return_value| 50 | JSON.pretty_generate(return_value) 51 | end 52 | end 53 | 54 | action(:catalog) do 55 | summary 'Generate a Puppet catalog for the system' 56 | when_invoked do |*_options| 57 | inventory = PuppetX::Puppetlabs::Inventory.new 58 | inventory.catalog.to_data_hash 59 | end 60 | when_rendering :console do |return_value| 61 | JSON.pretty_generate(return_value) 62 | end 63 | end 64 | 65 | action(:report) do 66 | summary 'Generate a Puppet report for the system' 67 | when_invoked do |*_options| 68 | inventory = PuppetX::Puppetlabs::Inventory.new(with_resources: false) 69 | report = Puppet::Transaction::Report.new('inventory') 70 | inventory.catalog.apply(report: report) 71 | report.finalize_report 72 | report.to_data_hash 73 | end 74 | when_rendering :console do |return_value| 75 | JSON.pretty_generate(return_value) 76 | end 77 | end 78 | end 79 | -------------------------------------------------------------------------------- /lib/puppet_x/puppetlabs/facts_inventory.rb: -------------------------------------------------------------------------------- 1 | require 'facter' 2 | 3 | module PuppetX 4 | module Puppetlabs 5 | class FactsInventory 6 | def initialize(ignore: []) 7 | @ignore_facts = ignore 8 | end 9 | 10 | def generate 11 | post_process(Facter.to_hash) 12 | end 13 | 14 | private 15 | 16 | def post_process(facts) 17 | @ignore_facts.each do |ignore| 18 | facts = facts.tap { |inner| inner.delete(ignore) } 19 | end 20 | facts 21 | end 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /lib/puppet_x/puppetlabs/inventory.rb: -------------------------------------------------------------------------------- 1 | module PuppetX 2 | module Puppetlabs 3 | class Inventory 4 | REQUIRED_TYPES = %i[group package service user lumogon].freeze 5 | 6 | attr_accessor :catalog 7 | 8 | def initialize(with_resources: true) 9 | Puppet::Type.loadall 10 | Puppet.initialize_facts 11 | 12 | @catalog = Puppet::Resource::Catalog.new 13 | Puppet::Type.eachtype do |type_class| 14 | if REQUIRED_TYPES.include?(type_class.name) 15 | begin 16 | type_class.instances.each do |i| 17 | i = i.to_resource if with_resources 18 | catalog.add_resource(i) 19 | end 20 | rescue StandardError # rubocop:disable Lint/HandleExceptions 21 | # Individual types should be able to fail without the 22 | # whole run failing. 23 | end 24 | end 25 | end 26 | end 27 | 28 | def generate 29 | format_resources(@catalog.vertices).flatten 30 | end 31 | 32 | private 33 | 34 | def nil_or_absent?(thing) 35 | thing.nil? || thing == :absent 36 | end 37 | 38 | def format_resources(array) 39 | array.map do |hash| # rubocop:disable Metrics/BlockLength 40 | case hash.type 41 | when 'Package' 42 | { 43 | title: hash.title.to_s, 44 | resource: hash.type.downcase, 45 | provider: hash[:provider], 46 | versions: Array(hash[:ensure]).map(&:to_s) 47 | } 48 | when 'User' 49 | { 50 | title: hash.title.to_s, 51 | resource: hash.type.downcase, 52 | uid: hash[:uid], 53 | gid: hash[:gid], 54 | groups: hash[:groups], 55 | home: hash[:home], 56 | shell: hash[:shell], 57 | comment: hash[:comment] 58 | } 59 | when 'Group' 60 | { 61 | title: hash.title.to_s, 62 | resource: hash.type.downcase, 63 | gid: hash[:gid] 64 | } 65 | when 'Service' 66 | { 67 | title: hash.title.to_s, 68 | resource: hash.type.downcase, 69 | ensure: hash[:ensure], 70 | enable: hash[:enable], 71 | provider: hash[:provider] 72 | } 73 | when 'Lumogon' 74 | response = { 75 | title: hash.title.to_s, 76 | resource: 'container', 77 | hostname: hash[:hostname], 78 | id: hash[:id], 79 | os: hash[:os], 80 | platform: hash[:platform], 81 | platformfamily: hash[:platformfamily], 82 | platformversion: hash[:platformversion] 83 | } 84 | %i[dpkg rpm apk labels].each do |capability| 85 | response[capability] = hash[capability] unless nil_or_absent?(hash[capability]) 86 | end 87 | response 88 | end 89 | end 90 | end 91 | end 92 | end 93 | end 94 | -------------------------------------------------------------------------------- /metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppetlabs-inventory", 3 | "version": "0.5.0", 4 | "author": "Gareth Rushgrove", 5 | "summary": "Provides a Puppet face for dumping an inventory of a node", 6 | "license": "Apache-2.0", 7 | "source": "https://github.com/puppetlabs/puppetlabs-inventory.git", 8 | "project_page": "https://github.com/puppetlabs/puppetlabs-inventory", 9 | "issues_url": "https://github.com/puppetlabs/puppetlabs-inventory/issues", 10 | "dependencies": [ 11 | {"name":"puppetlabs/lumogon", "version_requirement":">= 0.4.0 < 1.0.0"} 12 | ], 13 | "data_provider": null 14 | } 15 | -------------------------------------------------------------------------------- /spec/acceptance/inventory_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper_acceptance' 2 | 3 | describe command('puppet inventory all') do 4 | its(:exit_status) { is_expected.to eq 0 } 5 | its(:stdout) { is_expected.to match %r{"virtual": "docker"} } 6 | its(:stdout) { is_expected.to match %r{"resource": "package"} } 7 | end 8 | 9 | describe command('puppet inventory facts') do 10 | its(:exit_status) { is_expected.to eq 0 } 11 | its(:stdout) { is_expected.to match %r{"virtual": "docker"} } 12 | end 13 | 14 | describe command('puppet inventory resources') do 15 | its(:exit_status) { is_expected.to eq 0 } 16 | its(:stdout) { is_expected.to match %r{"resource": "package"} } 17 | end 18 | 19 | describe command('puppet inventory catalog') do 20 | its(:exit_status) { is_expected.to eq 0 } 21 | end 22 | 23 | describe command('puppet inventory report') do 24 | its(:exit_status) { is_expected.to eq 0 } 25 | end 26 | -------------------------------------------------------------------------------- /spec/acceptance/nodesets/centos-7.yml: -------------------------------------------------------------------------------- 1 | HOSTS: 2 | centos-7-x64: 3 | platform: el-7-x86_64 4 | hypervisor : docker 5 | image: centos:7 6 | docker_preserve_image: true 7 | docker_cmd: '["/usr/sbin/init"]' 8 | docker_image_commands: 9 | - 'yum install -y crontabs tar wget openssl' 10 | CONFIG: 11 | log_level: debug 12 | trace_limit: 200 13 | -------------------------------------------------------------------------------- /spec/acceptance/nodesets/default.yml: -------------------------------------------------------------------------------- 1 | HOSTS: 2 | centos-7-x64: 3 | platform: el-7-x86_64 4 | hypervisor : docker 5 | image: centos:7 6 | docker_preserve_image: true 7 | docker_cmd: '["/usr/sbin/init"]' 8 | docker_image_commands: 9 | - 'yum install -y crontabs tar wget openssl' 10 | CONFIG: 11 | log_level: debug 12 | trace_limit: 200 13 | -------------------------------------------------------------------------------- /spec/acceptance/nodesets/ubuntu-14.04.yml: -------------------------------------------------------------------------------- 1 | HOSTS: 2 | ubuntu-1404-x64: 3 | platform: ubuntu-14.04-amd64 4 | hypervisor: docker 5 | image: ubuntu:14.04 6 | docker_preserve_image: true 7 | docker_cmd: '["/sbin/init"]' 8 | docker_image_commands: 9 | # ensure that upstart is booting correctly in the container 10 | - 'rm /usr/sbin/policy-rc.d && rm /sbin/initctl && dpkg-divert --rename --remove /sbin/initctl && apt-get update && apt-get install -y net-tools wget && locale-gen en_US.UTF-8' 11 | CONFIG: 12 | trace_limit: 200 13 | -------------------------------------------------------------------------------- /spec/acceptance/nodesets/ubuntu-16.04.yml: -------------------------------------------------------------------------------- 1 | HOSTS: 2 | ubuntu-1604-x64: 3 | platform: ubuntu-16.04-amd64 4 | hypervisor : docker 5 | image: ubuntu:16.04 6 | docker_preserve_image: true 7 | docker_cmd: '["/sbin/init"]' 8 | docker_image_commands: 9 | - 'rm /usr/sbin/policy-rc.d' 10 | - 'rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl' 11 | - 'apt-get install -y net-tools wget' 12 | - 'locale-gen en_US.UTF-8' 13 | CONFIG: 14 | log_level: debug 15 | trace_limit: 200 16 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'puppetlabs_spec_helper/module_spec_helper' 2 | require 'simplecov' 3 | require 'simplecov-console' 4 | 5 | SimpleCov.start do 6 | add_filter '/spec' 7 | formatter SimpleCov::Formatter::MultiFormatter.new([ 8 | SimpleCov::Formatter::HTMLFormatter, 9 | SimpleCov::Formatter::Console 10 | ]) 11 | end 12 | 13 | RSpec.configure do |config| 14 | config.mock_with :rspec 15 | end 16 | -------------------------------------------------------------------------------- /spec/spec_helper_acceptance.rb: -------------------------------------------------------------------------------- 1 | require 'beaker-rspec/spec_helper' 2 | require 'beaker-rspec/helpers/serverspec' 3 | require 'beaker/puppet_install_helper' 4 | require 'beaker_spec_helper' 5 | 6 | include BeakerSpecHelper 7 | 8 | # automatically load any shared examples or contexts 9 | Dir['./spec/support/**/*.rb'].sort.each { |f| require f } 10 | 11 | ENV['PUPPET_INSTALL_TYPE'] = ENV['PUPPET_INSTALL_TYPE'] || 'agent' 12 | run_puppet_install_helper unless ENV['BEAKER_provision'] == 'no' 13 | 14 | RSpec.configure do |c| 15 | proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..')) 16 | module_name = proj_root.split('-').last 17 | c.formatter = :documentation 18 | c.before :suite do 19 | puppet_module_install(source: proj_root, module_name: module_name) 20 | hosts.each do |host| 21 | BeakerSpecHelper.spec_prep(host) 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/unit/facts_inventory_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'puppet_x/puppetlabs/facts_inventory' 3 | 4 | describe PuppetX::Puppetlabs::FactsInventory do # rubocop:disable Metrics/BlockLength 5 | before(:all) { @facts = %w[timezone uptime_days] } 6 | 7 | context 'with no arguments' do 8 | before(:all) do 9 | @inventory = described_class.new 10 | @data = @inventory.generate 11 | end 12 | it 'returns a hash of facts' do 13 | expect(@data).to be_a(Hash) 14 | end 15 | it 'has some default facts' do 16 | @facts.each do |fact| 17 | expect(@data.key?(fact)).to be_truthy 18 | end 19 | end 20 | end 21 | 22 | context 'with some ignored facts' do 23 | before(:all) do 24 | @inventory = described_class.new(ignore: @facts) 25 | @data = @inventory.generate 26 | end 27 | it 'returns a hash of facts' do 28 | expect(@data).to be_a(Hash) 29 | end 30 | it 'does not have ignored facts' do 31 | @facts.each do |fact| 32 | expect(@data.key?(fact)).to be_falsy 33 | end 34 | end 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /spec/unit/inventory_face_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'puppet/face' 3 | 4 | describe Puppet::Face[:inventory, '0.1.0'] do 5 | before(:all) do 6 | @inventory = PuppetX::Puppetlabs::Inventory.new 7 | end 8 | 9 | it 'has a default action of all' do 10 | expect(subject.get_action('all')).to be_default 11 | end 12 | 13 | it 'by default does not ignore any facts' do 14 | expect(subject.get_option('ignore_facts').default).to eq('') 15 | end 16 | 17 | it { subject.summary.is_a?(String) } 18 | %i[all facts resources catalog].each do |subcommand| 19 | describe "##{subcommand}" do 20 | it 'runs without error' do 21 | allow(PuppetX::Puppetlabs::Inventory).to receive(:new).and_return(@inventory) 22 | expect do 23 | subject.send(subcommand) 24 | end.not_to raise_error 25 | end 26 | 27 | it { is_expected.to respond_to subcommand } 28 | it { is_expected.to be_action subcommand } 29 | end 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /spec/unit/inventory_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'puppet_x/puppetlabs/inventory' 3 | 4 | describe PuppetX::Puppetlabs::Inventory do # rubocop:disable Metrics/BlockLength 5 | before(:all) do 6 | @inventory = described_class.new 7 | @data = @inventory.generate 8 | end 9 | 10 | it 'sets up Puppet' do 11 | expect(Puppet).to receive(:initialize_facts).and_call_original 12 | expect(Puppet::Type).to receive(:loadall).and_call_original 13 | described_class.new 14 | end 15 | 16 | context '#catalog' do 17 | it 'returns a Catalog object' do 18 | expect(@inventory.catalog).to be_a(Puppet::Resource::Catalog) 19 | end 20 | end 21 | 22 | context '#generate' do 23 | it 'returns an array of resources' do 24 | expect(@data).to be_a(Array) 25 | end 26 | 27 | %w[group].each do |resource_name| 28 | it "collects #{resource_name} resources" do 29 | expect(@data.count { |resource| resource[:resource] == resource_name }).to be > 0 30 | end 31 | end 32 | 33 | %w[package service user].each do |resource_name| 34 | it "collects #{resource_name} resources" do 35 | skip 'Skipping as too dependent on system on which tests are run' 36 | end 37 | end 38 | end 39 | end 40 | --------------------------------------------------------------------------------