« Ansible : Quirks » : différence entre les versions

De Justine's wiki
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 106 : Ligne 106 :
See man pages for Ansible CLI options or website for tutorials
See man pages for Ansible CLI options or website for tutorials
https://docs.ansible.com
https://docs.ansible.com
</syntaxhighlight>
== Le module find ==
Le module find est un peu casse-pieds. Il si je le register dans "fichiers", alors ma variable fichiers contiendra une liste appellée "files" (et d'autres : cf la doc), laquelle sera une liste de collection clefs-valeurs :
<syntaxhighlight lang="yaml">
        [
        { path: "/var/tmp/test1",
          mode: "0644",
          "...": "...",
          checksum: 16fac7be61a6e4591a33ef4b729c5c3302307523
        },
        { path: "/var/tmp/test2",
          "...": "..."
        },
        ]
</syntaxhighlight>
Y accéder est un peu embêtant. Mettons que j'ai besoin d'accéder au path, je peux faire ça :
<syntaxhighlight lang='yaml'>
---
- hosts: all
  become: true
  tasks:
    - name: Récupérer les fichiers
      find:
        patterns: "*log"
        paths: /var/log
        recurse: yes
      register: fichiers
    - name: debuggage
      debug:
        msg: "{{ item.path }}"
      with_items: "{{ fichiers.files }}"
</syntaxhighlight>
Mais bon, ce n'est pas génial... Ici, on doit faire une itération sur la liste et extraire les paths à chaque fois.
On peut aussi utiliser un filtre Jinja2:
<syntaxhighlight lang='yaml'>
---
- hosts: all
  become: true
  tasks:
    - name: Récupérer les fichiers
      find:
        patterns: "*log"
        paths: /var/log
        recurse: yes
      register: fichiers
    - name: debuggage
      debug:
        msg: "{{ fichiers['files'] | map(attribute='path') | list }}"   
</syntaxhighlight>
Cette fois-ci, on a une liste de tous les paths. Mais bon, ce n'est pas génial non plus. Si j'avais des listes dans des listes, je devrais utiliser with_nested.
== Assigner des variables au milieu d'un playbook ==
Pour cela, il faut utiliser le module set_fact. En reprenant l'exemple juste avant :
<syntaxhighlight lang='yaml'>
---
- hosts: all
  become: true
  tasks:
    - name: Récupérer les fichiers
      find:
        patterns: "*log"
        paths: /var/log
        recurse: yes
      register: fichiers
    - name: Une nouvelle variable 
      set_fact:
        chemins: "{{ fichiers['files'] | map(attribute='path') | list }}"
    - name: debuggage
      debug:
        msg: "{{ chemins }}"   
</syntaxhighlight>
</syntaxhighlight>

Version du 1 octobre 2019 à 21:13

Variables Utiles & Quirks divers

Ansible contient des variable globales assez utiles. Il contient également beaucoup de fonctions particulières et part un peu dans tous les sens; cependant, on trouve toujours réponse à ses problèmes.

Ne pas avoir à ajouter l'hôte au fichier known_hosts

Ajouter dans la partie [group:vars]:

ansible_ssh_common_args='-o StrictHostKeyChecking=no'

Des caractères spéciaux dans les mots de passe

En cas d'utilisation d'un fichier d'inventaire chiffré contenant des mots de passe, il faut que ceux-ci soient entre simples quotes afin d'éviter que les caractères spéciaux comme $ ne soient interprétés.

blocks

- name: Attempt and graceful roll back demo
  block:
    - debug:
        msg: 'I execute normally'
    - name: i force a failure
      command: /bin/false
    - debug:
        msg: 'I never execute, due to the above task failing, :-('
  rescue:
    - debug:
        msg: 'I caught an error'
    - name: i force a failure in middle of recovery! >:-)
      command: /bin/false
    - debug:
        msg: 'I also never execute :-('
  always:
    - debug:
        msg: "This always executes"

tags

Il est possible de taguer des tâches afin de "faire du tri". Le but est de pouvoir choisir de n'exécuter par exemple que certains tags (avec --tags), ou de les éviter (avec --skip-tags). Ajouter des tags sur des tâches individuelles est assez simple :

<syntaxhighlight lang='yaml'> tasks: - yum:

   name: "Modèle:Item"
   state: present
 loop:
 - httpd
 - memcached
 tags:
 - packages

