<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.squi.fr/index.php?action=history&amp;feed=atom&amp;title=Ansible_%3A_Filtres</id>
	<title>Ansible : Filtres - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.squi.fr/index.php?action=history&amp;feed=atom&amp;title=Ansible_%3A_Filtres"/>
	<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Ansible_:_Filtres&amp;action=history"/>
	<updated>2026-06-12T02:38:43Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Ansible_:_Filtres&amp;diff=2062&amp;oldid=prev</id>
		<title>Justine le 22 juin 2022 à 10:05</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Ansible_:_Filtres&amp;diff=2062&amp;oldid=prev"/>
		<updated>2022-06-22T10:05:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 22 juin 2022 à 10:05&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Ligne 1 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 1 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Ansible]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters Liste des filtres de Jinja2]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters Liste des filtres de Jinja2]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki-mediawiki:diff:1.41:old-1419:rev-2062:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Ansible_:_Filtres&amp;diff=1419&amp;oldid=prev</id>
		<title>Justine : Page créée avec « https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html [https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters Liste des filtres de Jinj... »</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Ansible_:_Filtres&amp;diff=1419&amp;oldid=prev"/>
		<updated>2019-11-23T13:07:39Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html [https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters Liste des filtres de Jinj... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html&lt;br /&gt;
[https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters Liste des filtres de Jinja2]&lt;br /&gt;
&lt;br /&gt;
= Que sont les filtres =&lt;br /&gt;
&lt;br /&gt;
Les filtres d&amp;#039;Ansible viennent de Jinja2, et servent à transformer des données dans une expression de template.&lt;br /&gt;
&lt;br /&gt;
Il faut garder à l&amp;#039;esprit que la transformation des filtres se produit sur le contrôleur, et non pas sur l&amp;#039;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.&lt;br /&gt;
&lt;br /&gt;
On va ici en voir quelques uns. L&amp;#039;intégralité est disponible dans les liens donnés au dessus, parce qu&amp;#039;il y&amp;#039;en a beaucoup.&lt;br /&gt;
&lt;br /&gt;
== Formater des données ==&lt;br /&gt;
&lt;br /&gt;
Il est possible de formater des données depuis / vers du yaml ou du JSON. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
# Formattage simple&lt;br /&gt;
{{ some_variable | to_json }}&lt;br /&gt;
{{ some_variable | to_yaml }}&lt;br /&gt;
&lt;br /&gt;
#Human readable&lt;br /&gt;
{{ some_variable | to_nice_json }}&lt;br /&gt;
{{ some_variable | to_nice_yaml }}&lt;br /&gt;
&lt;br /&gt;
#On peut définir l&amp;#039;indentation&lt;br /&gt;
{{ some_variable | to_nice_json(indent=2) }}&lt;br /&gt;
{{ some_variable | to_nice_yaml(indent=8) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces filtres utilisent une lib qui a une limite de 80 caractères par ligne. On peut changer ça pour éviter d&amp;#039;avoir des linebreak au milieu d&amp;#039;une ligne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ some_variable | to_yaml(indent=8, width=1337) }}&lt;br /&gt;
{{ some_variable | to_nice_yaml(indent=8, width=1337) }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on peut lire depuis un format ou l&amp;#039;autre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ some_variable | from_json }}&lt;br /&gt;
{{ some_variable | from_yaml }}&lt;br /&gt;
&lt;br /&gt;
tasks:&lt;br /&gt;
  - shell: cat /some/path/to/file.json&lt;br /&gt;
    register: result&lt;br /&gt;
&lt;br /&gt;
  - set_fact:&lt;br /&gt;
      myvar: &amp;quot;{{ result.stdout | from_json }}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From_yaml_all permet de générer une variable à partir de yaml multi-documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
tasks:&lt;br /&gt;
  - shell: cat /some/path/to/multidoc-file.yaml&lt;br /&gt;
    register: result&lt;br /&gt;
  - debug:&lt;br /&gt;
      msg: &amp;#039;{{ item }}&amp;#039;&lt;br /&gt;
    loop: &amp;#039;{{ result.stdout | from_yaml_all | list }}&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de définition de variables ==&lt;br /&gt;
&lt;br /&gt;
On peut forcer une variable à être définie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ variable | mandatory }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais on peut aussi fournir une valeur par défaut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ some_variable | default(5) }}&lt;br /&gt;
&lt;br /&gt;
#On peut vouloir utiliser une valeur par défaut si la variable est False ou &lt;br /&gt;
#une chaîne de caractères vide. Il faut alors mettre le deuxième paramètre à True:&lt;br /&gt;
&lt;br /&gt;
{{ lookup(&amp;#039;env&amp;#039;, &amp;#039;MY_USER&amp;#039;) | default(&amp;#039;admin&amp;#039;, true) }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Filtres de listes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
#Récupérer la valeur minimale d&amp;#039;une liste de nombres&lt;br /&gt;
{{ list1 | min }}&lt;br /&gt;
&lt;br /&gt;
#Valeur maximale:&lt;br /&gt;
{{ [3, 4, 2] | max }}&lt;br /&gt;
&lt;br /&gt;
#Aplatir une liste&lt;br /&gt;
{{ [3, [4, 2] ] | flatten }}&lt;br /&gt;
&lt;br /&gt;
#Aplatir seulement le premier niveau&lt;br /&gt;
{{ [3, [4, [2]] ] | flatten(levels=1) }}&lt;br /&gt;
&lt;br /&gt;
##Les filtres suivants renvoient un seul ensemble à partir de plusieurs, ou de listes&lt;br /&gt;
&lt;br /&gt;
#Ensemble à partir d&amp;#039;une liste&lt;br /&gt;
{{ list1 | unique }}&lt;br /&gt;
&lt;br /&gt;
#Union de 2 listes&lt;br /&gt;
{{ list1 | union(list2) }}&lt;br /&gt;
&lt;br /&gt;
#Intersection de 2 listes (A inter B)&lt;br /&gt;
{{ list1 | intersect(list2) }}&lt;br /&gt;
&lt;br /&gt;
#Différence de deux listes (Items qui sont dans A mais pas dans B)&lt;br /&gt;
{{ list1 | difference(list2) }}&lt;br /&gt;
&lt;br /&gt;
#Différence symétrique (Items exclusifs à A ou B)&lt;br /&gt;
{{ list1 | symmetric_difference(list2) }}&lt;br /&gt;
&lt;br /&gt;
#Concaténer une liste en un string&lt;br /&gt;
{{ list | join(&amp;quot; &amp;quot;) }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Filtres de dictionnaires ==&lt;br /&gt;
=== item2dict ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
#Transformer un dictionnaire en une liste, utilisable avec loop&lt;br /&gt;
{{ dict | dict2items }}&lt;br /&gt;
&lt;br /&gt;
#Ce qui transforme ça :&lt;br /&gt;
tags:&lt;br /&gt;
  Application: payment&lt;br /&gt;
  Environment: dev&lt;br /&gt;
&lt;br /&gt;
#... en ça:&lt;br /&gt;
- key: Application&lt;br /&gt;
  value: payment&lt;br /&gt;
- key: Environment&lt;br /&gt;
  value: dev&lt;br /&gt;
&lt;br /&gt;
#On peut gérer les valeurs des clefs et des valeurs dans l&amp;#039;objet transformé:&lt;br /&gt;
{{ files | dict2items(key_name=&amp;#039;file&amp;#039;, value_name=&amp;#039;path&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
#Ce qui transforme ça:&lt;br /&gt;
files:&lt;br /&gt;
  users: /etc/passwd&lt;br /&gt;
  groups: /etc/group&lt;br /&gt;
&lt;br /&gt;
#...en ça:&lt;br /&gt;
- file: users&lt;br /&gt;
  path: /etc/passwd&lt;br /&gt;
- file: groups&lt;br /&gt;
  path: /etc/group&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dict2item ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
#Même chose dans l&amp;#039;autre sens : on transforme une liste de dicts,&lt;br /&gt;
#avec 2 clefs, en un dictionnaire&lt;br /&gt;
{{ tags | items2dict }}&lt;br /&gt;
&lt;br /&gt;
#Ce qui transforme ça:&lt;br /&gt;
tags:&lt;br /&gt;
  - key: Application&lt;br /&gt;
    value: payment&lt;br /&gt;
  - key: Environment&lt;br /&gt;
    value: dev&lt;br /&gt;
&lt;br /&gt;
#...en ça:&lt;br /&gt;
Application: payment&lt;br /&gt;
Environment: dev&lt;br /&gt;
&lt;br /&gt;
#On peut toujours changer les valeurs des clefs et des valeurs&lt;br /&gt;
{{ tags | items2dict(key_name=&amp;#039;key&amp;#039;, value_name=&amp;#039;value&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== zip ===&lt;br /&gt;
&lt;br /&gt;
zip permet de combiner les valeurs de plusieurs listes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
- name: give me list combo of two lists&lt;br /&gt;
  debug:&lt;br /&gt;
   msg: &amp;quot;{{ [1,2,3,4,5] | zip([&amp;#039;a&amp;#039;,&amp;#039;b&amp;#039;,&amp;#039;c&amp;#039;,&amp;#039;d&amp;#039;,&amp;#039;e&amp;#039;,&amp;#039;f&amp;#039;]) | list }}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- name: give me shortest combo of two lists&lt;br /&gt;
  debug:&lt;br /&gt;
    msg: &amp;quot;{{ [1,2,3] | zip([&amp;#039;a&amp;#039;,&amp;#039;b&amp;#039;,&amp;#039;c&amp;#039;,&amp;#039;d&amp;#039;,&amp;#039;e&amp;#039;,&amp;#039;f&amp;#039;]) | list }}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#Ces filtres peuvent être utilisés pour construire des dictionnaires:&lt;br /&gt;
{{ dict(keys_list | zip(values_list)) }}&lt;br /&gt;
&lt;br /&gt;
#Ce qui change ça:&lt;br /&gt;
keys_list:&lt;br /&gt;
  - one&lt;br /&gt;
  - two&lt;br /&gt;
values_list:&lt;br /&gt;
  - apple&lt;br /&gt;
  - orange&lt;br /&gt;
&lt;br /&gt;
#... en ça:&lt;br /&gt;
one: apple&lt;br /&gt;
two: orange&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== subelements ===&lt;br /&gt;
Similaire au lookup subelements, je n&amp;#039;ai pas compris ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ users | subelements(&amp;#039;groups&amp;#039;, skip_missing=True) }}&lt;br /&gt;
&lt;br /&gt;
#Change ça:&lt;br /&gt;
users:&lt;br /&gt;
- name: alice&lt;br /&gt;
  authorized:&lt;br /&gt;
  - /tmp/alice/onekey.pub&lt;br /&gt;
  - /tmp/alice/twokey.pub&lt;br /&gt;
  groups:&lt;br /&gt;
  - wheel&lt;br /&gt;
  - docker&lt;br /&gt;
- name: bob&lt;br /&gt;
  authorized:&lt;br /&gt;
  - /tmp/bob/id_rsa.pub&lt;br /&gt;
  groups:&lt;br /&gt;
  - docker&lt;br /&gt;
&lt;br /&gt;
#... en ça:&lt;br /&gt;
-&lt;br /&gt;
  - name: alice&lt;br /&gt;
    groups:&lt;br /&gt;
    - wheel&lt;br /&gt;
    - docker&lt;br /&gt;
    authorized:&lt;br /&gt;
    - /tmp/alice/onekey.pub&lt;br /&gt;
    - /tmp/alice/twokey.pub&lt;br /&gt;
  - wheel&lt;br /&gt;
-&lt;br /&gt;
  - name: alice&lt;br /&gt;
    groups:&lt;br /&gt;
    - wheel&lt;br /&gt;
    - docker&lt;br /&gt;
    authorized:&lt;br /&gt;
    - /tmp/alice/onekey.pub&lt;br /&gt;
    - /tmp/alice/twokey.pub&lt;br /&gt;
  - docker&lt;br /&gt;
-&lt;br /&gt;
  - name: bob&lt;br /&gt;
    authorized:&lt;br /&gt;
    - /tmp/bob/id_rsa.pub&lt;br /&gt;
    groups:&lt;br /&gt;
    - docker&lt;br /&gt;
  - docker&lt;br /&gt;
&lt;br /&gt;
#Exemple d&amp;#039;application&lt;br /&gt;
- name: Set authorized ssh key, extracting just that data from &amp;#039;users&amp;#039;&lt;br /&gt;
  authorized_key:&lt;br /&gt;
    user: &amp;quot;{{ item.0.name }}&amp;quot;&lt;br /&gt;
    key: &amp;quot;{{ lookup(&amp;#039;file&amp;#039;, item.1) }}&amp;quot;&lt;br /&gt;
  loop: &amp;quot;{{ users | subelements(&amp;#039;authorized&amp;#039;) }}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Filtres de commentaires ==&lt;br /&gt;
&lt;br /&gt;
De nombreux filtres permettent de produire des commentaires, hautement personnalisés :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ &amp;quot;Plain style (default)&amp;quot; | comment }}&lt;br /&gt;
&lt;br /&gt;
#Donne:&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Plain style (default)&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#Plusieurs langages sont dispos:&lt;br /&gt;
{{ &amp;quot;C style&amp;quot; | comment(&amp;#039;c&amp;#039;) }}&lt;br /&gt;
{{ &amp;quot;C block style&amp;quot; | comment(&amp;#039;cblock&amp;#039;) }}&lt;br /&gt;
{{ &amp;quot;Erlang style&amp;quot; | comment(&amp;#039;erlang&amp;#039;) }}&lt;br /&gt;
{{ &amp;quot;XML style&amp;quot; | comment(&amp;#039;xml&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
#On peut choisir le caractère:&lt;br /&gt;
{{ &amp;quot;My Special Case&amp;quot; | comment(decoration=&amp;quot;! &amp;quot;) }}&lt;br /&gt;
&lt;br /&gt;
#Donne:&lt;br /&gt;
!&lt;br /&gt;
! My Special Case&lt;br /&gt;
!&lt;br /&gt;
&lt;br /&gt;
#On peut aussi complètement customiser les commentaires&lt;br /&gt;
{{ &amp;quot;Custom style&amp;quot; | comment(&amp;#039;plain&amp;#039;, prefix=&amp;#039;#######\n#&amp;#039;, postfix=&amp;#039;#\n#######\n   ###\n    #&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
#Donne:&lt;br /&gt;
&lt;br /&gt;
#######&lt;br /&gt;
#&lt;br /&gt;
# Custom style&lt;br /&gt;
#&lt;br /&gt;
#######&lt;br /&gt;
   ###&lt;br /&gt;
    #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Urlsplit ==&lt;br /&gt;
&lt;br /&gt;
Permet d&amp;#039;extraire des éléments d&amp;#039;une URL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;hostname&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;www.acme.com&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;netloc&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;user:password@www.acme.com:9000&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;username&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;user&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;password&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;password&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;path&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;/dir/index.html&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;port&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;9000&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;scheme&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;http&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;query&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;query=term&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit(&amp;#039;fragment&amp;#039;) }}&lt;br /&gt;
# =&amp;gt; &amp;#039;fragment&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{ &amp;quot;http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment&amp;quot; | urlsplit }}&lt;br /&gt;
# =&amp;gt;&lt;br /&gt;
#   {&lt;br /&gt;
#       &amp;quot;fragment&amp;quot;: &amp;quot;fragment&amp;quot;,&lt;br /&gt;
#       &amp;quot;hostname&amp;quot;: &amp;quot;www.acme.com&amp;quot;,&lt;br /&gt;
#       &amp;quot;netloc&amp;quot;: &amp;quot;user:password@www.acme.com:9000&amp;quot;,&lt;br /&gt;
#       &amp;quot;password&amp;quot;: &amp;quot;password&amp;quot;,&lt;br /&gt;
#       &amp;quot;path&amp;quot;: &amp;quot;/dir/index.html&amp;quot;,&lt;br /&gt;
#       &amp;quot;port&amp;quot;: 9000,&lt;br /&gt;
#       &amp;quot;query&amp;quot;: &amp;quot;query=term&amp;quot;,&lt;br /&gt;
#       &amp;quot;scheme&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
#       &amp;quot;username&amp;quot;: &amp;quot;user&amp;quot;&lt;br /&gt;
#   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regex ==&lt;br /&gt;
&lt;br /&gt;
On peut faire des regex directments dans les variables :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
##Recherche de texte&lt;br /&gt;
&lt;br /&gt;
# search for &amp;quot;foo&amp;quot; in &amp;quot;foobar&amp;quot;&lt;br /&gt;
{{ &amp;#039;foobar&amp;#039; | regex_search(&amp;#039;(foo)&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
# will return empty if it cannot find a match&lt;br /&gt;
{{ &amp;#039;ansible&amp;#039; | regex_search(&amp;#039;(foobar)&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
# case insensitive search in multiline mode&lt;br /&gt;
{{ &amp;#039;foo\nBAR&amp;#039; | regex_search(&amp;quot;^bar&amp;quot;, multiline=True, ignorecase=True) }}&lt;br /&gt;
&lt;br /&gt;
# Return a list of all IPv4 addresses in the string&lt;br /&gt;
{{ &amp;#039;Some DNS servers are 8.8.8.8 and 8.8.4.4&amp;#039; | regex_findall(&amp;#039;\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
## Remplacement de texte&lt;br /&gt;
&lt;br /&gt;
# convert &amp;quot;ansible&amp;quot; to &amp;quot;able&amp;quot;&lt;br /&gt;
{{ &amp;#039;ansible&amp;#039; | regex_replace(&amp;#039;^a.*i(.*)$&amp;#039;, &amp;#039;a\\1&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
# convert &amp;quot;foobar&amp;quot; to &amp;quot;bar&amp;quot;&lt;br /&gt;
{{ &amp;#039;foobar&amp;#039; | regex_replace(&amp;#039;^f.*o(.*)$&amp;#039;, &amp;#039;\\1&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
# convert &amp;quot;localhost:80&amp;quot; to &amp;quot;localhost, 80&amp;quot; using named groups&lt;br /&gt;
{{ &amp;#039;localhost:80&amp;#039; | regex_replace(&amp;#039;^(?P&amp;lt;host&amp;gt;.+):(?P&amp;lt;port&amp;gt;\\d+)$&amp;#039;, &amp;#039;\\g&amp;lt;host&amp;gt;, \\g&amp;lt;port&amp;gt;&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
# convert &amp;quot;localhost:80&amp;quot; to &amp;quot;localhost&amp;quot;&lt;br /&gt;
{{ &amp;#039;localhost:80&amp;#039; | regex_replace(&amp;#039;:80&amp;#039;) }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chemins de fichiers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
#Récupérer foo dans /etc/bar/foo&lt;br /&gt;
{{ path | basename }}&lt;br /&gt;
&lt;br /&gt;
#Pareil dans un chemin windows&lt;br /&gt;
{{ path | win_basename }}&lt;br /&gt;
&lt;br /&gt;
#Virer la lettre de lecteur d&amp;#039;un chemin Windows&lt;br /&gt;
{{ path | win_splitdrive }}&lt;br /&gt;
&lt;br /&gt;
#Prendre uniquement la lettre du lecteur&lt;br /&gt;
{{ path | win_splitdrive | first }}&lt;br /&gt;
&lt;br /&gt;
#Prendre tout le chemin sans la lettre de lecteur&lt;br /&gt;
{{ path | win_splitdrive | last }}&lt;br /&gt;
&lt;br /&gt;
#Récupérer le répertoire à partir d&amp;#039;un chemin:&lt;br /&gt;
{{ path | dirname }}&lt;br /&gt;
&lt;br /&gt;
#Pareil en Windows&lt;br /&gt;
{{ path | win_dirname }}&lt;br /&gt;
&lt;br /&gt;
#Afficher le chemin complet quand il contient un ~&lt;br /&gt;
{{ path | expanduser }}&lt;br /&gt;
&lt;br /&gt;
#Afficher le chemin complet quand il contient des variables d&amp;#039;environnement&lt;br /&gt;
#Ne fonctionne que sur les variables locales&lt;br /&gt;
{{ path | expandvars }}&lt;br /&gt;
&lt;br /&gt;
#Récupérer le vrai chemin d&amp;#039;un lien&lt;br /&gt;
{{ path | realpath }}&lt;br /&gt;
&lt;br /&gt;
#Récupérer le chemin relatif d&amp;#039;un lien à partir d&amp;#039;un point donné&lt;br /&gt;
{{ path | relpath(&amp;#039;/etc&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
#Récupérer la racine et l&amp;#039;extension d&amp;#039;un chemin&lt;br /&gt;
# with path == &amp;#039;nginx.conf&amp;#039; the return would be (&amp;#039;nginx&amp;#039;, &amp;#039;.conf&amp;#039;)&lt;br /&gt;
{{ path | splitext }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dates ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
#mapper un attribut de chaque item d&amp;#039;une liste dans une liste de variables&lt;br /&gt;
# get a comma-separated list of the mount points (e.g. &amp;quot;/,/mnt/stuff&amp;quot;) on a host&lt;br /&gt;
{{ ansible_mounts | map(attribute=&amp;#039;mount&amp;#039;) | join(&amp;#039;,&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
# 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&lt;br /&gt;
{{ ((&amp;quot;2016-08-14 20:00:12&amp;quot; | to_datetime) - (&amp;quot;2015-12-25&amp;quot; | to_datetime(&amp;#039;%Y-%m-%d&amp;#039;))).total_seconds()  }}&lt;br /&gt;
&lt;br /&gt;
# Get remaining seconds after delta has been calculated. NOTE: This does NOT convert years, days, hours, etc to seconds. For that, use total_seconds()&lt;br /&gt;
{{ ((&amp;quot;2016-08-14 20:00:12&amp;quot; | to_datetime) - (&amp;quot;2016-08-14 18:00:00&amp;quot; | to_datetime)).seconds  }}&lt;br /&gt;
# This expression evaluates to &amp;quot;12&amp;quot; and not &amp;quot;132&amp;quot;. Delta is 2 hours, 12 seconds&lt;br /&gt;
&lt;br /&gt;
# get amount of days between two dates. This returns only number of days and discards remaining hours, minutes, and seconds&lt;br /&gt;
{{ ((&amp;quot;2016-08-14 20:00:12&amp;quot; | to_datetime) - (&amp;quot;2015-12-25&amp;quot; | to_datetime(&amp;#039;%Y-%m-%d&amp;#039;))).days  }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Autres filtres utiles ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;yaml&amp;#039;&amp;gt;&lt;br /&gt;
#Mettre des quotes pour un usage avec shell&lt;br /&gt;
- shell: echo {{ string_value | quote }}&lt;br /&gt;
&lt;br /&gt;
#Une valeur si vrai et une autre si faux&lt;br /&gt;
{{ (name == &amp;quot;John&amp;quot;) | ternary(&amp;#039;Mr&amp;#039;,&amp;#039;Ms&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
#Pareil mais avec une troisième valeur si null&lt;br /&gt;
{{ enabled | ternary(&amp;#039;no shutdown&amp;#039;, &amp;#039;shutdown&amp;#039;, omit) }}&lt;br /&gt;
&lt;br /&gt;
#Travailler en base64&lt;br /&gt;
{{ encoded | b64decode }}&lt;br /&gt;
{{ decoded | b64encode }}&lt;br /&gt;
&lt;br /&gt;
#On peut définir l&amp;#039;encodage&lt;br /&gt;
{{ encoded | b64decode(encoding=&amp;#039;utf-16-le&amp;#039;) }}&lt;br /&gt;
{{ decoded | b64encode(encoding=&amp;#039;utf-16-le&amp;#039;) }}&lt;br /&gt;
&lt;br /&gt;
#Créer un UUID à partir d&amp;#039;un string&lt;br /&gt;
{{ hostname | to_uuid }}&lt;br /&gt;
&lt;br /&gt;
#Retype les variables: On peut dire à Ansible que le string &amp;quot;test&amp;quot; est en réalité un booléen&lt;br /&gt;
- debug:&lt;br /&gt;
    msg: test&lt;br /&gt;
  when: some_string_value | bool&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
</feed>