diff --git a/HowtoAnsible.md b/HowtoAnsible.md index 59829cea..4826e625 100644 --- a/HowtoAnsible.md +++ b/HowtoAnsible.md @@ -26,7 +26,7 @@ ansible 2.7.7 Ansible peut exécuter des actions sur des machines distantes. Mais certains logiciels sont requis : * *Debian 6* et supérieur : `# apt-get install --no-install-recommends python python-apt dbus sudo` -* *Debian 4 / 5* : utiliser le module [raw](https://docs.ansible.com/ansible/raw_module.html) d'Ansible +* *Debian 4 / 5* : utiliser le module [raw](https://docs.ansible.com/ansible/2.7/modules/raw_module.html) d'Ansible * *OpenBSD* : voir **[pré-requis pour OpenBSD](#pré-requis-openbsd)** * *FreeBSD* : `# pkg install python` @@ -88,17 +88,17 @@ Enfin, pour s'exécuter sur un ensemble de machines, Ansible a besoin d'un [inve ### modules - + Un module est comme une bibliothèque. Il constitue une couche d'abstraction par rapport au shell et commandes sous-jacentes. C'est cette couche qui permet l'idempotence et le fonctionnement sur plusieurs plateformes. -Les modules disposent de certains comportements et fonctionnalités communs : indication de succès/erreurs/changements, gestion des [variables](http://docs.ansible.com/ansible/playbooks_variables.html), des [conditions](http://docs.ansible.com/ansible/playbooks_conditionals.html), des [boucles](http://docs.ansible.com/ansible/playbooks_loops.html), des états de sortie… +Les modules disposent de certains comportements et fonctionnalités communs : indication de succès/erreurs/changements, gestion des [variables](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html), des [conditions](https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html), des [boucles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html), des états de sortie… Pour avoir la liste des modules utilisables : `ansible-doc -l` Voici quelques exemples de modules que nous utilisons : -* Module [command](http://docs.ansible.com/ansible/command_module.html) : +* Module [command](https://docs.ansible.com/ansible/2.7/modules/command_module.html) : ~~~{.yaml} - command: date @@ -106,7 +106,7 @@ Voici quelques exemples de modules que nous utilisons : Ce module ne permet que l'exécution de commandes simple (pas de pipe…) mais en échange il vérifie les commandes et les assainit pour limiter les injections. -* Module [shell](http://docs.ansible.com/ansible/shell_module.html) : +* Module [shell](https://docs.ansible.com/ansible/2.7/modules/shell_module.html) : ~~~{.yaml} - shell: cat foo.txt | grep bar @@ -114,7 +114,7 @@ Ce module ne permet que l'exécution de commandes simple (pas de pipe…) mais e Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute commande, au sein d'un shell lancé pour l'occasion. -* Module [file](http://docs.ansible.com/ansible/file_module.html) : +* Module [file](https://docs.ansible.com/ansible/2.7/modules/file_module.html) : ~~~{.yaml} - file: @@ -122,7 +122,7 @@ Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute state: absent ~~~ -* Module [copy](http://docs.ansible.com/ansible/copy_module.html) : +* Module [copy](https://docs.ansible.com/ansible/2.7/modules/copy_module.html) : ~~~{.yaml} - copy @@ -133,7 +133,7 @@ Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute mode: "0644" ~~~ -* Module [replace](http://docs.ansible.com/ansible/replace_module.html) : +* Module [replace](https://docs.ansible.com/ansible/2.7/modules/replace_module.html) : ~~~{.yaml} - replace: @@ -142,7 +142,7 @@ Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute replace: '\1,{{ name }}' ~~~ -* Module [lineinfile](http://docs.ansible.com/ansible/lineinfile_module.html) : +* Module [lineinfile](https://docs.ansible.com/ansible/2.7/modules/lineinfile_module.html) : ~~~{.yaml} - lineinfile: @@ -161,7 +161,7 @@ Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute * avec _lineinfile_, si l'on veut utiliser une référence (`\1`) dans _line_, ça donne une erreur, il faut utiliser _replace_ * avec _lineinfile_, l'argument `backrefs: yes` sert à utiliser une référence au sein de l'argument _regexp_ (et non pas au sein de l'argument _line_). -* Module [blockinfile](http://docs.ansible.com/ansible/blockinfile_module.html) : +* Module [blockinfile](https://docs.ansible.com/ansible/2.7/modules/blockinfile_module.html) : ~~~{.yaml} - blockinfile: @@ -171,7 +171,7 @@ Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute ## Set rights on files and directories written by Apache ~~~ -* Module [ini_file](http://docs.ansible.com/ansible/ini_file_module.html) : +* Module [ini_file](https://docs.ansible.com/ansible/2.7/modules/ini_file_module.html) : ~~~{.yaml} - ini_file: @@ -184,7 +184,7 @@ Ce module permet en revanche d'exécuter arbitrairement et sans contrôle toute Ce module permet de facilement d'ajouter/modifier/supprimer des valeurs dans des fichiers INI, dans la bonne section, sans se soucier de la syntaxe. -* Module [user](http://docs.ansible.com/ansible/user_module.html) : +* Module [user](https://docs.ansible.com/ansible/2.7/modules/user_module.html) : ~~~{.yaml} - user: @@ -197,7 +197,7 @@ Ce module permet de facilement d'ajouter/modifier/supprimer des valeurs dans des password: '$6$k/Fg76xH' ~~~ -* Module [group](http://docs.ansible.com/ansible/group_module.html) : +* Module [group](https://docs.ansible.com/ansible/2.7/modules/group_module.html) : ~~~{.yaml} - group: @@ -206,7 +206,7 @@ Ce module permet de facilement d'ajouter/modifier/supprimer des valeurs dans des gid: "1042" ~~~ -* Module [stat](http://docs.ansible.com/ansible/stat_module.html) : +* Module [stat](https://docs.ansible.com/ansible/2.7/modules/stat_module.html) : ~~~{.yaml} - stat: @@ -214,7 +214,7 @@ Ce module permet de facilement d'ajouter/modifier/supprimer des valeurs dans des register: foo_sudoers_file ~~~ -* Module [apt](http://docs.ansible.com/ansible/apt_module.html) : +* Module [apt](https://docs.ansible.com/ansible/2.7/modules/apt_module.html) : ~~~{.yaml} - apt: @@ -229,7 +229,7 @@ Ce module permet de facilement d'ajouter/modifier/supprimer des valeurs dans des Ce module fait partie d'une courte liste de modules pour lesquels l'utilisation d'une boucle (avec `with_items` par exemple) ne provoque pas l'exécution séquentielle et répétée du module. Dans l'exemple ci-dessus le module utilisera "apt" intelligemment. -* Module [apt_repository](http://docs.ansible.com/ansible/apt_repository_module.html) : +* Module [apt_repository](https://docs.ansible.com/ansible/2.7/modules/apt_repository_module.html) : ~~~{.yaml} - name: exemple @@ -241,7 +241,7 @@ Ce module fait partie d'une courte liste de modules pour lesquels l'utilisation L'indication "filename" permet de référencer le dépôt dans `/etc/apt/sources.list.d/.list`. -* Module [mysql_user](http://docs.ansible.com/ansible/mysql_user_module.html) : +* Module [mysql_user](https://docs.ansible.com/ansible/2.7/modules/mysql_user_module.html) : ~~~{.yaml} - mysql_user: @@ -255,7 +255,7 @@ L'indication "filename" permet de référencer le dépôt dans `/etc/apt/sources Lorsqu'une réplication est en place, on peut choisir de ne pas propager l'action dans les binlogs, avec l'option `sql_log_bin: no`. -* module [mysql_variables](http://docs.ansible.com/ansible/latest/mysql_variables_module.html) +* module [mysql_variables](https://docs.ansible.com/ansible/2.7/modules/latest/mysql_variables_module.html) ~~~{.yaml} - mysql_variables: @@ -265,7 +265,7 @@ Lorsqu'une réplication est en place, on peut choisir de ne pas propager l'actio Cela permet d'exécuter une commande du type "SET GLOBAL read_only = 1;" de manière idempotente. -* module [htpasswd](http://docs.ansible.com/ansible/latest/htpasswd_module.html) +* module [htpasswd](https://docs.ansible.com/ansible/2.7/modules/latest/htpasswd_module.html) ~~~{.yaml} - htpasswd: @@ -279,7 +279,7 @@ Cela permet d'exécuter une commande du type "SET GLOBAL read_only = 1;" de mani Il nécessite la bibliothèque Python "passlib", installable sous Debian grace au paquet "python-passlib". -* Module [sysctl](http://docs.ansible.com/ansible/sysctl_module.html) : +* Module [sysctl](https://docs.ansible.com/ansible/2.7/modules/sysctl_module.html) : ~~~{.yaml} - name: exemple @@ -289,7 +289,7 @@ Il nécessite la bibliothèque Python "passlib", installable sous Debian grace a sysctl_file: /etc/sysctl.d/elasticsearch.conf ~~~ -* Module [alternatives](http://docs.ansible.com/ansible/alternatives_module.html) : +* Module [alternatives](https://docs.ansible.com/ansible/2.7/modules/alternatives_module.html) : ~~~{.yaml} - alternatives: @@ -297,7 +297,7 @@ Il nécessite la bibliothèque Python "passlib", installable sous Debian grace a path: /usr/bin/vim.basic ~~~ -* Module [service](http://docs.ansible.com/ansible/service_module.html) : +* Module [service](https://docs.ansible.com/ansible/2.7/modules/service_module.html) : ~~~{.yaml} - name: exemple pour redémarrer un service (compatible avec sysvinit, systemd…) @@ -305,7 +305,7 @@ Il nécessite la bibliothèque Python "passlib", installable sous Debian grace a state: restarted ~~~ -* Module [openbsd_pkg](http://docs.ansible.com/ansible/openbsd_pkg_module.html) : +* Module [openbsd_pkg](https://docs.ansible.com/ansible/2.7/modules/openbsd_pkg_module.html) : ~~~{.yaml} - openbsd_pkg: @@ -316,7 +316,7 @@ Il nécessite la bibliothèque Python "passlib", installable sous Debian grace a - vim--no_x11 ~~~ -* module [timezone](http://docs.ansible.com/ansible/timezone_module.html) : +* module [timezone](https://docs.ansible.com/ansible/2.7/modules/timezone_module.html) : ~~~{.yaml} - timezone: @@ -327,7 +327,7 @@ Si systemd est présent, le module utilise `timedatectl`. Sinon, sur Debian il utilise "/etc/timezone" et reconfigure le paquet "tzdata". -* module [git](http://docs.ansible.com/ansible/latest/git_module.html) : +* module [git](https://docs.ansible.com/ansible/2.7/modules/latest/git_module.html) : ~~~{.yaml} - git: @@ -352,7 +352,7 @@ Pour avoir plus d'infos sur un module : ### playbook - + Un playbook va ensuite dérouler des actions qui seront organisées en _tasks_, [roles](#roles) et [handlers](#handlers). @@ -488,7 +488,7 @@ Dans des rôles longs, nous conseillons de purger les handlers de temps en temps ### roles - + Lorsqu'on a besoin d'utiliser des fichiers ou _templates_ à copier, des variables avec des valeurs par défaut, des handlers… on peut organiser tout cela dans un **role** en respectant la structure conventionnelle suivante : @@ -518,7 +518,7 @@ Cette structure permet à Ansible de retrouver automatiquement les fichiers et d ### inventory - + La partie **inventory** correspond à la description de l'inventaire des serveurs à configurer et inclus un mécanisme de configuration individuelle et par groupe. @@ -563,9 +563,9 @@ proxy=proxy.mercerie.example.com On peut aussi créer des groupes de groupes en utilisant `:children` -On peut aussi découper le fichier "inventory" selon les groupes et les variables : +On peut aussi découper le fichier "inventory" selon les groupes et les variables : -Les variables propres à Ansible : +Les variables propres à Ansible : ### variables @@ -581,7 +581,7 @@ tasks: - command: echo {{ ip }} >> {{ conf_file }} ~~~ -Les variables peuvent être définies à de multiples niveaux, chacun ayant une certaine précédence (extrait de la [documentation](http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)) : +Les variables peuvent être définies à de multiples niveaux, chacun ayant une certaine précédence (extrait de la [documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)) : * role defaults * inventory vars @@ -613,7 +613,7 @@ Pour gérer de nombreuses variables dans un projet, on peut stocker toutes celle    └── hostname2.yml # … les variables du serveur "hostname2" ~~~ -Les groupes sont définis dans le fichier d'[inventaire](http://docs.ansible.com/ansible/intro_inventory.html). +Les groupes sont définis dans le fichier d'[inventaire](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html). ### Tags @@ -666,7 +666,7 @@ Pour certains modules, `register` est presque un passage obligatoire pour une ut ### Vault - + Un Vault permet d'avoir un fichier protégé par un mot de passe. @@ -748,7 +748,7 @@ b: [3, 4, 5] c: a | union(b) | unique ~~~ -Il existe plein de [filtres sur les listes](http://docs.ansible.com/ansible/latest/playbooks_filters.html#list-filters) ; `union`, `intersect`, `difference`, `unique`, `sort`… +Il existe plein de [filtres sur les listes](https://docs.ansible.com/ansible/latest/user_guide/latest/playbooks_filters.html#list-filters) ; `union`, `intersect`, `difference`, `unique`, `sort`… * liste avec valeur par défaut (variable vide, indéfinie ou liste vide) @@ -1082,7 +1082,7 @@ tasks: with_dict: "{{ users }}" ~~~ -#### [with_first_found](http://docs.ansible.com/ansible/playbooks_loops.html#finding-first-matched-files) +#### [with_first_found](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#finding-first-matched-files) Permet de prendre le premier fichier trouvé : @@ -1311,7 +1311,7 @@ Voir [/HowtoAnsible/Exemples](). ## Ressources utiles -* [Documentation officielle](http://docs.ansible.com/ansible/) (voir notamment la partie [Best Practices](http://docs.ansible.com/ansible/playbooks_best_practices.html)) +* [Le « User Guide »](https://docs.ansible.com/ansible/latest/user_guide/) (voir notamment la partie [Best Practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)) * Vidéos [ansible-best-practices](https://www.ansible.com/ansible-best-practices) et [ansible-tips-and-tricks](https://www.ansible.com/ansible-tips-and-tricks) * [Ansible 101 - on a Cluster of Raspberry Pi 2s](https://www.youtube.com/watch?v=ZNB1at8mJWY) * Sysadmin Casts (épisodes [43](https://sysadmincasts.com/episodes/43-19-minutes-with-ansible-part-1-4), [45](https://sysadmincasts.com/episodes/45-learning-ansible-with-vagrant-part-2-4), [46](https://sysadmincasts.com/episodes/46-configuration-management-with-ansible-part-3-4) et [47](https://sysadmincasts.com/episodes/47-zero-downtime-deployments-with-ansible-part-4-4))