Ansible : Filtres

De Justine's wiki
Aller à la navigation Aller à la recherche


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'>

  1. Formattage simple

Modèle:Some variable Modèle:Some variable

  1. Human readable

Modèle:Some variable Modèle:Some variable

  1. 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

  1. On peut vouloir utiliser une valeur par défaut si la variable est False ou
  2. 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'>

  1. Récupérer la valeur minimale d'une liste de nombres

Modèle:List1

  1. Valeur maximale:

{{ [3, 4, 2] | max }}

  1. Aplatir une liste

{{ [3, [4, 2] ] | flatten }}

  1. Aplatir seulement le premier niveau

{{ [3, [4, [2]] ] | flatten(levels=1) }}

    1. Les filtres suivants renvoient un seul ensemble à partir de plusieurs, ou de listes
  1. Ensemble à partir d'une liste

Modèle:List1

  1. Union de 2 listes

Modèle:List1

  1. Intersection de 2 listes (A inter B)

Modèle:List1

  1. Différence de deux listes (Items qui sont dans A mais pas dans B)

Modèle:List1

  1. Différence symétrique (Items exclusifs à A ou B)

Modèle:List1

  1. Concaténer une liste en un string

Modèle:List


</syntaxhighlight>

Filtres de dictionnaires

item2dict

<syntaxhighlight lang='yaml'>

  1. Transformer un dictionnaire en une liste, utilisable avec loop

Modèle:Dict

  1. Ce qui transforme ça :

tags:

 Application: payment
 Environment: dev
  1. ... en ça:

- key: Application

 value: payment

- key: Environment

 value: dev
  1. On peut gérer les valeurs des clefs et des valeurs dans l'objet transformé:

Modèle:Files

  1. Ce qui transforme ça:

files:

 users: /etc/passwd
 groups: /etc/group
  1. ...en ça:

- file: users

 path: /etc/passwd

- file: groups

 path: /etc/group


</syntaxhighlight>

dict2item

<syntaxhighlight lang='yaml'>

  1. Même chose dans l'autre sens : on transforme une liste de dicts,
  2. avec 2 clefs, en un dictionnaire

Modèle:Tags

  1. Ce qui transforme ça:

tags:

 - key: Application
   value: payment
 - key: Environment
   value: dev
  1. ...en ça:

Application: payment Environment: dev

  1. On peut toujours changer les valeurs des clefs et des valeurs

Modèle:Tags

</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 }}"
  1. Ces filtres peuvent être utilisés pour construire des dictionnaires:

Modèle:Dict(keys list

  1. Ce qui change ça:

keys_list:

 - one
 - two

values_list:

 - apple
 - orange
  1. ... en ça:

one: apple two: orange </syntaxhighlight>

subelements

Similaire au lookup subelements, je n'ai pas compris ?

<syntaxhighlight lang='yaml'> Modèle:Users

  1. 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
  1. ... 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
  1. 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)"

  1. Donne:
  1. Plain style (default)
  1. Plusieurs langages sont dispos:

Modèle:"C style" Modèle:"C block style" Modèle:"Erlang style" Modèle:"XML style"

  1. On peut choisir le caractère:

Modèle:"My Special Case"

  1. Donne:

! ! My Special Case !

  1. On peut aussi complètement customiser les commentaires

Modèle:"Custom style"

  1. Donne:
  1. 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

  1. => 'www.acme.com'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => 'user:password@www.acme.com:9000'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => 'user'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => 'password'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => '/dir/index.html'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => '9000'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => 'http'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => 'query=term'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. => 'fragment'

Modèle:"http://user:password@www.acme.com:9000/dir/index.html?query=term

  1. =>
  2. {
  3. "fragment": "fragment",
  4. "hostname": "www.acme.com",
  5. "netloc": "user:password@www.acme.com:9000",
  6. "password": "password",
  7. "path": "/dir/index.html",
  8. "port": 9000,
  9. "query": "query=term",
  10. "scheme": "http",
  11. "username": "user"
  12. }

</syntaxhighlight>

Regex

On peut faire des regex directments dans les variables :

<syntaxhighlight lang='yaml'>

    1. Recherche de texte
  1. search for "foo" in "foobar"

Modèle:'foobar'

  1. will return empty if it cannot find a match

Modèle:'ansible'

  1. case insensitive search in multiline mode

Modèle:'foo\nBAR'

  1. 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'

    1. Remplacement de texte
  1. convert "ansible" to "able"

Modèle:'ansible'

  1. convert "foobar" to "bar"

Modèle:'foobar'

  1. convert "localhost:80" to "localhost, 80" using named groups

Modèle:'localhost:80'

  1. convert "localhost:80" to "localhost"

Modèle:'localhost:80' </syntaxhighlight>

Chemins de fichiers

<syntaxhighlight lang='yaml'>

  1. Récupérer foo dans /etc/bar/foo

Modèle:Path

  1. Pareil dans un chemin windows

Modèle:Path

  1. Virer la lettre de lecteur d'un chemin Windows

Modèle:Path

  1. Prendre uniquement la lettre du lecteur

Modèle:Path

  1. Prendre tout le chemin sans la lettre de lecteur

Modèle:Path

  1. Récupérer le répertoire à partir d'un chemin:

Modèle:Path

  1. Pareil en Windows

Modèle:Path

  1. Afficher le chemin complet quand il contient un ~

Modèle:Path

  1. Afficher le chemin complet quand il contient des variables d'environnement
  2. Ne fonctionne que sur les variables locales

Modèle:Path

  1. Récupérer le vrai chemin d'un lien

Modèle:Path

  1. Récupérer le chemin relatif d'un lien à partir d'un point donné

Modèle:Path

  1. Récupérer la racine et l'extension d'un chemin
  2. with path == 'nginx.conf' the return would be ('nginx', '.conf')

Modèle:Path </syntaxhighlight>


Dates

<syntaxhighlight lang='yaml'>

  1. mapper un attribut de chaque item d'une liste dans une liste de variables
  2. get a comma-separated list of the mount points (e.g. "/,/mnt/stuff") on a host

Modèle:Ansible mounts

  1. 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"

  1. 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"

  1. This expression evaluates to "12" and not "132". Delta is 2 hours, 12 seconds
  1. 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'>

  1. Mettre des quotes pour un usage avec shell

- shell: echo Modèle:String value

  1. Une valeur si vrai et une autre si faux

Modèle:(name == "John")

  1. Pareil mais avec une troisième valeur si null

Modèle:Enabled

  1. Travailler en base64

Modèle:Encoded Modèle:Decoded

  1. On peut définir l'encodage

Modèle:Encoded Modèle:Decoded

  1. Créer un UUID à partir d'un string

Modèle:Hostname

  1. 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>