Gestion avancée des fichiers avec Ansible
Dans cette dernière étape, nous allons explorer quelques techniques avancées de gestion de fichiers avec Ansible, notamment les permissions de fichiers, la création conditionnelle de fichiers et l'utilisation de plusieurs modules liés aux fichiers.
Définition des permissions et de la propriété des fichiers
Lors de la création de fichiers, vous devez souvent définir des permissions et une propriété spécifiques. Créons un playbook qui le démontre :
- Créez un nouveau fichier dans le WebIDE :
- Naviguez vers le répertoire
~/project/ansible-files
- Faites un clic droit et sélectionnez "New File"
- Nommez le fichier
file_permissions.yml
- Ajoutez le contenu suivant :
---
- name: Manage file permissions and ownership
hosts: local
tasks:
- name: Create a script file with execute permissions
copy:
dest: ~/project/script.sh
content: |
#!/bin/bash
echo "This script was created by Ansible"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
mode: "0755"
- name: Create a read-only configuration file
copy:
dest: ~/project/readonly.conf
content: |
## This is a read-only configuration file
setting1 = value1
setting2 = value2
mode: "0444"
Dans ce playbook :
- Le paramètre
mode
est utilisé pour définir les permissions des fichiers.
0755
signifie lecture, écriture et exécution pour le propriétaire, et lecture et exécution pour le groupe et les autres.
0444
signifie lecture seule pour tout le monde.
- Exécutez le playbook :
cd ~/project/ansible-files
ansible-playbook file_permissions.yml
Vous devriez voir une sortie similaire à :
PLAY [Manage file permissions and ownership] **********************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a script file with execute permissions] **************************
changed: [localhost]
TASK [Create a read-only configuration file] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Vérifions les permissions des fichiers créés :
ls -l ~/project/script.sh ~/project/readonly.conf
Vous devriez voir une sortie similaire à :
-rwxr-xr-x 1 labex labex 118 Aug 15 12:34 /home/labex/project/script.sh
-r--r--r-- 1 labex labex 73 Aug 15 12:34 /home/labex/project/readonly.conf
- Vérifions que le script peut être exécuté :
~/project/script.sh
Vous devriez voir une sortie similaire à :
This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files
Création conditionnelle de fichiers
Parfois, vous devez créer des fichiers uniquement lorsque certaines conditions sont remplies. Créons un playbook qui démontre la création conditionnelle de fichiers :
- Créez un nouveau fichier dans le WebIDE :
- Naviguez vers le répertoire
~/project/ansible-files
- Faites un clic droit et sélectionnez "New File"
- Nommez le fichier
conditional_file.yml
- Ajoutez le contenu suivant :
---
- name: Conditional file creation
hosts: local
vars:
environment: "development"
create_debug_file: true
create_backup: false
tasks:
- name: Create environment-specific configuration
copy:
dest: "~/project/{{ environment }}_config.yml"
content: |
## Configuration for {{ environment }} environment
debug: {{ 'enabled' if environment == 'development' else 'disabled' }}
log_level: {{ 'DEBUG' if environment == 'development' else 'INFO' }}
- name: Create debug log file
copy:
dest: ~/project/debug.log
content: |
## Debug log file
## Created: {{ ansible_date_time.iso8601 }}
mode: "0644"
when: create_debug_file
- name: Create backup directory
file:
path: ~/project/backup
state: directory
mode: "0755"
when: create_backup
Dans ce playbook :
- La directive
when
est utilisée pour l'exécution conditionnelle des tâches.
- Les conditionnels Jinja2 sont utilisés dans le contenu du fichier pour modifier les valeurs en fonction des variables.
- Le module
file
est utilisé pour créer un répertoire.
- Exécutez le playbook :
cd ~/project/ansible-files
ansible-playbook conditional_file.yml
Vous devriez voir une sortie similaire à :
PLAY [Conditional file creation] **********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create environment-specific configuration] ******************************
changed: [localhost]
TASK [Create debug log file] **************************************************
changed: [localhost]
TASK [Create backup directory] ************************************************
skipped: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Remarquez que la tâche "Create backup directory" a été ignorée car create_backup
était défini sur false
.
- Examinons les fichiers créés :
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup
Vous devriez voir le contenu des deux fichiers qui ont été créés et confirmer qu'aucun répertoire de sauvegarde n'a été créé.
Utilisation de plusieurs modules liés aux fichiers
Ansible fournit plusieurs modules pour la gestion des fichiers. Créons un playbook qui démontre l'utilisation de plusieurs modules liés aux fichiers :
- Créez un nouveau fichier dans le WebIDE :
- Naviguez vers le répertoire
~/project/ansible-files
- Faites un clic droit et sélectionnez "New File"
- Nommez le fichier
file_modules.yml
- Ajoutez le contenu suivant :
---
- name: Demonstrate file-related modules
hosts: local
tasks:
- name: Create a directory
file:
path: ~/project/ansible_demo
state: directory
mode: "0755"
- name: Create a file using the copy module
copy:
dest: ~/project/ansible_demo/copied.txt
content: "This file was created using the copy module.\n"
- name: Create a symbolic link
file:
src: ~/project/ansible_demo/copied.txt
dest: ~/project/ansible_demo/link_to_copied.txt
state: link
- name: Create a file with blockinfile module
blockinfile:
path: ~/project/ansible_demo/block.txt
create: true
block: |
This is a block of text
that will be inserted
as a single unit.
marker: "## {mark} ANSIBLE MANAGED BLOCK"
Dans ce playbook :
- Le module
file
est utilisé avec state: directory
pour créer un répertoire.
- Le module
file
est utilisé avec state: link
pour créer un lien symbolique.
- Le module
blockinfile
est utilisé pour créer un fichier avec un bloc de texte entouré de commentaires de marqueur.
- Exécutez le playbook :
cd ~/project/ansible-files
ansible-playbook file_modules.yml
Vous devriez voir une sortie similaire à :
PLAY [Demonstrate file-related modules] ***************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a directory] *****************************************************
changed: [localhost]
TASK [Create a file using the copy module] ************************************
changed: [localhost]
TASK [Create a symbolic link] *************************************************
changed: [localhost]
TASK [Create a file with blockinfile module] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Vérifions les résultats :
ls -la ~/project/ansible_demo/
cat ~/project/ansible_demo/copied.txt
cat ~/project/ansible_demo/link_to_copied.txt
cat ~/project/ansible_demo/block.txt
Vous devriez voir :
- Un répertoire appelé
ansible_demo
- Un fichier appelé
copied.txt
avec le contenu spécifié
- Un lien symbolique appelé
link_to_copied.txt
pointant vers copied.txt
- Un fichier appelé
block.txt
avec un bloc de texte entouré de commentaires de marqueur
La sortie de la dernière commande devrait être similaire à :
## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK
Cela démontre la polyvalence des capacités de gestion de fichiers d'Ansible.