- template:

   src: templates/src.j2
   dest: /etc/foo.conf
 tags:
 - configuration

</syntaxhighlight>

Bien entendu, on peut appliquer le même tag à plusieurs tâches.

Héritage des tags

L'héritage de tags, c'est le fait d'ajouter à un play, des tâches importées, ou autre... des tags qui seront appliqués à toutes les tâches incluses. Cela se fait avec la syntaxe "tags: " :

<syntaxhighlight lang='yaml'> - hosts: all

 tags:
 - bar
 tasks:
   ...

- hosts: all

 tags: [ foo ]
 tasks:
   ...

</syntaxhighlight>

Accéder à la documentation

La documentation est intégrée ! Il suffit d'utiliser Ansible-doc :

<syntaxhighlight lang='bash'> [justine@argonaut filetree]$ ansible-doc --help Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]

plugin documentation tool

Options:

 -h, --help            show this help message and exit
 -j, --json            **For internal testing only** Dump json metadata for
                       all plugins.
 -l, --list            List available plugins
 -F, --list_files      Show plugin names and their source files without
                       summaries (implies --list)
 -M MODULE_PATH, --module-path=MODULE_PATH
                       prepend colon-separated path(s) to module library (def
                       ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
                       gins/modules)
 -s, --snippet         Show playbook snippet for specified plugin(s)
 -t TYPE, --type=TYPE  Choose which plugin type (defaults to module).
                       Available plugin types are : ('become', 'cache',
                       'callback', 'cliconf', 'connection', 'httpapi',
                       'inventory', 'lookup', 'shell', 'module', 'strategy',
                       'vars')
 -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                       connection debugging)
 --version             show program's version number, config file location,
                       configured module search path, module location,
                       executable location and exit

See man pages for Ansible CLI options or website for tutorials https://docs.ansible.com </syntaxhighlight>

Le module find

Le module find est un peu casse-pieds. Il si je le register dans "fichiers", alors ma variable fichiers contiendra une liste appellée "files" (et d'autres : cf la doc), laquelle sera une liste de collection clefs-valeurs :

<syntaxhighlight lang="yaml">

       [
       { path: "/var/tmp/test1",
         mode: "0644",
         "...": "...",
         checksum: 16fac7be61a6e4591a33ef4b729c5c3302307523
       },
       { path: "/var/tmp/test2",
         "...": "..."
       },
       ]

</syntaxhighlight>

Y accéder est un peu embêtant. Mettons que j'ai besoin d'accéder au path, je peux faire ça :

<syntaxhighlight lang='yaml'> --- - hosts: all

 become: true
 tasks:
   - name: Récupérer les fichiers
     find:
       patterns: "*log"
       paths: /var/log
       recurse: yes
     register: fichiers
   - name: debuggage
     debug:
       msg: "Modèle:Item.path"
     with_items: "Modèle:Fichiers.files"

</syntaxhighlight>

Mais bon, ce n'est pas génial... Ici, on doit faire une itération sur la liste et extraire les paths à chaque fois.

On peut aussi utiliser un filtre Jinja2:

<syntaxhighlight lang='yaml'> --- - hosts: all

 become: true
 tasks:
   - name: Récupérer les fichiers
     find:
       patterns: "*log"
       paths: /var/log
       recurse: yes
     register: fichiers
   - name: debuggage
     debug:
       msg: "{{ fichiers['files'] | map(attribute='path') | list }}"     

</syntaxhighlight>

Cette fois-ci, on a une liste de tous les paths. Mais bon, ce n'est pas génial non plus. Si j'avais des listes dans des listes, je devrais utiliser with_nested.

Assigner des variables au milieu d'un playbook

Pour cela, il faut utiliser le module set_fact. En reprenant l'exemple juste avant :

<syntaxhighlight lang='yaml'> --- - hosts: all

 become: true
 tasks:
   - name: Récupérer les fichiers
     find:
       patterns: "*log"
       paths: /var/log
       recurse: yes
     register: fichiers
   - name: Une nouvelle variable  
     set_fact:
       chemins: "{{ fichiers['files'] | map(attribute='path') | list }}"
   - name: debuggage
     debug:
       msg: "Modèle:Chemins"     

</syntaxhighlight>