Top Banner
R.I.Pienaar PuppetConf 2016 External Data in Puppet 4
41

PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

Jan 10, 2017

Download

Technology

Puppet
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar

PuppetConf 2016

External Data in Puppet 4

Page 2: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Who am I?

• Puppet User since 0.22

• Really into external data

• Author facts.d, extlookup, Hiera, MCollective

• Consultant - DevOps, Automation, Architect, Development

• Open Source @ github.com/ripienaar

• Volcane on IRC

Page 3: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

External DataIs Configuration For

Your Code

Page 4: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Hierarchical Data

class monitor ( Array[Monitor::Plugin] $plugins = [] ) { … }

Page 5: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Hierarchical Data

class{“monitor”: plugins => [ “cpu", “write_graphite”, “df”, … ] }

Page 6: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Automatic Param Lookup

include monitor

# hieradb/nodes/host1.yaml monitor::plugins: - my_app

class{“monitor”: plugins => [ “my_app”, “cpu”, “df”, … ] }

+

=

Page 7: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Hierarchical Data

host1 host2 host3 host4 host5 host6

prod stage dev

dc1 dc2

Site wide common data

Page 8: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Hierarchical Data

host1 host2 host3 host4 host5 host6

prod stage dev

dc1 dc2

Site wide common data

Page 9: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Hierarchical Data

host1 host2 host3 host4 host5 host6

prod stage dev

dc1 dc2

Site wide common data

Page 10: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Hierarchical Data

host1 host2 host3 host4 host5 host6

prod stage dev

dc1 dc2

Site wide common data

$trusted[“certname”]

$environment

$facts[“dc”]

Page 11: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Automatic Param Lookup

include monitor

# hieradb/nodes/host1.yaml monitor::plugins: - my_app

class{“monitor”: plugins => [ “my_app”, “cpu”, “df”, … ] }

+

=

Page 12: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup• lookup() function replaces hiera*()

• Automatic Param Lookup more useful

• environment and module aware

• Great CLI

• YAML/JSON out of the box, more to come

• Data compatible with Hiera, cohabits with Hiera

• Pluggable

Page 13: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - CLI

$ puppet lookup monitor::plugins —merge unique —— - my_app - write_graphite - cpu

Page 14: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

$ puppet lookup monitor::plugins —merge unique —explain Merge strategy unique … Data Provider "Nodes" Path “/etc/…/production/data/nodes/dev3.devco.net.yaml” Original path: "nodes/%{trusted.certname}" Found key: "monitor::plugins" value: [ "my_app" ] … Data Provider "common" Path “/etc/…/data/common.yaml” Original path: "common" Found key: "monitor::plugins" value: [ "cpu", "write_graphite" ] … Merged result: [ "my_app", "cpu", "write_graphite" ]

Page 15: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

$ puppet lookup monitor::plugins —merge unique —explain Merge strategy unique … Data Provider "Nodes" Path “/etc/…/production/data/nodes/dev3.devco.net.yaml” Original path: "nodes/%{trusted.certname}" Found key: "monitor::plugins" value: [ "my_app" ] … Data Provider "common" Path “/etc/…/data/common.yaml” Original path: "common" Found key: "monitor::plugins" value: [ "cpu", "write_graphite" ] … Merged result: [ "my_app", "cpu", "write_graphite" ]

Every tier

Final result

Page 16: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - Config# environments/production/hiera.yaml --- version: 4 datadir: data hierarchy: - name: "Nodes" backend: yaml path: "nodes/%{trusted.certname}"

- name: "common" backend: yaml

Page 17: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$plugins = lookup(“monitor::plugins”)

Page 18: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$plugins = lookup(“monitor::plugins”, { “value_type” => Array[Monitor::Plugin], “default_value” => [“cpu”, …]

})

Page 19: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

function monitor::params() { $result = { “monitor::plugins” => [ “cpu”, … ] } }

$plugins = lookup(“monitor::plugins”, { “default_value_hash” => monitor::params()

})

Page 20: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$servers = lookup(“monitor::plugins”, { “merge” => “first”

})

Default behaviour

Page 21: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$servers = lookup(“monitor::plugins”, { “merge” => “unique”

})

Array Merge (hiera_array())

Page 22: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$servers = lookup(“monitor::plugins”, { “merge” => “hash”

})

Shallow Hash Merge (hiera_hash())

Page 23: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$servers = lookup(“monitor::plugins”, { “merge” => “deep”,

})

Deep Hash Merge

Page 24: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

# common.yaml users::local: rip: email: “[email protected]" comment: “R.I.Pienaar” sudoer: true shell: “/bin/zsh”

Page 25: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

# nodes/dev3.devco.net users::local: rip: email: “[email protected]

Page 26: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$ puppet lookup users::local —merge deep --- rip: email: [email protected] comment: R.I.Pienaar sudoer: true shell: "/bin/zsh"

Page 27: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Automatic Param Lookup

include monitor

# hieradb/nodes/host1.yaml monitor::plugins: - my_app

class{“monitor”: plugins => [ “my_app”, “cpu”, “df”, … ] }

+

=

Page 28: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$lookup_options = { “merge” => {

“strategy” => “unique” } }

$plugins = lookup(“monitor::plugins”, $lookup_options)

Page 29: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - function

$plugins = lookup(“monitor::plugins”)

# hieradata/common.yaml lookup_options: monitor::plugins: merge: strategy: unique

Page 30: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

include monitor

# …/production/hieradata/common.yaml lookup_options: monitor::plugins: strategy: unique

monitor::plugins: - cpu

- …

class monitor ( Array[Monitor::Plugin] $plugins = [] ) {}

Lookup - function

Page 31: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Lookup - Data In Modules# modules/monitor/hiera.yaml --- version: 4 datadir: "data" hierarchy: - name: "common" backend: "yaml"

# modules/monitor/data/common.yaml lookup_options: monitor::plugins: strategy: unique

Page 32: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

include monitor

# hieradata/common.yaml monitor::plugins: - cpu

- write_graphite

Lookup - Data In Modules# hieradata/nodes/node1.yaml monitor::plugins: - my_app

Page 33: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Tips and Tricks

Page 34: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

lookup(“classes”, {“merge” => “unique”}).include

hiera_include()

Page 35: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

hiera_include()# common.yaml lookup_options: classes: merge: strategy: “deep” knockout_prefix: “-“

classes: - nagios

# nodes/node1.yaml classes: - -nagios - sensu

Page 36: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

lookup(“classes”).include

hiera_include()

# common.yaml lookup_options: classes: merge: strategy: “deep” knockout_prefix: “-“

Page 37: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

params.pp# modules/ntp/hiera.yaml --- version: 4 datadir: data hierarchy: - name: "Operating System Family" backend: yaml path: "%{facts.os.family}"

- name: "common" backend: yaml

Page 38: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

params.pp

# modules/ntp/data/AIX.yaml --- ntp::driftfile: '/etc/ntp.drift' ntp::package_name: - 'bos.net.tcp.client' ntp::restrict: - 'default nomodify notrap nopeer noquery' - '127.0.0.1' ntp::service_name: 'xntpd'

Page 39: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

params.pp

# modules/ntp/data/Debian.yaml ntp::restrict: - '-4 default kod nomodify notrap nopeer noquery' - '-6 default kod nomodify notrap nopeer noquery' - '127.0.0.1' - '::1' ntp::service_name: 'ntp' ntp::servers: - '0.debian.pool.ntp.org' - '1.debian.pool.ntp.org'

Page 40: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Future

• Hiera deprecated

• No more site wide hiera, only environment and modules

• Pluggable via functions in modules - native or ruby, much much simpler than old backends

• lookup.yaml or lookup.conf

Page 41: PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar

R.I.Pienaar | [email protected] | http://devco.net | @ripienaar

Questions?

twitter: @ripienaar

email: [email protected]

blog: www.devco.net

github: ripienaarfreenode: Volcane

slack.puppet.com: ripienaar

https://www.devco.net/