Puppet fonctions
| Fiche express | |
|---|---|
| Type | Référence langage Puppet |
| Portée | Fonctions natives du DSL Puppet |
| Doc officielle | Puppet Functions Reference |
| Voir aussi | Puppet · Puppet references · Puppet client |
Puppet fonctions recense les fonctions natives du langage de déclaration Puppet (DSL), utilisables dans les manifests (fichiers .pp) pour manipuler des ressources, itérer sur des collections, journaliser ou transformer des chaînes de caractères.
Ces fonctions se répartissent en deux familles : les fonctions dites « statement » (appelées comme fonction(arguments)) et les fonctions de type « lambda » introduites par Puppet 4, qui acceptent un bloc de code entre barres verticales (|$x| { ... }) et peuvent aussi s'écrire en notation chaînée ($variable.fonction |$x| { ... }).
Gestion des ressources
create_resources
Permet de déclarer dynamiquement un ensemble de ressources à partir d'un hash, en évitant de dupliquer le code pour chaque instance.
# Hash de ressources utilisateur
$myusers = {
'nick' => { uid => '1330',
gid => allstaff,
groups => ['developers', 'operations', 'release'], },
'dan' => { uid => '1308',
gid => allstaff,
groups => ['developers', 'prosvc', 'release'], },
}
create_resources(user, $myusers)
Un hash de valeurs par défaut peut être fourni en troisième argument :
$defaults = {
'ensure' => present,
'provider' => 'ldap',
}
create_resources(user, $myusers, $defaults)
- Exporter des ressources :
create_resources("@@user", $myusers) - Ressources virtuelles :
create_resources("@user", $myusers)
defined
Teste si une ressource, une classe ou un type est déjà défini dans le catalogue compilé — utile pour éviter les doublons de déclaration entre modules.
defined("file")
defined("customtype")
defined("foo")
defined("foo::bar")
defined('$name')
if defined(File['/tmp/foo']) {
notify { "This configuration includes the /tmp/foo file.": }
}
file { "/tmp/foo":
ensure => present,
}
defined(Resource['file', '/some/file'])
defined(File['/some/file'])
defined(Class['foo'])
realize
Rend effective (« réalise ») une ressource déclarée en virtual ailleurs dans le catalogue — la ressource n'est appliquée que si elle est explicitement réalisée.
realize User[luke]
require (fonction)
Évalue une classe et déclare implicitement une dépendance dessus (équivalent à include + relation d'ordre).
class myservice {
service { foo: ensure => running }
}
class otherstuff {
include myservice
file { '/foo': notify => Service[foo] }
}
include
Charge une classe (avec ou sans paramètres) sans imposer d'ordre d'application vis-à-vis des autres ressources.
include <class name>::<parameter name>
include class {'name': parameter => 'value',}
tag / tagged
tag: associe un ou plusieurs tags à la classe ou à la définition courante.tagged: fonction booléenne qui indique si la ressource porte un tag donné.
Itération sur les collections (Puppet 4+)
Les fonctions suivantes acceptent un bloc lambda |...| { ... } et s'utilisent soit en notation fonction, soit en notation chaînée sur la variable.
each
Applique un bloc à chaque élément d'un tableau, d'une paire clé/valeur de hash, ou d'un intervalle, sans retourner de valeur.
$a.each |$x| { ... }
each($a) |$x| { ... }
$a.each |$entry| { notice "key ${entry[0]}, value ${entry[1]}" }
$a.each |$key, $value| { notice "key ${key}, value ${value}" }
[1,2,3].each |$val| { ... } # 1, 2, 3
[5,6,7].each |$index, $val| { ... } # (0,5), (1,6), (2,7)
{a=>1, b=>2, c=>3}.each |$val| { ... } # ['a',1], ['b',2], ['c',3]
{a=>1, b=>2, c=>3}.each |$key, $val| { ... } # ('a',1), ('b',2), ('c',3)
Integer[10, 20].each |$index, $value| { ... } # (0,10), (1,11) ...
"hello".each |$char| { ... } # 'h','e','l','l','o'
3.each |$number| { ... } # 0, 1, 2
map
Applique un bloc à chaque élément et retourne un tableau des résultats — utile pour transformer un hash en tableau de clés ou de valeurs.
$a.map |$x| { ... }
map($a) |$x| { ... }
# Hash vers tableau de valeurs
$a.map |$x| { $x[1] }
# Hash vers tableau de clés
$a.map |$x| { $x[0] }
# Notation à deux paramètres
$a.map |$key, $val| { $val } # valeurs
$a.map |$key, $val| { $key } # clés
filter
Sélectionne les éléments d'une collection qui satisfont une condition, retourne un tableau ou un hash filtré.
$a.filter |$x| { ... }
filter($a) |$x| { ... }
# Sélectionne les éléments finissant par "berry"
$a = ["raspberry", "blueberry", "orange"]
$a.filter |$x| { $x =~ /berry$/ } # raspberry, blueberry
# Sélectionne selon l'index (pair) ET la valeur
$a = ["raspberry", "blueberry", "orange"]
$a.filter |$index, $x| { $index % 2 == 0 and $x =~ /berry$/ } # raspberry
# Sur un hash
$a = {"raspberry"=>0, "blueberry"=>1, "orange"=>1}
$a.filter |$key, $x| { $x =~ /berry$/ and $x >= 1 } # blueberry
reduce
Réduit une collection à une seule valeur en accumulant le résultat d'un bloc appliqué successivement à chaque élément (equivalent d'un fold/reduce classique).
$a.reduce |$memo, $x| { ... }
reduce($a) |$memo, $x| { ... }
$a.reduce(start) |$memo, $x| { ... }
reduce($a, start) |$memo, $x| { ... }
# Somme d'un tableau
$a = [1,2,3]
$a.reduce |$memo, $entry| { $memo + $entry } # => 6
# Réduction de valeurs de hash
$a = {a => 1, b => 2, c => 3}
$a.reduce |$memo, $entry| { [sum, $memo[1]+$entry[1]] } # => [sum, 6]
# Renverser une chaîne
"abc".reduce |$memo, $char| { "$char$memo" } # => "cba"
# Avec valeur de départ
$a = [1,2,3]
$a.reduce(4) |$memo, $entry| { $memo + $entry } # => 10
Integer[1,4].reduce |$memo, $x| { $memo + $x } # => 10
slice
Découpe une collection en sous-groupes de taille fixe et applique un bloc à chaque groupe.
$a.slice($n) |$x| { ... }
slice($a) |$x| { ... }
$a.slice(2) |$first, $second| { ... }
$a.slice(2) |$entry| { notice "first ${entry[0]}, second ${entry[1]}" }
$a.slice(2) |$first, $second| { notice "first ${first}, second ${second}" }
with
Appelle un bloc lambda avec les arguments donnés — sert surtout à isoler une portée de variables locales.
# Notifie le tableau [1, 2, 'foo']
with(1, 2, 'foo') |$x, $y, $z| { notice [$x, $y, $z] }
Journalisation (logging)
Ces fonctions envoient un message au niveau de sévérité correspondant dans les logs de l'agent ou du master.
- emerg — message d'urgence
- err — message d'erreur
- fail — interrompt la compilation avec un message d'échec
- info — message d'information
- notice — message notice
- warning — message d'avertissement
Templates (ERB / EPP)
template / inline_template
Évalue un template ERB (fichier ou chaîne inline) et retourne le texte rendu.
template('<MODULE NAME>/<TEMPLATE FILE>')
template('<MODULES DIRECTORY>/apache/templates/vhost.conf.erb')
Voir la documentation officielle sur le templating.
epp
Évalue un template EPP (Embedded Puppet, syntaxe <%= %> proche de l'ERB mais native au langage Puppet) depuis un fichier de module.
epp('<MODULE NAME>/<TEMPLATE FILE>', <PARAMETER HASH>)
epp('apache/templates/vhost/_docroot.epp', { 'docroot' => '/var/www/html', 'virtual_docroot' => '/var/www/example' })
inline_epp
Même principe que epp mais à partir d'une chaîne de caractères inline plutôt que d'un fichier.
inline_epp('<EPP TEMPLATE STRING>', <PARAMETER HASH>)
inline_epp('docroot: <%= $docroot %> Virtual docroot: <%= $virtual_docroot %>', { 'docroot' => '/var/www/html', 'virtual_docroot' => '/var/www/example' })
Lookup et Hiera
hiera / hiera_hash / hiera_array / hiera_include
Interroge la hiérarchie Hiera pour récupérer une valeur, en fusionnant éventuellement les résultats de plusieurs niveaux (hash, tableau, ou inclusion de classes). Depuis Puppet 4.x, la fonction lookup ci-dessous est l'API recommandée et remplace progressivement hiera*.
lookup
Fonction unifiée de résolution de données (remplaçante moderne de hiera), qui permet de valider le type de la valeur retournée.
lookup(name)
lookup(name, value_type)
lookup(name, value_type, merge)
lookup(name, value_type, merge, default_value)
lookup(options_hash)
lookup(name, options_hash)
lookup(...) |$name| { ... }
Types couramment utilisés (par défaut : data) :
Hash[<value_type>], Hash[<key_type>, <value_type>] Pattern['.com$', '.net$'], Pattern[/[a-z]+[0-9]+/] Enum[<s1>, <s2>, ..., <sn>] # ex : Enum[blue, red, green] Variant[<t1>, <t2>, ..., <tn>] # ex : Variant[Integer[8000,8999], Integer[20000,99999]]
Exemples :
lookup('the_name')
lookup('the_name', String)
lookup('the_name', String, undef, 'Fred')
lookup('the_name', Array[String], 'unique', [Fred])
$are_you_there = lookup('peekaboo', { 'default_value' => undef })
$are_you_there = lookup({ 'name' => 'peekaboo', 'default_value' => undef })
$are_you_there = lookup('peekaboo', Optional[String]) |$name| { undef }
Chaînes de caractères et validation
regsubst
Effectue un remplacement par expression régulière sur une chaîne ou un tableau de chaînes.
Paramètres (dans l'ordre) :
- target — chaîne ou tableau de chaînes sur lesquelles opérer ;
- regexp — expression régulière (non ancrée automatiquement, utiliser
^/$au besoin) ; - replacement — chaîne de remplacement, avec rétro-références
\0(match complet),\1, etc. ; - flags (optionnel) —
Eregex étendues,Iinsensible à la casse,Mmultiligne,Gremplacement global ; - encoding (optionnel) —
Naucun,EEUC,SSJIS,UUTF-8.
# Extraire le 3e octet de l'adresse IP d'un nœud $i3 = regsubst($ipaddress, '^(\d+)\.(\d+)\.(\d+)\.(\d+)$', '\3') # Encadrer chaque octet de l'adresse IP par des chevrons $x = regsubst($ipaddress, '([0-9]+)', '<\1>', 'G')
scanf
Analyse une chaîne selon un format et retourne un tableau des valeurs converties.
scanf("42", "%i")[0] == 42
"42".scanf("%i")
"42".scanf("%i") |$x| {
unless $x[0] =~ Integer {
fail "Expected a well formed integer value, got '$x[0]'"
}
$x[0]
}
split
Découpe une chaîne selon une expression régulière et retourne un tableau.
$string = 'v1.v2:v3.v4' $array_var1 = split($string, ':') $array_var2 = split($string, '[.]') $array_var3 = split($string, '[.:]')
match
Retourne les groupes capturés d'une expression régulière appliquée à une chaîne.
"abc123".match(/([a-z]+)[1-9]+/) # => ["abc"] "abc123".match(/([a-z]+)([1-9]+)/) # => ["abc", "123"]
Autres fonctions utilitaires
- sprintf — formate une chaîne à partir d'un tableau d'arguments (façon
printf). - shellquote — quote et concatène des arguments pour un shell Bourne (chaque argument est quoté séparément puis les résultats sont joints par des espaces).
- md5 — calcule le hash MD5 d'une chaîne.
- sha1 — calcule le hash SHA1 d'une chaîne.
- versioncmp — compare deux numéros de version.
- fqdn_rand — génère un nombre pseudo-aléatoire salé avec le hostname (FQDN) du nœud, pour obtenir un résultat stable par machine mais réparti entre machines (utile pour étaler des cron jobs).
$result = versioncmp(a, b)
if versioncmp('2.6-1', '2.4.5') > 0 {
notice('2.6-1 is > than 2.4.5')
}
Voir aussi
- Puppet — page hub de la sous-branche Puppet
- Puppet references — référence des types de ressources natifs
- Puppet client — configuration de l'agent qui exécute les manifests
- Hiera — hiérarchie de données consommée par
lookup/hiera