Slide 1

Slide 1 text

Puppet + Ruby DSL Mateusz Lenik

Slide 2

Slide 2 text

Kim jestem?

Slide 3

Slide 3 text

• Mateusz Lenik • @_mlen, github.com/mlen • student III roku Informatyki na PWr • użytkownik Ruby od 2010 • uczestnik GSoC 2012 @PuppetLabs

Slide 4

Slide 4 text

Czym jest Puppet?

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

• system zarządzania konfiguracją • konfiguracja jako kod • co ma być zrobione, a nie jak ma być zrobione

Slide 7

Slide 7 text

Puppet Puppet Enterprise Puppet OpenSource

Slide 8

Slide 8 text

• podstawa dla Puppet Enterprise • ponad 350 modułów + PuppetForge • konieczność własnego zarządzanie serwerem konfiguracji Puppet OpenSource

Slide 9

Slide 9 text

• Puppet OpenSource • + Support 24/7/365 • + GUI webowe Puppet Enterprise

Slide 10

Slide 10 text

• kod wykonywany na serwerze • deklaratywny • jawne zależności • template’y ERB • Puppet DSL • kod wykonywany na kliencie • deklaratywny • ukryte zależności • kiepska obsługa template’ów • CFEngine syntax Puppet vs CFEngine

Slide 11

Slide 11 text

• kod wykonywany na serwerze • deklaratywny • jawne zależności • template’y ERB • Puppet DSL • kod wykonywany na kliencie • deklaratywny • ukryte zależności • template’y ERB • It’s Ruby! Puppet vs Chef

Slide 12

Slide 12 text

Kompilacja Kod Katalog Raport Wykonanie

Slide 13

Slide 13 text

• Fakty • Zasoby • Klasy • Węzły Katalog

Slide 14

Slide 14 text

Node Puppet Master Fakty

Slide 15

Slide 15 text

Node Puppet Master Katalog

Slide 16

Slide 16 text

Node Puppet Master Raport

Slide 17

Slide 17 text

Puppet DSL

Slide 18

Slide 18 text

• język deklaratywny • projektowany pod administratorów • wystarcza w większości zastosowań

Slide 19

Slide 19 text

• nie da się w nim zrobić wszystkiego • ograniczone instrukcje sterujące • specyficzna składnia “<|| ||>”

Slide 20

Slide 20 text

Ruby DSL

Slide 21

Slide 21 text

• dodany w ~2010 • lib/puppet/dsl/*.rb • nie dodaje zbyt wiele abstrakcji

Slide 22

Slide 22 text

• gołe obiekty Puppet::Parser::* • brak części funkcjonalności • projekt GSoC 2012 – rozwój Ruby DSL

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Przykłady

Slide 25

Slide 25 text

class foo { notice("foo") } node "default" { include foo } Klasy

Slide 26

Slide 26 text

hostclass :foo do notice ["foo"] end node "default" do create_resource :class, :foo end Klasy

Slide 27

Slide 27 text

hostclass :foo do notice "foo" end node "default" do use :foo end Klasy

Slide 28

Slide 28 text

class foo ($param = "value") { notice($param) } node "default" { class { "foo": param => "foo" } } Parametry

Slide 29

Slide 29 text

hostclass :foo, :arguments => {"param" => AST::String.new(:value => "value")} do notice [scope.lookupvar("param")] end node "default" do create_resource :class, :foo, :param => "foo" end Parametry

Slide 30

Slide 30 text

hostclass :foo, :arguments => {:param => "value"} do notice params[:param] end node "default" do use :foo, :param => "foo" end Parametry

Slide 31

Slide 31 text

node "default" { Notify { message => "foo" } notify {"bar": } } Defaults

Slide 32

Slide 32 text

node "default" do scope.setdefaults(:notify, [Puppet::Parser::Resource::Param.new( :name => "message",:value => "foo" )] ) notify "bar" end Defaults

Slide 33

Slide 33 text

node "default" do Notify :message => "foo" notify "bar" end Defaults

Slide 34

Slide 34 text

Dalszy rozwój • Konwerter *.pp do *.rb • Inny DSL? (Rake vs Thor)

Slide 35

Slide 35 text

Q&A