# Ansible: échapper un caractère point ('.')

**URL:** <https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084>\
**Category:** Programmation\
**Tags:** ansible\
**Created:** [Février 3, 2022, 4:42 UTC](https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084 "2022-02-03T16:42:54Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Février 3, 2022, 4:42 UTC](https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084/1 "2022-02-03T16:42:54Z")

</div>

Bonjour,

j’essaie de me servir d’ansible comme solution d’inventaire sur un petit parc de serveurs, et notamment pour recenser les versions installées de tels ou tels paquets.  
Pour ça il y a le module `package_facts` qui est très pratique, mais je n’arrive pas à m’en servir pour les paquets dont le nom comporte le cractère `.` (comme php7.4).  
Mon playbook est comme ceci:

```auto
- hosts: ct
  vars:
    - debug: 1
  tasks:
    - name: "Gather packages informations"
      package_facts:
        manager: apt
    - name: Print
      debug:
        var: ansible_facts.packages
      when: debug == 1
    - name: "Check apache version"
      debug:
        msg: "Apache {{ ansible_facts.packages.apache2[0].version }} installé"
      when: "'apache2' in ansible_facts.packages"
    - name: "Check PHP version"
      debug:
        msg: "PHP version {{ ansible_facts.packages.php7.4[0].version }} installé"
      when: "'php7.4' in ansible_facts.packages"

```

Mais si pour la tâche pour les versions apache, ça fonctionne bien, pour celle des versions php7.4, j’ai cette erreur, qui semble logique:

```auto
 FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'php7'}

```

J’ai tenté de remplacer la ligne

```auto
 msg: "PHP version {{ ansible_facts.packages.php7.4[0].version }} installé"

```

par

```auto
msg: "PHP version {{ ansible_facts.packages.['php7.4'][0].version }} installé"

```

et d’autres combinaisons du même genre, comme `msg: "PHP version {{ ansible_facts.packages.['php7.4'][0].version }} installé"`, mais l’erreur devient:

```auto
FAILED! => {"msg": "template error while templating string: expected name or number. String: PHP version {{ ansible_facts.packages.['php7.4'][0].version }} installé"}

```

La variable

```auto
 "ansible_facts.packages": {
[...]
        "php7.4": [
            {
                "arch": "all",
                "category": "php",
                "name": "php7.4",
                "origin": "deb.sury.org",
                "source": "apt",
                "version": "7.4.27-1+0~20211220.57+debian11~1.gbp832572"
            }
        ],
[...]
    }
}

```

J’ai visiblement un soucis pour parcourir efficacement ce genre de structure mêlant des listes et des dictionnaires, si un ninja d’ansible ou python peut m’expliquer le topo, je lui en serais très reconnaissant 😄

---

<div class="post-metadata">

**Author:** ![Clochette](https://www.debian-fr.org/user_avatar/www.debian-fr.org/clochette/32/8757_2.png) [@Clochette](https://www.debian-fr.org/u/Clochette)\
**Post date:** [Février 4, 2022, 9:25 UTC](https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084/2 "2022-02-04T09:25:18Z")

</div>

D’après la Doc on fait plus comme ça :

```auto
- name: Gather the package facts
  ansible.builtin.package_facts:
    manager: auto

- name: Print the package facts
  ansible.builtin.debug:
    var: ansible_facts.packages

- name: Check whether a package called foobar is installed
  ansible.builtin.debug:
    msg: "{{ ansible_facts.packages['foobar'] | length }} versions of foobar are installed!"
  when: "'foobar' in ansible_facts.packages"

```

[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/package\_facts\_module.html](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/package_facts_module.html)

Du coup tu doit récupérer un string 😉

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Février 4, 2022, 1:14 UTC](https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084/3 "2022-02-04T13:14:40Z")

</div>

J’ai commencé par cette doc, oui.  
L’exemple donné permet d’afficher le nombre de versions installées d’un même paquet, en fait `foobar` est une liste de dictionnaires (le `| lenght` permet d’avoir le nombre de dictionnaires), comme `php7.4` dans mon exemple, même si dans mon cas cette liste ne contient qu’un seul dictionnaire (d’où le `[0]`).  
Mais comme je disais, mon playbook fonctionne nickel pour apache et d’autres paquets, je bute juste sur les paquets qui ont un point dans leur nom, vu qu’avec ansible on utilise ce caractère pour accéder aux sous-éléments d’un élément

---

<div class="post-metadata">

**Author:** ![Eme](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/8dc957/32.png) [@Eme](https://www.debian-fr.org/u/Eme)\
**Post date:** [Février 6, 2022, 1:27 UTC](https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084/4 "2022-02-06T01:27:26Z")

</div>

Salut. Regard par là [Escaping all Special Characters Using Ansible Shell | by Ardhi, Muhammad | Medium](https://medium.com/@_muhammadardhi/escaping-all-special-characters-using-ansible-shell-ed10007f2517)

Il y a un exemple avec le point.

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Février 6, 2022, 2:36 UTC](https://www.debian-fr.org/t/ansible-echapper-un-caractere-point/86084/5 "2022-02-06T14:36:02Z")

</div>

Salut,  
l’article parle du module `shell` d’ansible, que je n’utilise pas.  
J’ai aussi essayé d’échapper le point avec un `\` mais j’ai dans ce cas une erreur de syntaxe.

Mais j’ai continué à expérimenter suivant la [doc](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#referencing-nested-variables) sur les variables imbriquées, et la solution est d’utiliser la notation avec des crochets comme ceci:

```auto
    - name: "Check PHP version"
      debug:
        msg: "PHP version {{ ansible_facts['packages']['php7.4'][0]['version'] }} installé"
      when: "'php7.4' in ansible_facts.packages"

```

Et le résultat est là:

```auto
TASK [Check PHP version] ******************************************************************************************************************************************************************************************
ok: [nextcloud] => {
    "msg": "PHP version 7.4.27-1+0~20211220.57+debian11~1.gbp832572 installé"
}
skipping: [ansible]
ok: [zabbix] => {
    "msg": "PHP version 7.4.27-1+0~20211220.57+debian11~1.gbp832572 installé"
}
skipping: [grafana]
skipping: [openldap]
ok: [glpi] => {
    "msg": "PHP version 7.4.25-1+deb11u1 installé"
}
skipping: [dns]

```

Youpi !
