puppet camp paris 2016 data in modules

43
Copyright example42 GmbH - 2016 Puppet 4 - Data in Modules PuppetCamp Paris 2016 Martin Alfke - [email protected] Image: Tatlin - tatlin.net Copyright example42 GmbH - 2016

Upload: martin-alfke

Post on 15-Jan-2017

301 views

Category:

Internet


4 download

TRANSCRIPT

Page 1: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Puppet 4 - Data in ModulesPuppetCamp Paris 2016

Martin Alfke - [email protected]

Image: Tatlin - tatlin.net

Copyright example42 GmbH - 2016

Page 2: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Martin Alfke!Berlin/Germany !CEO example42 GmbH Freelance Puppet Expert Network !Puppet since 2007 !Puppet Trainer, Consultant !Co-Author of “Puppet 4 Essentials”

Page 3: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Puppet 4 Data in Modules

• Separation of Code and Data

• Data in Modules

• Lookup Priority

• Data in Component Modules

• Data in Environments

Page 4: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

Image: Tatlin - tatlin.net

Page 5: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• data in code class my_ntp {!!if $::environment == ‘dev’ {! $ntp_server = [‘pool.ntp.org’]! } else {! if $::facts[‘fqdn’] == ‘ntp1.example42.com’ {!# switch back to ntp1 when issue is solved! $ntp_server = [‘ntp2.example42.com’]! } else {! $ntp_server = [‘127.0.0.1’]! }!}!

Page 6: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• explicit lookup

• hiera(‘key’[, ‘default’][, ‘override hierarchy’])

Page 7: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• implicit lookup class my_ntp (!!Array $ntp_server,!) {!!# …!}!!contain my_ntp!!# hiera data!my_ntp::ntp_server:! - ‘pool.ntp.org’!

Page 8: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• hiera.yaml # version 1!:backends:! - yaml!:yaml:! :datadir: “/etc/puppetlabs/code/environments/%{environment}/hieradata”!:hierarchy:! - “nodes/%{::trusted.certname}”! - “os/%{::facts[‘os’][‘osfamily’]}”! - common!

Page 9: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• hieradata os/Debian.yaml apache::pkgname:! - ‘apache2’! - ‘apache2-ssl’!!os/RedHat.yaml apache::pkgname:! - ‘httpd’!!common.yaml apache::purge_configs: true!

Page 10: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• hieradata os/FreeBSD.yaml apache::pkgname:! - ‘apache’!

Page 11: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Separation of Code and Data

• puppet code # apache/manifests/params.pp class apache::params {! case $::operatingsystem {! ‘Debian’: { # … }! ‘RedHat’: { # … }! default: {! fail(‘OS not supported’)! }! }!}!

Page 12: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data in Modules

Image: Tatlin - tatlin.net

Page 13: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Lookup Priority

Image: Tatlin - tatlin.net

Page 14: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Lookup Priority• Hiera -> Global Overrides

!

!

!

Page 15: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Lookup Priority• Hiera -> Global Overrides

!

• Environment Data -> Core Puppet Lookup

!

Page 16: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Lookup Priority• Hiera -> Global Overrides

!

• Environment Data -> Core Puppet Lookup

!

• Module Data -> Defaults

Page 17: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Lookup Functions• Explicit lookup: lookup(‘key’)!

!

• CLI lookup: puppet lookup ‘key’

!

• Automatic lookup: ‘<namespace>::<key>’

Page 18: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Lookup Functions• lookup(‘key’, <Type>, <merge_behavior>, <default>)!

• e.g. lookup(‘ntp_servers’, Array)

• Merge behavior:

• first!

• unique (array merge)!

• hash!

• deep!

Page 19: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Configuration

• Global Environment Provider: puppet.conf

• environment_data_provider = <data provider>!

!

!

!

Page 20: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Configuration

• Global Environment Provider: puppet.conf

• environment_data_provider = <data provider>!

• Environment Provider: environment.conf

• environment_data_provider = <data provider>!

!

Page 21: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Configuration

• Global Environment Provider: puppet.conf

• environment_data_provider = <data provider>!

• Environment Provider: environment.conf

• environment_data_provider = <data provider>!

• Module Provider: metadata.json

• “data_provider”: “<data provider>”

Page 22: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider

• none -> standard hiera lookup

!

• hiera -> hiera lookup (hiera v4)

!

• function -> data function lookup

Page 23: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Hiera

• replace hiera, hiera_array, hiera_hash with ‘lookup’

• needs hiera.yaml v4 configuration file

• set data_provider to ‘hiera’ in puppet.conf, environment.conf or metadata.json

• modify global hiera.yaml to use datadir outside environment

Page 24: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Hiera

# /etc/puppetlabs/code/environments/production/hiera.yaml # /etc/puppetlabs/code/environments/production/modules/<module>/hiera.yaml # - - -!version: 4!datadir: hieradata!hierarchy:! - name: “Nodes”! backend: yaml! path: “nodes/%{trusted.certname}”! - name: “OS”! backend: json! path: “os/%{facts.os.family}”! - name: “common”! backend: yaml

Page 25: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Function

• write data function

• Puppet 4 Function

• <module>/functions/<module>/data.pp

• <env>/functions/<env>/data.pp

• set data_provider to function in puppet.conf, environment.conf or metadata.json

Page 26: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Function - Puppet

# ntp/functions/ntp/data.pp function ntp::data() {! $params = {! ‘ntp::ntpservers’ => [‘pool.ntp.org’],! }! $os_params = case $facts[‘os’][‘family’] {! ‘Debian’: {! { ‘ntp::ntpackage’ => ‘ntpd’, }! },! default: {! {}! }! }! $params + $os_params!}

Page 27: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Function

• write data function

• Ruby Function (Puppet 4 function API)

• <module>/lib/puppet/functions/<module>/data.rb

• <env>/lib/puppet/functions/<env>/data.rb

• set data_provider to function in puppet.conf, environment.conf or metadata.json

Page 28: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Function - Ruby

# ntp/lib/puppet/functions/ntp/data.rb Puppet::Functions.create_function(:’ntp::data’) do! def base_data()! { ‘ntp::ntpservers’ => [‘pool.ntp.org’], }! end! def os_data()! case Facter.value(:os)[‘family’]! when ‘Debian’! { ‘ntp::pkgname’ => ‘ntpd’, }! else! {}! end! def data()! self.base_data.merge!(self.os_data)! end!end

Page 29: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data in Component Modules

Image: Tatlin - tatlin.net

Page 30: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data in Component Modules

• add data provider to metadata.json

• provide OS defaults

• remove params.pp / remove inheritance

• allow users to overwrite any data

Page 31: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data Provider Function - Ruby

# my_ntp/manifests/init.pp class my_ntp (! $server = $my_ntp::params::server,! $pkgname = $my_ntp::params::pkgname,! $secure = $my_ntp::params::secure,!) inherits my_ntp::params {! # ...!}!

Page 32: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data in Environments

Image: Tatlin - tatlin.net

Page 33: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Data in Environments

• old hiera replacement

• add hiera.yaml to environment base path

• overwrite data from modules, roles & profiles

Page 34: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Summary

Image: Tatlin - tatlin.net

Page 35: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Summary# /etc/puppetlabs/code/ ! ! hiera.yaml!! ! hieradata/!! ! environments/production/ ! ! ! ! ! ! environment.conf!! ! ! ! ! ! hiera.yaml!! ! ! ! ! ! hieradata/! modules/my_module/ ! ! ! ! ! ! ! ! ! ! metadata.json!! ! ! ! ! ! ! ! ! ! hiera.yaml!! ! ! ! ! ! ! ! ! ! hieradata/

Page 36: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Summary# /etc/puppetlabs/code/ ! ! hiera.yaml!! ! hieradata/!! ! environments/production/ ! ! ! ! ! environment.conf!! ! ! ! ! lib/functions/data.pp!! ! ! ! ! lib/puppet/functions/ \!! ! ! ! ! ! ! ! production/data.rb! modules/my_module/ ! ! ! ! ! ! !! ! metadata.json!! ! ! ! ! ! ! ! lib/functions/data.pp!! ! ! ! ! ! ! ! lib/puppet/functions/ \!! ! ! ! ! ! ! ! ! ! ! my_module/data.rb

Page 37: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Summary - Pro

• Per hierarchy Hiera Data backend possible

• Data Function lookups without need for hiera backend (e.g. Cloud Management API data)

• No more inheritance required

Page 38: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Summary - Con

• No single Source of Authority?

• Debugging can be complex when iterating over many data providers and hierarchies

Page 39: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Module Developers

• switch to data in modules

• give users the possibility to provide own data

• allow users to overwrite any data

• allow users to know their data for missing OS support

Page 40: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Module Users• switch to hieradata in modules

then

• switch to data in environments

• keep data simple and readable

• don’t overcomplicate !

Page 41: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Module Users• hieradata

common.yaml my_ntp: ‘pool.ntp.org’!apache::default_mods: false!apache::purge_configs: true!mysql::remove_default_accounts: true!mysql::root_password: ‘puppet’!oradb::database::version: ’12.1’!oradb::shout: ‘MISSING DATA’

Page 42: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

References

• http://docs.puppetlabs.com/puppet/4.3/reference/lookup_quick.html

• http://docs.puppetlabs.com/puppet/4.3/reference/lookup_quick_module.html

• http://puppet-on-the-edge.blogspot.de/2015/01/puppet-40-data-in-modules-and.html

Page 43: Puppet Camp Paris 2016 Data in Modules

Copyright example42 GmbH - 2016

Puppet 4 - Data in modulesPuppetCamp Paris 2016

Martin Alfke - [email protected]

Image: Tatlin - tatlin.net

Copyright example42 GmbH - 2016