Ansible : Filtres
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html
Liste des filtres de Jinja2
Que sont les filtres
Les filtres d'Ansible viennent de Jinja2, et servent à transformer des données dans une expression de template.
Il faut garder à l'esprit que la transformation des filtres se produit sur le contrôleur, et non pas sur l'hôte en lui-même. En plus des filtres fournis par Jinja2, Ansible fournit des filtres qui lui sont spécifiques et permet de créer ses propres filtres.
On va ici en voir quelques uns. L'intégralité est disponible dans les liens donnés au dessus, parce qu'il y'en a beaucoup.
Formater des données
Il est possible de formater des données depuis / vers du yaml ou du JSON.
<syntaxhighlight lang='yaml'>
- Formattage simple
Modèle:Some variable Modèle:Some variable
- Human readable
Modèle:Some variable Modèle:Some variable
- On peut définir l'indentation
Modèle:Some variable Modèle:Some variable
</syntaxhighlight>
Ces filtres utilisent une lib qui a une limite de 80 caractères par ligne. On peut changer ça pour éviter d'avoir des linebreak au milieu d'une ligne:
<syntaxhighlight lang='yaml'> Modèle:Some variable Modèle:Some variable </syntaxhighlight>
Enfin, on peut lire depuis un format ou l'autre :
<syntaxhighlight lang='yaml'> Modèle:Some variable Modèle:Some variable
tasks:
- shell: cat /some/path/to/file.json register: result
- set_fact: myvar: "Modèle:Result.stdout"
</syntaxhighlight>
From_yaml_all permet de générer une variable à partir de yaml multi-documents.
<syntaxhighlight lang='yaml'> tasks:
- shell: cat /some/path/to/multidoc-file.yaml register: result - debug: msg: 'Modèle:Item' loop: 'Modèle:Result.stdout'
</syntaxhighlight>
Gestion de définition de variables
On peut forcer une variable à être définie:
<syntaxhighlight lang='yaml'> Modèle:Variable </syntaxhighlight>
Mais on peut aussi fournir une valeur par défaut:
<syntaxhighlight lang='yaml'> Modèle:Some variable
- On peut vouloir utiliser une valeur par défaut si la variable est False ou
- une chaîne de caractères vide. Il faut alors mettre le deuxième paramètre à True:
Modèle:Lookup('env', 'MY USER') </syntaxhighlight>
Filtres de listes
<syntaxhighlight lang='yaml'>
- Récupérer la valeur minimale d'une liste de nombres
- Valeur maximale:
{{ [3, 4, 2] | max }}
- Aplatir une liste
{{ [3, [4, 2] ] | flatten }}
- Aplatir seulement le premier niveau
{{ [3, [4, [2]] ] | flatten(levels=1) }}
- Les filtres suivants renvoient un seul ensemble à partir de plusieurs, ou de listes
- Ensemble à partir d'une liste
- Union de 2 listes
- Intersection de 2 listes (A inter B)
- Différence de deux listes (Items qui sont dans A mais pas dans B)
- Différence symétrique (Items exclusifs à A ou B)
- Concaténer une liste en un string
</syntaxhighlight>
Filtres de dictionnaires
item2dict
<syntaxhighlight lang='yaml'>
- Transformer un dictionnaire en une liste, utilisable avec loop
- Ce qui transforme ça :
tags:
Application: payment Environment: dev
- ... en ça:
- key: Application
value: payment
- key: Environment
value: dev
- On peut gérer les valeurs des clefs et des valeurs dans l'objet transformé:
- Ce qui transforme ça:
files:
users: /etc/passwd groups: /etc/group
- ...en ça:
- file: users
path: /etc/passwd
- file: groups
path: /etc/group
</syntaxhighlight>
dict2item
<syntaxhighlight lang='yaml'>
- Même chose dans l'autre sens : on transforme une liste de dicts,
- avec 2 clefs, en un dictionnaire
- Ce qui transforme ça:
tags:
- key: Application value: payment - key: Environment value: dev
- ...en ça:
Application: payment Environment: dev
- On peut toujours changer les valeurs des clefs et des valeurs
</syntaxhighlight>
zip
zip permet de combiner les valeurs de plusieurs listes.
<syntaxhighlight lang='yaml'>
- name: give me list combo of two lists
debug: msg: "{{ [1,2,3,4,5] | zip(['a','b','c','d','e','f']) | list }}"
- name: give me shortest combo of two lists
debug: msg: "{{ [1,2,3] | zip(['a','b','c','d','e','f']) | list }}"
- Ces filtres peuvent être utilisés pour construire des dictionnaires:
- Ce qui change ça:
keys_list:
- one - two
values_list:
- apple - orange
- ... en ça:
one: apple two: orange </syntaxhighlight>
subelements
Similaire au lookup subelements, je n'ai pas compris ?
<syntaxhighlight lang='yaml'> Modèle:Users
- Change ça:
users: - name: alice
authorized: - /tmp/alice/onekey.pub - /tmp/alice/twokey.pub groups: - wheel - docker
- name: bob
authorized: - /tmp/bob/id_rsa.pub groups: - docker
- ... en ça:
-
- name: alice groups: - wheel - docker authorized: - /tmp/alice/onekey.pub - /tmp/alice/twokey.pub - wheel
-
- name: alice groups: - wheel - docker authorized: - /tmp/alice/onekey.pub - /tmp/alice/twokey.pub - docker
-
- name: bob authorized: - /tmp/bob/id_rsa.pub groups: - docker - docker
- Exemple d'application
- name: Set authorized ssh key, extracting just that data from 'users'
authorized_key: user: "Modèle:Item.0.name" key: "Modèle:Lookup('file', item.1)" loop: "Modèle:Users"
</syntaxhighlight>
Filtres de commentaires
De nombreux filtres permettent de produire des commentaires, hautement personnalisés :
<syntaxhighlight lang='yaml'> Modèle:"Plain style (default)"
- Donne:
- Plain style (default)
- Plusieurs langages sont dispos:
Modèle:"C style" Modèle:"C block style" Modèle:"Erlang style" Modèle:"XML style"
- On peut choisir le caractère:
- Donne:
! ! My Special Case !
- On peut aussi complètement customiser les commentaires
- Donne:
- Custom style
-
### #
</syntaxhighlight>
Urlsplit
Permet d'extraire des éléments d'une URL.
<syntaxhighlight lang='yaml'> Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'www.acme.com'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'user:password@www.acme.com:9000'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'user'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'password'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => '/dir/index.html'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => '9000'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'http'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'query=term'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- => 'fragment'
Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term
- =>
- {
- "fragment": "fragment",
- "hostname": "www.acme.com",
- "netloc": "user:password@www.acme.com:9000",
- "password": "password",
- "path": "/dir/index.html",
- "port": 9000,
- "query": "query=term",
- "scheme": "http",
- "username": "user"
- }
</syntaxhighlight>
Regex
On peut faire des regex directments dans les variables :
<syntaxhighlight lang='yaml'>
- Recherche de texte
- search for "foo" in "foobar"
- will return empty if it cannot find a match
- case insensitive search in multiline mode
- Return a list of all IPv4 addresses in the string
Modèle:'Some DNS servers are 8.8.8.8 and 8.8.4.4'
- Remplacement de texte
- convert "ansible" to "able"
- convert "foobar" to "bar"
- convert "localhost:80" to "localhost, 80" using named groups
- convert "localhost:80" to "localhost"
Modèle:'localhost:80' </syntaxhighlight>
Chemins de fichiers
<syntaxhighlight lang='yaml'>
- Récupérer foo dans /etc/bar/foo
- Pareil dans un chemin windows
- Virer la lettre de lecteur d'un chemin Windows
- Prendre uniquement la lettre du lecteur
- Prendre tout le chemin sans la lettre de lecteur
- Récupérer le répertoire à partir d'un chemin:
- Pareil en Windows
- Afficher le chemin complet quand il contient un ~
- Afficher le chemin complet quand il contient des variables d'environnement
- Ne fonctionne que sur les variables locales
- Récupérer le vrai chemin d'un lien
- Récupérer le chemin relatif d'un lien à partir d'un point donné
- Récupérer la racine et l'extension d'un chemin
- with path == 'nginx.conf' the return would be ('nginx', '.conf')
Modèle:Path </syntaxhighlight>
Dates
<syntaxhighlight lang='yaml'>
- mapper un attribut de chaque item d'une liste dans une liste de variables
- get a comma-separated list of the mount points (e.g. "/,/mnt/stuff") on a host
- Get total amount of seconds between two dates. Default date format is %Y-%m-%d %H:%M:%S but you can pass your own format
Modèle:(("2016-08-14 20:00:12"
- Get remaining seconds after delta has been calculated. NOTE: This does NOT convert years, days, hours, etc to seconds. For that, use total_seconds()
Modèle:(("2016-08-14 20:00:12"
- This expression evaluates to "12" and not "132". Delta is 2 hours, 12 seconds
- get amount of days between two dates. This returns only number of days and discards remaining hours, minutes, and seconds
Modèle:(("2016-08-14 20:00:12" </syntaxhighlight>
Autres filtres utiles
<syntaxhighlight lang='yaml'>
- Mettre des quotes pour un usage avec shell
- shell: echo Modèle:String value
- Une valeur si vrai et une autre si faux
- Pareil mais avec une troisième valeur si null
- Travailler en base64
- On peut définir l'encodage
- Créer un UUID à partir d'un string
- Retype les variables: On peut dire à Ansible que le string "test" est en réalité un booléen
- debug:
msg: test when: some_string_value | bool
</syntaxhighlight>