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 [2017/10/25 09:29] – zatalyz | fr:ansible [2025/05/12 06:47] (Version actuelle) – [Fichiers de base] zatalyz | ||
|---|---|---|---|
| Ligne 5: | Ligne 5: | ||
| C'est donc de la doc pour noob avec probablement des erreurs. | C'est donc de la doc pour noob avec probablement des erreurs. | ||
| - | --- //[[wiki:user: | + | --- // |
| </ | </ | ||
| - | Ansible s' | + | Ansible s' |
| Donc, suivant votre système : | Donc, suivant votre système : | ||
| 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 cherchent 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 crochet | + | Ce qui est entre crochets |
| 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. | ||
| + | |||
| + | Le principal intérêt d' | ||
| + | |||
| + | 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 a permis d' | ||
| + | |||
| + | Créez un répertoire dans lequel seront stockés vos playbooks, puis un playbook '' | ||
| + | |||
| + | Pour exécuter le playbook : | ||
| + | ansible-playbook playbooks/ | ||
| + | |||
| + | Mais avant de l' | ||
| + | |||
| + | <WRAP center round important 80%> | ||
| + | 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 ==== | ||
| + | Pour la rédaction des playbooks, les possibilités sont nombreuses et il vaut mieux se référerer à la [[http:// | ||
| + | - Nous renseignons les hosts où le playbook sera lancé | ||
| + | - Nous listons les tâches qui seront exécutées dessus | ||
| + | |||
| + | Il est possible de renseigner des variables et diverses options. | ||
| + | |||
| + | Chaque tâche (task) démarre par un tiret '' | ||
| + | |||
| + | < | ||
| + | - name: Texte décrivant la tâche | ||
| + | module: option=value | ||
| + | </ | ||
| + | |||
| + | Commençons en douceur... on reproduit notre " | ||
| + | |||
| + | <code yml khanatping.yml> | ||
| + | # Indiquer sur quels serveurs ce playbook va marcher, ici ceux du groupe " | ||
| + | - hosts: khanat | ||
| + | # Nous indiquons les tâches qui vont s' | ||
| + | tasks: | ||
| + | - action: ping | ||
| + | </ | ||
| + | |||
| + | Lors de l' | ||
| + | |||
| + | 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 d' | ||
| + | |||
| + | <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 | ||
| + | # On pourrait mettre " | ||
| + | # Puis préciser qu'on cible le groupe khanat avec "-l khanat" | ||
| + | | ||
| + | # On prévient que sur cet host et pour ce playbook, on va utiliser sudo. | ||
| + | become: yes | ||
| + | become_method: | ||
| + | # On renseigne les tâches et on leur donne des descriptions | ||
| + | tasks: | ||
| + | - name: mise à jour des dépôts | ||
| + | apt: update_cache=yes | ||
| + | |||
| + | - name: Mettre à jour les paquets | ||
| + | apt: upgrade=yes | ||
| + | |||
| + | - name: Vérifie s'il faut rebooter | ||
| + | register: reboot | ||
| + | stat: path=/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | Puis lancer, depuis le répertoire " | ||
| + | ansible-playbook playbooks/ | ||
| + | |||
| + | ==== Insérer des playbooks dans des playbooks ==== | ||
| + | Imbriquer les playbooks peut être utile. Par exemple, vous avez un playbook bien fait pour les mises à jour, mais vous souhaitez le lancer parfois pour un groupe de serveur, parfois pour un autre((Typiquement chez nous, on met à jour les hyperviseurs, | ||
| + | |||
| + | Il y a plusieurs façon de réaliser des imbrications, | ||
| + | |||
| + | Créez votre premier playbook contenant vos hosts, et appelez dedans un second playbook, qui contiendra la liste des tâches : | ||
| + | |||
| + | <code yml khanat.yml> | ||
| + | tasks: | ||
| + | - import_tasks: | ||
| + | |||
| + | <code yml includeping.yml> | ||
| + | - 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:// | ||
| + | |||
| ===== Sources ===== | ===== Sources ===== | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * https:// | ||
| + | * [[http:// | ||
| + | * [[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> |





