# Puppet

To use this language, use the class "language-puppet".

## Comments

    #
    # Foobar
    /* Foo
    bar */

## Strings and interpolation

    'foo \'bar\' baz'
    "$foo \"bar\" ${baz}"

    @(FOOBAR) # Unquoted heredoc string
    Foo bar baz
    FOOBAR

    @("BARBAZ"/$L) # Quoted heredoc string
    	$foo bar ${baz}
    	|-BARBAZ

## Regular expressions

    if $host =~ /^www(\d+)\./ {}
    $foo = /foo
    	bar # Extended regexes can include comments
    baz/x

## Variables

    $foo
    $::foobar
    $foo::bar::baz

## Functions

    require apache
    template('apache/vhost-default.conf.erb')
    [1,20,3].filter |$value| { $value < 10 }

## All-in-one example

    file {'ntp.conf':
      path    => '/etc/ntp.conf',
      ensure  => file,
      content => template('ntp/ntp.conf'),
      owner   => 'root',
      mode    => '0644',
    }
    package {'ntp':
      ensure => installed,
      before => File['ntp.conf'],
    }
    service {'ntpd':
      ensure    => running,
      subscribe => File['ntp.conf'],
    }
    Package['ntp'] -> File['ntp.conf'] ~> Service['ntpd']

    $package_list = ['ntp', 'apache2', 'vim-nox', 'wget']
    $myhash = { key => { subkey => 'b' }}

    include ntp
    require ntp
    class {'ntp':}

    define apache::vhost ($port, $docroot, $servername = $title, $vhost_name = '*') {
      include apache
      include apache::params
      $vhost_dir = $apache::params::vhost_dir
      file { "${vhost_dir}/${servername}.conf":
          content => template('apache/vhost-default.conf.erb'),
          owner   => 'www',
          group   => 'www',
          mode    => '644',
          require => Package['httpd'],
          notify  => Service['httpd'],
      }
    }

    apache::vhost {'homepages':
      port    => 8081,
      docroot => '/var/www-testhost',
    }
    Apache::Vhost['homepages']

    node 'www1.example.com' {
      include common
      include apache
      include squid
    }
    node /^www\d+$/ {
      include common
    }

    # comment
    /* comment */

    if $is_virtual {
      warning( 'Tried to include class ntp on virtual machine; this node may be misclassified.' )
    }
    elsif $operatingsystem == 'Darwin' {
      warning( 'This NTP module does not yet work on our Mac laptops.' )
    else {
      include ntp
    }

    if $hostname =~ /^www(\d+)\./ {
      notify { "Welcome web server $1": }
    }

    case $operatingsystem {
      'Solaris':          { include role::solaris }
      'RedHat', 'CentOS': { include role::redhat  }
      /^(Debian|Ubuntu)$/:{ include role::debian  }
      default:            { include role::generic }
    }
    $rootgroup = $osfamily ? {
        'Solaris'          => 'wheel',
        /(Darwin|FreeBSD)/ => 'wheel',
        default            => 'root',
    }

    User <| groups == 'admin' |>
    Concat::Fragment <<| tag == "bacula-storage-dir-${bacula_director}" |>>

    Exec <| title == 'update_migrations' |> {
      environment => 'RUBYLIB=/usr/lib/ruby/site_ruby/1.8/',
    }

    @user {'deploy':
      uid     => 2004,
      comment => 'Deployment User',
      group   => www-data,
      groups  => ["enterprise"],
      tag     => [deploy, web],
    }

    @@nagios_service { "check_zfs${hostname}":
      use                 => 'generic-service',
      host_name           => "$fqdn",
      check_command       => 'check_nrpe_1arg!check_zfs',
      service_description => "check_zfs${hostname}",
      target              => '/etc/nagios3/conf.d/nagios_service.cfg',
      notify              => Service[$nagios::params::nagios_service],
    }

## Known failures

There are certain edge cases where Prism will fail. There are always such cases in every regex-based syntax highlighter. However, Prism dares to be open and honest about them. If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug.

### Comments, regular expressions or substrings that look like heredoc strings

    /* @(foo) */
    # @(foo)
    " @(foo) "
    $foo = /@(foo)/

### Single-line comments or substrings that look like multi-line comments

    # foo /* bar */ baz
    "foo /* bar */ baz"

### Substrings that look like single-line comment

    "foo #bar baz"

### More than one level of nested braces inside interpolation

    "Foobar ${foo({
        bar => {baz => 42}
        baz => 42
    })} <- broken"