Handling multiline with HEREDOC
Writing multiline file fragments in Puppet mostly resulted in code that was hard to read, mostly due to indentation. With Puppet 4, the heredoc
style was added. It is now possible to specify a heredoc
tag and marker:
$motd_content = @(EOF) This system is managed by Puppet local changes will be overwritten by next Puppet run. EOF
The heredoc
tag starts with an @
sign followed by arbitrary string enclosed in parenthesis. The heredoc
marker is the string given in the tag.
If variables are required inside the heredoc
document, the variable interpolation can be enabled by putting the tag string in double quotes. Variables inside the heredoc
are written like Puppet DSL variables: a dollar sign followed by the scope and the variable name:
$motd_content = @("EOF") Welcome to ${::fqdn}. This system is managed by Puppet version ${::puppetversion}. Local changes will be overwritten by the next Puppet run EOF
Normally, heredoc
does not handle escape sequences. Escape sequences need to be enabled explicitly. As of Puppet 4.2, heredoc
has the following escape sequences available:
\n
Newline\r
Carriage return\t
Tab\s
Space\$
Literal dollar sign (preventing interpolation)\u
Unicode character\L
Nothing (ignore line breaks in source code)
Enabled escape sequences have to be placed behind the string of the heredoc
tag:
$modt_content = @("EOF"/tn)
Welcome to ${::fqdn}.\n\tThis system is managed by Puppet version ${::puppetversion}.\n\tLocal changes will be overwritten on next Puppet run.
EOF
In the example, the text always starts in the first column, which makes it hard to read and stands out from the code around it, which will usually be indented by some amount of whitespace.
It is possible to strip indentation by placing whitespaces and a pipe sign in front of the heredoc
marker. The pipe sign will indicate the first character of each line:
$motd_content = @("EOF") Welcome to ${::fqdn}. This system is managed by Puppet version ${::puppetversion}. Local changes will be overwritten on next Puppet run. | EOF
Now heredoc
and inline_epp
can be easily combined:
class my_motd ( Optional[String] $additional_content = undef ){ $motd_content = @(EOF) Welcome to <%= $::fqdn %>. This system is managed by Puppet version <%= $::puppetversion %>. Local changes will be overwritten on next Puppet run. <% if $additional_content != undef { -%> <%= $additional_content %> <% } -%> | EOF file { '/etc/motd': ensure => file, content => inline_epp($motd_content, { additional_content => $additional_content } ), } }
Declaring this class will give the following result in the motd
file:
puppet apply -e 'include my_motd' Welcome to puppetmaster.example.net. This system is managed by Puppet version 4.2.1. Local changes will be overwritten on next Puppet run.
- Implementing VMware Horizon 7(Second Edition)
- Python機器學習:數(shù)據(jù)分析與評分卡建模(微課版)
- SOA實踐
- MySQL 8從入門到精通(視頻教學版)
- 簡單高效LATEX
- 深入淺出WPF
- 算法精粹:經(jīng)典計算機科學問題的Python實現(xiàn)
- Hadoop+Spark大數(shù)據(jù)分析實戰(zhàn)
- Python王者歸來
- Podman實戰(zhàn)
- Python機器學習經(jīng)典實例
- jQuery Mobile移動應用開發(fā)實戰(zhàn)(第3版)
- Mastering Web Application Development with AngularJS
- 持續(xù)集成與持續(xù)交付實戰(zhàn):用Jenkins、Travis CI和CircleCI構(gòu)建和發(fā)布大規(guī)模高質(zhì)量軟件
- Learning AWS