Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| fr:ansible [2020/10/25 18:43] – ↷ Liens modifiés en raison d'un déplacement. zatalyz | fr:ansible [2025/05/12 06:47] (Version actuelle) – [Fichiers de base] zatalyz | ||
|---|---|---|---|
| Ligne 16: | Ligne 16: | ||
| ... | ... | ||
| - | Le fichier de configuration se trouve dans ''/ | + | Seul point important : il faut que python((Python3, |
| - | <WRAP center round info 60%> | + | ===== Agent ssh ===== |
| - | Sur Archlinux, il est surtout plein de lignes commentées, | + | |
| - | </ | + | |
| - | Ensuite on va renseigner ses serveurs. | + | Pensez à activer [[fr: |
| - | Par défaut, Ansible les cherche dans ''/etc/ansible/ | + | L'agent ssh est un passage **obligé** avec ansible (à moins d'utiliser une paire de clefs sans passphrase, ce qui est déconseillé). |
| - | ansible -i / | + | |
| - | Créer un ou des fichiers ailleurs a deux avantages : | + | < |
| - | * cela permet de séparer suivant les infrastructures, | + | ssh-add ~/.ssh/id_ed25519< |
| - | * cela permet de renseigner son fichier hosts sans avoir besoin des droits root, par exemple en le mettant dans '' | + | |
| - | ===== Renseigner le fichier ansible/ | ||
| - | Il y a visiblement plusieurs syntaxes possibles | + | ===== Fichiers de base ===== |
| + | Généralement on se crée sa propre arborescence | ||
| - | <code ini>mail.example.com | + | Il y a beaucoup de possibilités, |
| + | * ansible.cfg : stocke la configuration adapté à notre usage d' | ||
| + | * hosts : liste les serveurs sur lesquels on va utiliser ansible. | ||
| + | * playbook.yml : une recette à appliquer sur les serveurs. | ||
| + | Une architecture propre (et complexe) peut ressembler à ceci : | ||
| + | |||
| + | < | ||
| + | ├── ansible.cfg | ||
| + | ├── hosts # Inventaire des machines | ||
| + | ├── group_vars/ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | ├── host_vars/ | ||
| + | │ | ||
| + | │ | ||
| + | ├── vars/ # Variables globales (optionnel si group/ | ||
| + | │ | ||
| + | ├── playbooks/ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | ├── roles/ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | ├── files/ | ||
| + | │ | ||
| + | ├── templates/ | ||
| + | │ | ||
| + | ├── scripts/ | ||
| + | │ | ||
| + | └── vault/ | ||
| + | └── secrets.yml | ||
| + | </ | ||
| + | |||
| + | Quelques définitions rapides : | ||
| + | * Un playbook est la liste de " | ||
| + | * Un rôle est un module qui pourra être appelé dans divers playbooks. Ça évite de se répéter : on importe juste le role dans le playbook. | ||
| + | ==== ansible.cfg ==== | ||
| + | |||
| + | Un fichier minimal ressemble à ça : | ||
| + | <code ini ansible.cfg> | ||
| + | [defaults] | ||
| + | inventory = hosts | ||
| + | retry_files_enabled = False | ||
| + | timeout = 10 | ||
| + | </ | ||
| + | |||
| + | Voir [[https:// | ||
| + | |||
| + | ==== hosts ==== | ||
| + | Le fichier où on renseigne ses serveurs. | ||
| + | |||
| + | Par défaut, Ansible les cherche dans ''/ | ||
| + | ansible -i / | ||
| + | |||
| + | Créer un ou des fichiers a quelques avantages : | ||
| + | * cela permet de séparer suivant les infrastructures, | ||
| + | * cela permet de renseigner son fichier hosts sans avoir besoin des droits root, typiquement quand c'est dans home... | ||
| + | |||
| + | Il y a visiblement plusieurs syntaxes possibles (peut-être à paramétrer dans ''/ | ||
| + | |||
| + | <code ini> | ||
| [webservers] | [webservers] | ||
| - | foo.example.com | + | foo.example.org |
| - | bar.example.com | + | bar.example.org |
| [dbservers] | [dbservers] | ||
| - | one.example.com | + | one.example.org |
| - | two.example.com | + | two.example.org |
| - | three.example.com | + | three.example.org |
| + | |||
| + | [webservers: | ||
| + | ansible_python_interpreter=/ | ||
| </ | </ | ||
| - | Ce qui est entre crochets est le nom donné à un groupe et ce nom est libre, mais il ne doit pas reprendre un nom des serveurs gérés dessous. Ici par exemple, il y a un groupe de serveurs qui concerne le web, un autre groupe avec les machines hébergeant les bases de données ; les noms ont été choisis pour être parlants. | + | Ce qui est entre crochets est le nom donné à un groupe et ce nom est libre, mais il ne doit pas reprendre un nom des serveurs gérés dessous. Ici par exemple, il y a un groupe de serveurs qui concerne le web, un autre groupe avec les machines hébergeant les bases de données ; ils sont déclarés avec leur nom de domaine. |
| Les serveurs renseignés dessous peuvent l' | Les serveurs renseignés dessous peuvent l' | ||
| - | * d' | + | * d' |
| * d' | * d' | ||
| - | * d' | + | * d' |
| - | ==== Agent ssh et test ==== | + | La partie “vars” précisent des variables affectant tout le groupe : ici, déclarer le chemin de python afin d' |
| - | <WRAP center round important 60%> | ||
| - | Pensez à activer [[fr: | ||
| - | L' | ||
| - | |||
| - | eval " | ||
| - | ssh-add ~/ | ||
| - | </ | ||
| - | |||
| - | <WRAP center round info 90%> | ||
| Pour tester votre configuration, | Pour tester votre configuration, | ||
| - | Exemple avec l'host suivant : | + | Exemple avec l'host suivant, où les serveurs sont déclarés d' |
| <code ini> | <code ini> | ||
| Ligne 74: | Ligne 136: | ||
| lirria | lirria | ||
| jukni | jukni | ||
| + | |||
| + | [khanat: | ||
| + | ansible_python_interpreter=/ | ||
| </ | </ | ||
| Ligne 90: | Ligne 155: | ||
| </ | </ | ||
| - | </ | + | ===== Playbooks ===== |
| + | On va entrer dans le vif du sujet : automatiser des trucs. | ||
| - | ===== Suite de commandes : playbooks ===== | + | Le principal intérêt |
| - | L'une des grandes forces | + | |
| - | Un exemple très bête : la mise à jour des dépôts, le téléchargement et déployement de nouveaux paquets. Le tout en gardant un œil quand même pour voir si tout se passe bien... Cette action est à faire régulièrement sur les serveurs : elle peut se scripter via Ansible. | + | Un exemple très bête : la mise à jour des dépôts, le téléchargement et déployement de nouveaux paquets. Le tout en gardant un œil quand même pour voir si tout se passe bien... Cette action est à faire régulièrement sur les serveurs : elle peut se scripter via Ansible((Dans les faits, c'est là que j'ai lâché Ansible la première fois, parce que justement cette opération de base n'est pas si transparente et fiable que ça. Quand j' |
| - | La première manipulation de cet article | + | La première manipulation de cet article |
| - | Créez un répertoire dans lequel seront stockés vos playbooks, puis un playbook | + | Créez un répertoire dans lequel seront stockés vos playbooks, puis un playbook |
| - | mkdir ./ | + | |
| - | nano ./ | + | |
| Pour exécuter le playbook : | Pour exécuter le playbook : | ||
| - | ansible-playbook | + | ansible-playbook playbooks/ |
| Mais avant de l' | Mais avant de l' | ||
| - | <WRAP center round important | + | <WRAP center round important |
| YAML est assez strict sur les indentations. Si vous avez des erreurs lors de vos premiers palybooks, c'est peut-être à cause d'une espace manquante... | YAML est assez strict sur les indentations. Si vous avez des erreurs lors de vos premiers palybooks, c'est peut-être à cause d'une espace manquante... | ||
| </ | </ | ||
| + | ==== Syntaxe ==== | ||
| + | Dans les playbooks et la configuration | ||
| + | * Commentaires avec ''#'' | ||
| + | |||
| + | Dans les appels en ligne de commande (plus de détails avec '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ==== Actions de sudoers sur les serveurs ==== | ||
| + | Il est plus que probable que certains automatismes vous demande sudo((Et c'est mieux que de se connecter en root. Si vous faites ça, je refuse de vous parler.)). Il faut donc donner le mot de passe sudoer à Ansible. | ||
| + | |||
| + | Pour cela, deux méthodes : | ||
| + | * la commande '' | ||
| + | * le fichier '' | ||
| + | |||
| + | Malheureusement je n'ai pas trouvé comment faire pour qu' | ||
| + | |||
| + | ansible-playbook superplaybook.yml -K | ||
| + | |||
| + | On peut aussi gérer des secrets dans un fichier chiffré, dont le mot de passe sudo. | ||
| + | |||
| + | Créer un fichier chiffré où stocker des infos sensibles : | ||
| + | ansible-vault create password.yml | ||
| + | |||
| + | Il faut définir un mot de passe pour ouvrir le fichier en question. | ||
| + | |||
| + | Dans le fichier en question, ajouter cette ligne pour stocker le mot de passe sudo : | ||
| + | ansible_become_pass: | ||
| + | |||
| + | Pour éditer : | ||
| + | ansible-vault edit password.yml | ||
| + | |||
| + | Dans les playbooks, chaque fois qu'on a besoin de sudo, on aura ces lignes au début : | ||
| + | |||
| + | < | ||
| + | vars_files: | ||
| + | - password.yml</ | ||
| + | En adaptant le chemin à votre architecture de dossier, bien sûr. | ||
| + | |||
| + | On peut aussi ajouter '' | ||
| ==== Écrire un playbook ==== | ==== Écrire un playbook ==== | ||
| Ligne 141: | Ligne 248: | ||
| Allons un peu plus loin et créons un playbook pour mettre à jour un serveur Debian. La lecture des [[http:// | Allons un peu plus loin et créons un playbook pour mettre à jour un serveur Debian. La lecture des [[http:// | ||
| - | Les mises à jour doivent se faire avec les droits root. Mais comme on respecte les règles de sécurité, on ne se connecte jamais directement en root mais via un utilisateur ayant le droit de devenir root via sudo. Et toujours pour des questions de sécurité, cet utilisateur doit taper son mot de passe pour devenir root. On ajoutera donc la commande '' | + | Les mises à jour doivent se faire avec les droits root. Mais comme on respecte les règles de sécurité, on ne se connecte jamais directement en root mais via un utilisateur ayant le droit d' |
| <code yml maj_base.yml> | <code yml maj_base.yml> | ||
| + | --- | ||
| + | # J'aime bien rappeler la commande avec les bonnes options à lancer pour le playbook au début | ||
| + | # Ça aide quand on revient sur un playbook après quelques temps. | ||
| + | # ansible-playbook playbooks/ | ||
| + | - name: Création d'une utilisatrice avec clé SSH | ||
| # Nos hôtes concernés par le playbook | # Nos hôtes concernés par le playbook | ||
| - | - hosts: khanat | + | # On pourrait mettre " |
| + | # Puis préciser qu'on cible le groupe khanat avec "-l khanat" | ||
| + | hosts: khanat | ||
| # On prévient que sur cet host et pour ce playbook, on va utiliser sudo. | # On prévient que sur cet host et pour ce playbook, on va utiliser sudo. | ||
| become: yes | become: yes | ||
| Ligne 163: | Ligne 277: | ||
| </ | </ | ||
| - | Puis lancer : | + | Puis lancer, depuis le répertoire " |
| - | ansible-playbook | + | ansible-playbook playbooks/ |
| ==== Insérer des playbooks dans des playbooks ==== | ==== Insérer des playbooks dans des playbooks ==== | ||
| Ligne 180: | Ligne 294: | ||
| - action: ping | - action: ping | ||
| </ | </ | ||
| + | |||
| + | ==== Mises à jour Debian via Ansible ==== | ||
| + | |||
| + | Pour les mises à jour sur Debian, utiliser apt-listbug est complexe avec Ansible, et sans, le risque existe de mettre à jour des paquets avec des bugs gênants et pourtant référencés. On travaille en stable, généralement, | ||
| + | |||
| + | <wrap important> | ||
| + | <code yaml apt-listbug.yml> | ||
| + | shell: | | ||
| + | apt-get update -qq && apt-listbugs -y -T critical, | ||
| + | register: bugscan | ||
| + | ignore_errors: | ||
| + | |||
| + | - name: Afficher les bugs trouvés | ||
| + | debug: | ||
| + | var: bugscan.stdout_lines | ||
| + | |||
| + | - name: Stopper si des bugs critiques sont listés | ||
| + | fail: | ||
| + | msg: "Des bugs critiques ont été détectés, mise à jour arrêtée." | ||
| + | when: bugscan.stdout is search(" | ||
| + | </ | ||
| + | |||
| + | Voir aussi [[https:// | ||
| + | |||
| + | ==== Astuces diverses ==== | ||
| + | * Il est possible d' | ||
| + | * [[https:// | ||
| Ligne 189: | Ligne 330: | ||
| * [[https:// | * [[https:// | ||
| + | ===== Ansible ou bash ? ===== | ||
| + | Parce qu'il faut savoir critiquer ! | ||
| + | |||
| + | Ansible est intéressant pour faire les mêmes choses sur plusieurs serveurs. D'un autre côté sa syntaxe particulière demande un apprentissage. Et je passe parfois un temps fou à trouver comment réaliser un truc avec Ansible, alors qu' | ||
| + | |||
| + | Pour un certain nombre de tâches, Bash a un avantage indéniable. Il s' | ||
| + | |||
| + | Parfois, Ansible ressemble à un tank sorti pour écraser une mouche. Parfois, c'est Bash. Pour chaque type d' | ||
| + | |||
| + | Ansible permet tout de même quelque chose d' | ||
| + | |||
| + | Pour le reste, si nous arrivons à avoir une collection de playbooks (et de scripts !) réellement pertinentes, | ||
| {{tag> | {{tag> | ||





