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 [2018/02/05 11:45] – 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. | ||
| - | ==== 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 | + | Un exemple très bête : la mise à jour des dépôts, le téléchargement et déployement |
| - | 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'un espace | + | 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 |
| </ | </ | ||
| + | ==== Syntaxe ==== | ||
| + | Dans les playbooks et la configuration | ||
| + | * Commentaires avec ''#'' | ||
| - | === Écrire un playbook === | + | Dans les appels en ligne de commande (plus de détails avec '' |
| - | Pour la rédaction des playbook, les possibilités sont nombreuses et il vaut mieux se référerer à la [[http:// | + | * '' |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ==== 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 renseignons les hosts où le playbook sera lancé | ||
| - Nous listons les tâches qui seront exécutées dessus | - Nous listons les tâches qui seront exécutées dessus | ||
| Ligne 120: | Ligne 227: | ||
| Il est possible de renseigner des variables et diverses options. | Il est possible de renseigner des variables et diverses options. | ||
| - | Commençons en douceur... | + | 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 " | # Indiquer sur quels serveurs ce playbook va marcher, ici ceux du groupe " | ||
| - hosts: khanat | - hosts: khanat | ||
| Ligne 130: | Ligne 244: | ||
| </ | </ | ||
| - | Lors de l' | + | Lors de l' |
| - | '', | + | |
| - | Allons un peu plus loin. Chaque tâche (task) démarre par un tiret '' | + | Allons un peu plus loin et créons |
| - | < | + | 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' |
| - | - name: Texte décrivant | + | |
| - | module: option=value | + | |
| - | </ | + | |
| - | Pour les mises à jour sur debian, la lecture des [[http:// | + | <code yml maj_base.yml> |
| - | + | --- | |
| - | < | + | # J'aime bien rappeler la commande avec les bonnes options |
| - | - hosts: khanat | + | # Ça aide quand on revient |
| + | # ansible-playbook playbooks/maj_base.yml -K -l HOST | ||
| + | - 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" | ||
| + | hosts: 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: | tasks: | ||
| - name: mise à jour des dépôts | - name: mise à jour des dépôts | ||
| Ligne 155: | Ligne 275: | ||
| stat: path=/ | stat: path=/ | ||
| - | - name: Reboot les services (si besoin?) | ||
| - | shell: needrestart -ra -l | ||
| - | when: reboot.stat.exists == false | ||
| </ | </ | ||
| + | |||
| + | 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 ===== | ||
| Ligne 164: | Ligne 327: | ||
| * [[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> |





