absolute beginners guide to puppet through types - puppetconf 2014

28
Complete Beginners' Guide to Puppet - Through Types!

Upload: puppet-labs

Post on 25-Dec-2014

417 views

Category:

Technology


2 download

DESCRIPTION

Absolute Beginners Guide to Puppet Through Types - Igor Galić, Brainsware OG

TRANSCRIPT

Page 1: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

Complete Beginners' Guideto Puppet - Through Types!

Page 2: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

Guide to Puppet - Through Types!

Page 3: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

whoamiIgor Galić

igalic (gh/irc)

@hirojin (twitter)

Page 4: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

whoami

Page 5: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

how i got here🚗✈🚅

Page 6: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

how i got herec ... bash ... perl

linux ... make ... ansible

puppet

Page 7: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

how i got here

Page 8: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

why this talk exists

Page 9: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

why this talk exists

Page 10: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

dijkstra"The art of programming is the art of organizing complexity,of mastering multitude and avoiding its bastard chaos aseffectively as possible."

Page 11: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

dijkstra"Simplicity is a great virtue but it requires hard work toachieve it and education to appreciate it. And to makematters worse: complexity sells better."

Page 12: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

nooop

include 'ssh'

Page 13: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

hiera

class { 'ssh': permit_root_login => false,}

Page 14: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

include

include 'ssh'

Page 15: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

resources

igalic@levix ~ % puppet resource user igalicuser { 'igalic': ensure => 'present', comment => 'Igor Galić,,,', gid => '1000', groups => ['adm', 'cdrom', 'sudo', 'dip', 'plugdev', 'lpadmin', 'sambashare', ' home => '/home/igalic', shell => '/bin/zsh', uid => '1000',}igalic@levix ~ %

Page 16: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

differences

dsl detail types & providersnope access to the RAL yuppsub-typesbranching

impl diff platforms providers

same/same contract/impl type/provider"easy" overload $name messy

Page 17: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

defined type

define trafficserver::config::records ( $changes = [ $title ],) { include 'trafficserver'

$configfile = "${::trafficserver::sysconfdir}/records.config"

$lens = 'Trafficserver_records.lns' $context = "/files${configfile}" $incl = $configfile

augeas { "${lens}_${title}": lens => $lens, context => $context, incl => $incl, changes => $changes, notify => Exec[trafficserver-config-reload], }}

Page 18: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

symmetry

@@trafficserver_record { 'proxy.config.http.server_ports': changes => '80:ipv4 80:ipv6',}

Page 19: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

"simple" type

Puppet::Type.newtype(:trafficserver_record) do

desc 'trafficserver_record is a type to manage records.config entries'

newparam(:record, :namevar => true) do desc "record entry" end

newproperty(:value) do desc "Value of this record" end

end

Page 20: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

intermezzo

Page 21: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

"simple" provider

Puppet::Type.type(:trafficserver_record).provide(:traffic_line) do

desc 'Manage traffic server records.config entries using traffic_line command'

commands :traffic_line => 'traffic_line'

mk_resource_methods

ConfigPattern = 'proxy.(config|local|cluster).*'

def initialize(value={}) super(value) end

def name=(value) @property_hash[:name] = value end

# this method is only called when value isn't insync? def value=(value) @property_hash[:name] = resource[:name]

Page 22: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

intermezzo

Page 23: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

defined type

define git::config( $value, $section = regsubst($name, '^([^\.]+)\.([^\.]+)$','\1'), $key = regsubst($name, '^([^\.]+)\.([^\.]+)$','\2'), $user = 'root',) { exec{"git config --global ${section}.${key} '${value}'": environment => inline_template('<%= "HOME=" + ENV["HOME"] %>'), path => ['/usr/bin', '/bin', '/usr/local/bin'], user => $user, unless => "git config --global --get ${section}.${key} '${value}'", }}

Page 24: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

implementation (wrong)

exec{"git config --global ${section}.${key} '${value}'": environment => inline_template('<%= "HOME=" + ENV["HOME"] %>'), path => ['/usr/bin', '/bin', '/usr/local/bin'], user => $user, unless => "git config --global --get ${section}.${key} '${value}'",}

Page 25: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

type

Puppet::Type.newtype(:git_config) do validate do fail('it is required to pass "value"') if self[:value].nil? || self[:value].em end

newparam(:name) do desc "The default namevar" end

newparam(:user) do desc "The user for which the config will be set. Default value: root" defaultto "root" end

newparam(:section, :namevar => true) do desc "The configuration section. Example: user." end

newparam(:key, :namevar => true) do desc "The configuration key. Example: email." end

Page 26: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

implementation (correct)

Puppet::Type.type(:git_config).provide(:git_config) do

mk_resource_methods

def check_current?(value) require 'etc' user = @resource[:user] key = @resource[:key] section = @resource[:section] home = Etc.getpwnam(user)[:dir]

current = Puppet::Util::Execution.execute( "git config --global --get #{section}.#{key}", :uid => user, :failonfail => false, :custom_environment => { 'HOME' => home } ) return value == current.strip end

def update

Page 27: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

done

Page 28: Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014

referencespuppet types and providers by Dan Bode & Nan Liu

shit gary larizza says, e.g.: http://garylarizza.com/blog/2013/12/15/seriously-what-is-this-provider-doing/

<3 ADRIEN THEBO <3 Morgan Haskel <3 Ashley Penney </3Hunter Haugen <3

pry <3

https://github.com/Brainsware/puppet-trafficserver

https://github.com/puppetlabs/puppetlabs-git