
Module `copy` : transférer des fichiers vers les noeuds gérés
Apprenez à utiliser le module `copy` d'Ansible pour transférer des fichiers, définir leur contenu, et gérer leurs permissions et propriétaires sur les noeuds distants.
Le module `copy` : un pilier du transfert de fichiers avec Ansible
Le module copy est l'un des outils les plus fondamentaux et fréquemment sollicités dans l'arsenal d'Ansible. Sa fonction principale est de copier des fichiers depuis le noeud de contrôle Ansible vers un ou plusieurs noeuds gérés. Que vous ayez besoin de déployer des fichiers de configuration, des scripts, des certificats SSL, ou tout autre type de fichier statique, le module copy est la solution privilégiée.
Au-delà de la simple copie, ce module offre des fonctionnalités pour définir le contenu d'un fichier directement dans votre playbook, gérer les droits de propriété (utilisateur et groupe) et les permissions du fichier sur la machine distante. Il intègre également des mécanismes pour assurer l'idempotence : si le fichier de destination existe déjà et correspond à la source (en termes de contenu et d'attributs), Ansible ne le modifiera pas, optimisant ainsi les exécutions et garantissant la stabilité de l'état désiré.
Comprendre les nuances du module copy, ses paramètres clés et ses bonnes pratiques d'utilisation est essentiel pour une gestion efficace des fichiers dans vos processus d'automatisation.
Paramètres essentiels du module `copy`
Pour utiliser efficacement le module copy, il est crucial de connaître ses principaux paramètres. Voici les plus importants, que vous utiliserez régulièrement :
src: (Chaîne de caractères) Chemin absolu ou relatif vers le fichier sur le noeud de contrôle Ansible. Ce fichier sera la source de la copie. Si ce paramètre est utilisé,contentne doit pas l'être. Si le chemin est relatif, il est interprété par rapport au répertoire où se trouve le playbook (ou le rôle, si utilisé dans un rôle).dest: (Chaîne de caractères, requis) Chemin absolu sur le noeud géré où le fichier doit être copié. Si le fichier de destination existe déjà, il sera écrasé par défaut (sauf si son contenu et ses attributs sont identiques à la source). Si le répertoire parent dedestn'existe pas, Ansible tentera de le créer.content: (Chaîne de caractères) Permet de spécifier le contenu du fichier de destination directement dans la tâche Ansible, au lieu de le lire depuis un fichier source. C'est très pratique pour créer de petits fichiers de configuration ou des fichiers texte simples sans avoir à maintenir un fichier séparé sur le noeud de contrôle. Sicontentest utilisé,srcne doit pas l'être.owner: (Chaîne de caractères) Nom de l'utilisateur qui deviendra le propriétaire du fichier sur le noeud géré. Si non spécifié, le propriétaire reste celui par défaut du système distant (souvent root si Ansible s'exécute avec des privilèges élevés).group: (Chaîne de caractères) Nom du groupe qui deviendra le groupe propriétaire du fichier sur le noeud géré.mode: (Chaîne de caractères ou nombre) Définit les permissions du fichier sur le noeud géré. Peut être spécifié en format octal (ex:0644,0755) ou en format symbolique (ex:u=rw,g=r,o=rouu+x). Il est important de noter que si vous spécifiez le mode, vous devez généralement aussi spécifierowneretgrouppour un contrôle complet, sinon Ansible pourrait tenter de préserver le mode original de manière inattendue.backup: (Booléen,yes/no, défaut:no) Si mis àyes, et si le fichier de destination existe et est sur le point d'être modifié, Ansible créera une sauvegarde du fichier original avant de le remplacer. Le nom de la sauvegarde inclura le chemin du fichier et un horodatage.
Ces paramètres constituent la base de la plupart des utilisations du module copy.
Exemples d'utilisation du module `copy`
1. Copier un fichier local vers un noeud distant
Supposons que vous ayez un fichier de configuration app_config.json dans un sous-répertoire files/ de votre playbook, et que vous souhaitiez le copier vers /etc/myapp/config.json sur vos serveurs d'application.
- name: Déployer le fichier de configuration de l'application
ansible.builtin.copy:
src: files/app_config.json # Chemin relatif au playbook
dest: /etc/myapp/config.json
owner: myapp_user
group: myapp_group
mode: '0640'Si /etc/myapp/ n'existe pas, Ansible le créera.
2. Créer un fichier avec un contenu défini directement
Pour créer un fichier /etc/motd (Message Of The Day) avec un message personnalisé :
- name: Configurer le message du jour
ansible.builtin.copy:
content: |
Bienvenue sur ce serveur !
Il est géré automatiquement par Ansible.
Veuillez ne pas effectuer de modifications manuelles non tracées.
dest: /etc/motd
owner: root
group: root
mode: '0644'Le symbole | en YAML permet d'écrire un bloc de texte sur plusieurs lignes, en préservant les sauts de ligne.
3. Copier un fichier et créer une sauvegarde
Si vous modifiez un fichier système critique comme /etc/sudoers, il est prudent de créer une sauvegarde :
- name: Mettre à jour le fichier sudoers avec sauvegarde
ansible.builtin.copy:
src: files/custom_sudoers
dest: /etc/sudoers
owner: root
group: root
mode: '0440'
backup: yesSi /etc/sudoers est modifié, une copie de l'ancien fichier sera sauvegardée dans le même répertoire avec un suffixe horodaté.
Paramètres avancés et bonnes pratiques
Le module copy dispose d'autres paramètres pour des cas d'usage plus spécifiques :
validate: (Chaîne de caractères) Spécifie une commande à exécuter sur le noeud distant après la copie du fichier pour valider sa syntaxe ou son intégrité. La chaîne doit contenir%s, qui sera remplacé par le chemin du fichier copié. Si la commande de validation retourne un code de sortie non nul, la tâchecopyéchoue et le fichier original (s'il existait) est restauré. C'est crucial pour les fichiers de configuration sensibles.
- name: Copier et valider le fichier sudoers
ansible.builtin.copy:
src: files/new_sudoers_config
dest: /etc/sudoers
owner: root
group: root
mode: '0440'
validate: 'visudo -cf %s' # Commande de validation pour sudoersforce : (Booléen, défaut: yes) Si mis à no, Ansible ne copiera pas le fichier si la destination existe déjà, même si le contenu est différent. L'utilisation de force: no est rare car elle va à l'encontre du principe de convergence vers l'état désiré, mais peut être utile dans certains scénarios très spécifiques où l'on ne veut jamais écraser un fichier existant.follow : (Booléen, défaut: yes) Si dest est un lien symbolique, par défaut (follow: yes), Ansible suivra le lien et modifiera le fichier cible du lien. Si follow: no, Ansible remplacera le lien symbolique lui-même par le nouveau fichier.unsafe_writes : (Booléen, défaut: no) Pour des raisons de sécurité et d'atomicité, Ansible copie d'abord le fichier dans un répertoire temporaire sur le noeud distant, puis le déplace atomiquement vers sa destination finale. Dans certains cas (systèmes de fichiers très restreints, SElinux strict), cette opération peut échouer. Mettre unsafe_writes: yes désactive ce mécanisme de déplacement atomique et écrit directement dans le fichier de destination. A utiliser avec prudence et seulement si nécessaire.Bonnes pratiques :
- Organisation des fichiers sources : Il est courant de placer les fichiers à copier dans un sous-répertoire nommé
files/à côté de votre playbook ou dans le répertoirefiles/d'un rôle. - Idempotence : Le module
copyest idempotent par nature. Profitez-en et ne cherchez pas à ajouter des conditions inutiles autour de son utilisation. - Utilisation de
validate: Pour les fichiers de configuration dont une syntaxe incorrecte pourrait rendre un service ou le système instable (ex:nginx.conf,sshd_config,sudoers), utilisez toujours le paramètrevalidate. - Permissions et propriétaires : Soyez explicite avec
owner,group, etmodepour assurer la sécurité et le bon fonctionnement de vos applications. - Contenu vs. source : Utilisez
contentpour des fichiers très courts et statiques. Pour des fichiers plus longs ou binaires, utilisez toujourssrc. Pour du contenu dynamique ou des templates, le moduletemplateest plus approprié quecopy.
En maîtrisant le module copy et ses options, vous disposez d'un outil puissant et fiable pour la gestion des fichiers dans vos environnements automatisés avec Ansible.