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 18:46] – [Sources] 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 ''#'' | ||
| + | |||
| + | 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 ==== | ||
| - | Pour la rédaction des playbook, les possibilités sont nombreuses et il vaut mieux se référerer à la [[http:// | + | 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. | ||
| - | Chaque tâche (task) démarre par un tiret '' | + | Chaque tâche (task) démarre par un tiret '' |
| < | < | ||
| Ligne 137: | Ligne 244: | ||
| </ | </ | ||
| - | Lors de l' | + | Lors de l' |
| 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 faire sudo. Et toujours pour des questions de sécurité, cet utilisateur doit taper un mot de passe pour faire du sudo. 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 " |
| - | # On préviens | + | # Puis préciser qu'on cible le groupe khanat avec "-l khanat" |
| + | hosts: khanat | ||
| + | # On prévient | ||
| become: yes | become: yes | ||
| become_method: | become_method: | ||
| Ligne 162: | Ligne 276: | ||
| </ | </ | ||
| - | Puis lancer : | + | |
| - | ansible-playbook | + | Puis lancer, depuis le répertoire " |
| + | ansible-playbook playbooks/ | ||
| ==== Insérer des playbooks dans des playbooks ==== | ==== Insérer des playbooks dans des playbooks ==== | ||
| Ligne 179: | 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 185: | Ligne 327: | ||
| * [[https:// | * [[https:// | ||
| * https:// | * https:// | ||
| - | * [[http:// | + | * [[http:// |
| * [[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> |





