Erweiterte Dateiverwaltung mit Ansible
In diesem letzten Schritt werden wir einige fortgeschrittene Dateiverwaltungstechniken mit Ansible untersuchen, einschließlich Dateiberechtigungen, bedingter Dateierstellung und der Verwendung mehrerer dateibezogener Module.
Festlegen von Dateiberechtigungen und Eigentumsverhältnissen
Beim Erstellen von Dateien müssen Sie häufig bestimmte Berechtigungen und Eigentumsverhältnisse festlegen. Erstellen wir ein Playbook, das dies demonstriert:
- Erstellen Sie in der WebIDE eine neue Datei:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files
- Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
file_permissions.yml
- Fügen Sie den folgenden Inhalt hinzu:
---
- 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"
In diesem Playbook:
- Der Parameter
mode
wird verwendet, um Dateiberechtigungen festzulegen.
0755
bedeutet Lesen, Schreiben und Ausführen für den Eigentümer sowie Lesen und Ausführen für Gruppe und Andere.
0444
bedeutet schreibgeschützt für alle.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook file_permissions.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
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
- Überprüfen wir die Berechtigungen der erstellten Dateien:
ls -l ~/project/script.sh ~/project/readonly.conf
Sie sollten eine ähnliche Ausgabe wie diese sehen:
-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
- Überprüfen wir, ob das Skript ausgeführt werden kann:
~/project/script.sh
Sie sollten eine ähnliche Ausgabe wie diese sehen:
This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files
Bedingte Dateierstellung
Manchmal müssen Sie Dateien nur erstellen, wenn bestimmte Bedingungen erfüllt sind. Erstellen wir ein Playbook, das die bedingte Dateierstellung demonstriert:
- Erstellen Sie in der WebIDE eine neue Datei:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files
- Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
conditional_file.yml
- Fügen Sie den folgenden Inhalt hinzu:
---
- 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
In diesem Playbook:
- Die Direktive
when
wird für die bedingte Ausführung von Aufgaben verwendet.
- Jinja2-Bedingungen werden im Dateiinhalt verwendet, um Werte basierend auf Variablen zu ändern.
- Das
file
-Modul wird verwendet, um ein Verzeichnis zu erstellen.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook conditional_file.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
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
Beachten Sie, dass die Aufgabe "Create backup directory" übersprungen wurde, da create_backup
auf false
gesetzt war.
- Untersuchen wir die erstellten Dateien:
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup
Sie sollten den Inhalt der beiden erstellten Dateien sehen und bestätigen, dass kein Sicherungsverzeichnis erstellt wurde.
Verwenden mehrerer dateibezogener Module
Ansible bietet mehrere Module für die Dateiverwaltung. Erstellen wir ein Playbook, das die Verwendung mehrerer dateibezogener Module demonstriert:
- Erstellen Sie in der WebIDE eine neue Datei:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files
- Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
file_modules.yml
- Fügen Sie den folgenden Inhalt hinzu:
---
- 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"
In diesem Playbook:
- Das
file
-Modul wird mit state: directory
verwendet, um ein Verzeichnis zu erstellen.
- Das
file
-Modul wird mit state: link
verwendet, um einen symbolischen Link zu erstellen.
- Das
blockinfile
-Modul wird verwendet, um eine Datei mit einem Textblock zu erstellen, der von Markierungskommentaren umgeben ist.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook file_modules.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
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
- Überprüfen wir die Ergebnisse:
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
Sie sollten Folgendes sehen:
- Ein Verzeichnis namens
ansible_demo
- Eine Datei namens
copied.txt
mit dem angegebenen Inhalt
- Einen symbolischen Link namens
link_to_copied.txt
, der auf copied.txt
verweist
- Eine Datei namens
block.txt
mit einem Textblock, der von Markierungskommentaren umgeben ist
Die Ausgabe des letzten Befehls sollte in etwa so aussehen:
## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK
Dies demonstriert die Vielseitigkeit der Dateiverwaltungsfunktionen von Ansible.