Les Expressions et les Fonctions terraform
https://www.terraform.io/language/functions
1. Les types
1.1. types primitifs
- string
- number (entier ou décimaux)
- bool
1.2. types complexes
- list(< TYPE >) ou tuple([< TYPE >, < TYPE > ...])
liste non ordonnée de différents items d'un même type, indexé par un entier de 0 à n.
les tuples sont des listes avec des items de différents types.
Symbole [] . Séparateur ','
exemple :json mylist=["a", 15, true] mylist[0] -> a
-
set([< TYPE >]) liste ordonnée d'éléments d'un même type
-
map(< KEY > = < TYPE >)/map(< KEY > : < TYPE >) ou object({< ATTR NAME > = < TYPE >, ... })
liste de clé-valeur. Les clés sont toujours des string.
Symbole {}. Séparateur entre élément ','. Attribution '=' ou ':'
Les maps sont des collections dont les valeurs sont d'un seul type
Les objects sont des collections dont les valeurs peuvent avoir des types différents.
exemple : ```json { name = "John" age = 52 }
```
- null
aucun type
1.3. Heredoc
Terraform support heredoc
<<EOT
hello
world
EOT
ou avec incrémentation
<<-EOT
hello
world
EOT
1.4 Substitution
${ ... }
: Interpolation
Replace par la valeur littérale du paramètre contenu entre les accolades
exemple :
`"Hello, ${var.name}!"`
si `var.name` = `"World"`
alors l'affichage sera `"Hello World"`
%{ ... }
: Directive
Elle permet des résultats conditionnels et/ou une itération sur les collections.
* condition: %{if
Espace blanc: l'ajout d'un tilde ~ au niveau des accolades permet d'enlever les espaces avec les séquences. {~ if }/{ end ~} supprime les éventuels espaces avant et après la séquence. exemple
<<EOT
%{ for ip in aws_instance.example.*.private_ip ~}
server ${ip}
%{ endfor ~}
EOT
donne
server 10.1.16.154
server 10.1.16.1
server 10.1.16.34
NB: $${
et %%{
permet d'échapper les séquences
2. Les expressions
2.1. Chemins des répertoires
il existe des mots clés pour les chemins (path)
path.module
chemin du module où l'expression est placéepath.root
chemin du module root. Répertoire parent.path.cwd
Chemin du répertoire de travail. Généralement c'est le même que pour path.root sauf dans des cas avancés de traitement.terraform.workspace
nom du workspace sélectionné
2.2. Expression spéciales d'itération
count.index
: Accès à l'index de l'itérateurcount
en meta-argument.each.key / each.value
: Accès au clé/valeur d'une map utilisé dans le meta-argumentfor_each
.self
: référence à la ressource uniquement dans les blocsprovisioner
etconnection
.
Récupération des données en itération count
aws_instance.example[*].id
retourne la liste de tous les ids
de chaque instance example
de la ressource aws_instance
.
aws_instance.example[0].id
retourne uniquement l'id
de la première instance example
de la ressource aws_instance
Récupération des données en itération for_each
aws_instance.example["a"].id
retourne l'id
de l'instance example
qui a la clé "a"
de la ressource aws_instance
.
[for value in aws_instance.example: value.id]
retourne la liste de tous les ids
de chaque instance example
de la ressource aws_instance
.
values(aws_instance.example)[*].id
équivalent de l'expression précédent en version splat avec la fonction values()
2.3. Les opérateurs
Terraform utilisent les opérateurs classiques * d'arithmétiques (+,-,/,*,%), * de comparaison (<=, >=, <, >), * d'égalité (==, !=) * et de logiques ( &&, ||, !)
2.4. Expressions conditionnelles
condition ? true_val : false_val
2.5. Expression for
[for s in var.list : upper(s)] : retourne une liste/tuple de string en majuscule
[for k, v in var.map : length(k) + length(v)] : retourne une liste/tuple de nombre
{for s in var.list : s => upper(s)} : retourne un objet/map avec l'ancien valeur en clé et la transformation en valeur
list = ["foo", "bar", "baz"]
{for s in var.list : s => upper(s)}
{
foo = "FOO"
bar = "BAR"
baz = "BAZ"
}
[for s in var.list : upper(s) if s != ""] retourne une liste/tuple de string en majuscule si la chaine de départ n'est pas vide
toset([for e in var.set : e.example]): permet de garder l'ordonnance de départ des éléments après l'expression for
2.6 L'opérateur splat [*]
C'est une opérateur si retourne une liste d'élément de l'instance comme l'opérateur for mais de manière plus concise.
var.list[*].id
est équivalent à [for o in var.list : o.id]
ATTENTION: l'opérateur splat a un comportement spécial sur l'élément qui peut être nul et qui n'est ni une liste, ni un tuple, ni un set. Dans ce cas, l'opérateur retournera soit une valeur nulle soit une liste d'un seul élément.
exemple :
variable "website_setting" {
type = object({
index_document = string
error_document = string
})
default = null
}
resource "aws_s3_bucket" "example" {
# ...
dynamic "website" {
for_each = var.website_setting[*]
content {
index_document = website.value.index_document
error_document = website.value.error_document
}
}
}
Dans ce cas, le bloc dynamique sera crée si et seulement si la variable website_setting est instanciée.
3. Les fonctions
3.1. fonctions numériques
Fonction | Formule | Role |
---|---|---|
abs | abs(number) | valeur absolue |
ceil | ceil(number) | arrondi supérieur le plus proche |
floor | floor(number) | arrondi inférieur le plus proche |
log | log(number, base) | logarithme |
max | max(12, 54, 3) max([12, 54, 3]...) |
max d'une suite de nombre max d'une liste |
min | min(12, 54, 3) min([12, 54, 3]...) |
min d'une suite de nombre min d'une liste |
parseint | parseint(string, base) | convertir une chaine en nombre suivant la base utilisée 10, 16, 2 (entre 2 et 62) |
pow | pox(num1, num2) | élève num1 à la puissance num2 |
signum | signum (number) | détermine le signe du nombre. retourne -1, 0, 1 |
3.2 fonctions de chaine de caractères
Fonction | Formule | Role |
---|---|---|
chomp | chomp("hello\n") | supprime les marques de fin de paragraphe "\n" "\n\r" "\n\n" |
format | format(spec, values...) | formate la chaine avec les caractères %s, %g, %t, %#v, etc... |
formatlist | formatlist(spec, values...) | crée une liste de chaine en substitution %s... |
indent | indent(num_spaces, string) | indente la chaine de num_spaces |
join | join(separator, list) | retourne une chaine à partir d'un liste avec le séparateur spécifié |
lower | lower(string) | retourne une chaine en minuscule |
regex | regex(pattern, string) | applies a regular expression to a string and returns the matching substrings. |
regexall | regexall(pattern, string) | applies a regular expression to a string and returns a list of all matches. |
replace | replace(string, subst, replace) | searches a given string for another given substring, and replaces each occurrence with a given replacement string. |
split | split(separator, string) | split produces a list by dividing a given string at all occurrences of a given separator. |
strrev | strrev(string) | inverse les caractères d'une chaine |
substr | substr(string, offset, length) | extrait le sous-chaine avec un décalage de offset sur length caractères |
title | title(string) | met le premier caractère de chaque mot en majuscule |
trim | trim(string, str_character_set) | supprime les caractères donnés de la chaine |
trimprefix | trimprefix(string, substring) | supprime substring de chaque mot commençant par substring sinon retourne le mot complet |
trimsuffix | trimsuffix(string, substring) | supprime substring de chaque mot se terminant par substring sinon retourne le mot complet |
trimspace | trimsspace(string) | supprime les espaces en début et fin de chaine y compris retour, tabs et autres caractères d'espace |
upper | upper(string) | Met la chaine en majuscule |
3.3. fonctions de manipulation des collection
Fonction | Formule | Role |
---|---|---|
alltrue | alltrue(list) | retourne true si tous les éléments de la liste sont true ou "true" |
anytrue | anytrue(list) | retourne true si au moins un élément de la liste est true ou "true" |
chunklist | chunklist(list, chunk_size) | retourne une liste découpé en taille de chunk_size |
coalesce | coalesce(value, value, ...) | retourne le premier élément des arguments qui n'est pas nul |
coalescelist | coalescelist(list, list, ...) | retourne la première liste des arguments qui n'est pas vide |
compact | compact(list(string)) | supprime les éléments vides |
concat | concat(list, list) | concatène les listes (2 minimum) en une seule |
contains | contains(list, value) | retourne true si la valeur recherchée est trouvée dans la liste |
distinct | distinct(list) | retourne une liste d'élément unique - Supprime les doublons |
element | element(list, index) | retourne l'élément à position d'index donnée (les index commence à 0) |
flatten | flatten([list, list, list]) | retourne les éléments imbriquées en une liste d'un niveau pour les maps utiliser for_each |
index | index(list, value) | donne l'index du premier élément recherché. Retourne une erreur si l'élément est absent |
keys | keys(map/object) | retourne la liste des clés de la map ou de l'objet |
length | length(value) | retourne la taille de la chaine, de la liste ou de la map. 0 si vide |
lookup | lookup(map, key, default) | retourne la valeur de la clé sinon la valeur par défaut |
matchkeys | matchkeys(valueslist, keyslist, searchset) | retourne une liste des valeurs qui ont le même index que les éléments de la deuxième liste qui corresponde à la valeur recherchée |
merge | merge(map, map, map...) | fusionne des maps. En cas de clé identique, la dernière valeur est retenue |
one | one(list) | retourne null ou le premier élément. Erreur si la liste comprend plus d'un élément |
range | range(max) range(start, limit) range(start, limit, step) |
créer une liste de nombre suivant les arguments donnés |
reverse | reverse(list) | inverse l'ordre d'une liste |
setintersection | setintersection(sets...) | Crée un set des éléments communs d'une collection de différents sets |
setproduct | setproduct(sets...) | produit cartésien d'une collection de sets |
setsubtract | setsubtract(a, b) | Produit un set d'élément présent dans le premier set non présent dans le deuxième |
setunion | setunion(sets...) | Fusionne des sets en un seul set d'élément unique |
slice | slice(list, startindex, endindex) | extrait les éléments consécutifs d'une liste de l'index startindex inclus à l'index endindex exclus |
sort | sort(list) | trie une liste en ordre lexicographique |
sum | sum(list/set(number)) | fait la somme des nombres contenus dans une liste ou un set |
transpose | transpose( { "a" = ["1","2"], "b" = ["2","3"] } ) { "1" = ["a"], "2" = ["a","b"], "3"=["b"] } |
prend une map de liste de chaine et interverti les clés et les valeurs pour obtenir une nouvelle map de chaine. |
values | values(map) | Retourne la liste des valeurs d'une map |
zipmap | zipmap(keyslist, valueslist) | Construit une map à partir de deux listes de même taille. La keylist doit être une liste de string, mais la liste de valuelist peut être de n'importe quel type. |
3.4. fonctions d'encodage
Fonction | Formule | Role |
---|---|---|
base64decode | base64decode(string) | prend une chaine codée en base64 et retourne la chaine originale |
base64encode | base64encode(string) | prend une chaine et retourne une chaine codée en base64 |
base64gzip | base64gzip(string) | compresse une chaine en gzip et la code en base64 |
csvdecode | csvdecode(string) | décode une chaine au format CSV et créer une liste de maps représentant les données |
jsondecode | jsondecode(jsonstring) | décode un chaine json en type terraform (string, number, bool, object, tuple) |
jsonencode | jsonencode(type) | encode une type terraform en string json |
urlencode | urlencode(string) | applique l'encode url à la chaine (%20,%21 etc...) |
yamldecode | yamldecode(yaml) | transcode un string yaml en type terraform |
yamlencode | yamlencode(type) | transcode un type terraform en élément yaml |
3.5. fonctions de manipulation des fichiers et dossiers
Fonction | Formule | Role |
---|---|---|
abspath | abspath(path.root) | donne le chemin absolu du chemin donné en argument |
dirname | dirname(dir/file) | donne l’arborescence des dossiers ou est contenu le fichier |
pathexpand | pathexpand(pathway) | donne le chemin absolu si utilisation ~ ou Variable |
basename | basename(dir/file) | donne le nom du fichier sans le chemin |
file | file(path) | lit le contenu du fichier et le retourne sous forme de chaine |
fileexists | fileexists(path) | retourne true si le fichier existe |
fileset | fileset(path, pattern) | retourne la liste des fichiers avec leur chemin suivant le pattern donné (, *, ? {alternative,...}, [CLASS], [^CLASS], [abc], [a-z]) |
filebase64 | filebase64(path) | lit le contenu du fichier et le retourne en base64 |
templatefile | templatefile(path, vars) | lit le contenu du fichier et substitut les variables avec les valeurs données et renvoi une chaine. Le fichier utilise les expression d'interpolation (${...}) et de directive (%{...}). Il est recommandé que le fichier soit suffixé par .tftpl . |
3.6. fonctions Date et Heure
Fonction | Formule | Role |
---|---|---|
formatdate | formatdate(spec, timestamp) | terraform utilise la convention RFC 3339 exemple formatdate("DD MMM YYYY hh:mm ZZZ", "2018-01-02T23:12:01Z") |
timeadd | timeadd(timestamp, duration) | ajout une durée à un timestamp et retourne un autre timestamp |
timestamp | timestamp() | retourne le temps en UTC suivant la convention RFC 3339 Terraform prend le temps à partir de la commande terraform apply (et non terraform plan) |
3.7. fonctions de cryptographie et de hachage
Fonction | Formule | Role |
---|---|---|
base64sha256 | base64sha256(string) | donne le SHA256 de la chaine et l'encode en base64 |
base64sha512 | base64sha512(string) | donne le SHA512 de la chaine et l'encode en base64 |
bcrypt | bcrypt(string, cost) | hache la chaine en chiffrement Blowfish et retourne une chaine en format Modular Crypt. cost est optional, par défaut il vaut 10 |
filebase64sha256 | filebase64sha256(file) | hachage en SHA256 d'un fichier donné et l'encode en base64 |
filebase64sha512 | filebase64sha512(file) | hachage en SHA512 d'un fichier donné et l'encode en base64 |
filemd5 | filemd5(file) | hachage en MD5 d'un fichier donné |
filesha1 | filesha1(file) | hachage en SHA1 d'un fichier donné |
filesha256 | filesha256(file) | hachage en SHA256 d'un fichier donné |
filesha512 | filesha512(file) | hachage en SHA512 d'un fichier donné |
md5 | md5(string) | hachage en MD5 d'une chaine donnée |
rsadecrypt | rsadecrypt(ciphertext, privatekey) | décrypte un texte encrypté RSA avec la clé et donne la valeur originale |
sha1 | sha1(string) | hachage en SHA1 d'une chaine donnée |
sha256 | sha256(string) | hachage en SHA256 d'une chaine donnée |
sha512 | sha512(string) | hachage en SHA512 d'une chaine donnée |
uuid | uuid() | Génère une identité pseudo-random unique au format RFC 4122 section 4.4 |
uuidv5 | uuidv5(namespace, name) | Génère une identité unique en RFC 4122 section 4.3, connu sous la "version 5" UUID. |
3.8. fonctions réseaux IP
Fonction | Formule | Role |
---|---|---|
cidrhost | cidrhost(prefix, hostnum) | Calcul l'adresse IP complète avec le numéro du host et le préfixe CIDR. Exemple cidrhost("10.12.112.0/20", 16) ==> 10.12.112.16 |
cidrnetmask | cidrnetmask(prefix) | Calcul le masque à partir du préfixe CIDR. |
cidrsubnet | cidrsubnet(prefix, newbits, netnum) | Calcul le sous-réseau Exemple cidrsubnet("172.16.0.0/12", 4, 2) ==> 172.18.0.0/16 cidrsubnet("10.1.2.0/24", 4, 15) ==> 10.1.2.240/28 |
cidrsubnets | cidrsubnets(prefix, newbits...) | calcule une séquence de plages d'adresses IP consécutives dans un préfixe CIDR particulier. |
3.9. fonctions conversion de type
Fonction | Formule | Role |
---|---|---|
can | can(expression) | Evalue une expression et retourne true si par d'erreur |
defaults | defaults(input_value, defaults) | attribue de manière concise des valeurs par défaut uniquement lorsqu'une valeur d'attribut a été définie sur null. |
nonsensitive | nonsensitive(sensitive_value) | prend une valeur sensible et renvoie une copie de cette valeur avec le marquage sensible supprimé, exposant ainsi la valeur. |
sensitive | sensitive(value) | prend n'importe quelle valeur et en renvoie une copie marquée sensible avec la même signification et le même comportement que pour les variables d'entrée sensibles |
tobool | tobool(value) | convertie les chaines "true" et "false" et null, en booléen ou null. N'importe quelle autre valeur retourne une erreur. La conversion "true"->true et "false"->false est généralement implicite. |
tolist | tolist([val1, val2, val3,...]) | convertie les arguments en liste (conversion implicite des valeurs en un même type) |
tomap | tomap({val1=value, val2=value,...}) | convertie les arguments en map (conversion implicite des valeurs en un même type) |
tonumber | tonumber(value) | conversion d'une valeur en nombre sinon erreur |
toset | toset([val1, val2, val3,...]) | convertie les arguments en set (conversion implicite des valeurs en un même type et suppression des doublons) |
tostring | tostring(value) | converti l'argument en chaine. Erreur si l'argument est une collection |
try | try{expr1, expr2,...} | évalue tour à tour toutes ses expressions d'argument et renvoie le résultat de la première qui ne produit aucune erreur. |
type | type(value) | retourne le type de l'argument |
exemple try:
variable "example" {
type = any
}
locals {
example = try(
[tostring(var.example)],
tolist(var.example),
)
}