Einführung
Dieses Tutorial führt Sie durch die Verwendung von Ansible vars_files für ein effizientes Konfigurationsmanagement. Ansible ist ein leistungsstarkes Automatisierungstool, das hilft, Infrastruktur durch einfache, für Menschen lesbare YAML-Dateien zu verwalten. Die vars_files-Funktion ermöglicht es Ihnen, Ihre Konfigurationsdaten getrennt von Ihrer Automatisierungslogik zu halten, wodurch Ihre Ansible-Projekte organisierter und wartbarer werden.
Am Ende dieses Tutorials werden Sie gelernt haben, wie man vars_files erstellt und organisiert, sie in Playbooks integriert und sie effektiv zur Verwaltung verschiedener Umgebungen nutzt. Dieses Wissen wird Ihnen helfen, eine skalierbarere und wartbarere Infrastrukturautomatisierung aufzubauen.
Installation von Ansible und Erstellung Ihrer ersten vars_file
In diesem ersten Schritt installieren wir Ansible auf unserem System und erstellen unsere erste vars_file, um Konfigurationsdaten zu speichern.
Installation von Ansible
Beginnen wir mit der Installation von Ansible auf unserem Ubuntu-System:
sudo apt update
sudo apt install -y ansible
Nachdem die Installation abgeschlossen ist, überprüfen Sie, ob Ansible korrekt installiert wurde:
ansible --version
Sie sollten eine Ausgabe ähnlich dieser sehen, die die Ansible-Version und -Konfiguration anzeigt:
ansible [core 2.12.x]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, Mar 14 2023, 14:21:35) [GCC 11.3.0]
jinja version = 3.0.3
libyaml = True
Erstellen einer Projektverzeichnisstruktur
Erstellen wir eine Verzeichnisstruktur für unser Ansible-Projekt:
mkdir -p ~/project/ansible-vars-demo/vars
cd ~/project/ansible-vars-demo
Verständnis von Ansible vars_files
Ansible vars_files sind YAML-Dateien, die Variablendefinitionen speichern, die in Playbooks importiert werden können. Diese Dateien ermöglichen Ihnen:
- Konfigurationsdaten von der Automatisierungslogik zu trennen
- Die gleichen Variablen in mehreren Playbooks wiederzuverwenden
- Verschiedene Konfigurationen für verschiedene Umgebungen zu verwalten
Erstellen Ihrer ersten vars_file
Erstellen wir unsere erste vars_file, um Webserver-Konfigurationseinstellungen zu speichern. Erstellen Sie mit der WebIDE eine neue Datei unter ~/project/ansible-vars-demo/vars/webserver.yml mit folgendem Inhalt:
---
## Web Server Configuration
http_port: 80
server_name: example.com
document_root: /var/www/html
max_clients: 200
Diese vars_file definiert vier Variablen, die bei der Konfiguration eines Webservers verwendet werden könnten:
http_port: Der Port, auf dem der Webserver lauschen wirdserver_name: Der Domainname für den Webserverdocument_root: Das Verzeichnis, in dem die Website-Dateien gespeichert werdenmax_clients: Die maximale Anzahl gleichzeitiger Client-Verbindungen
Um zu verstehen, wie dies in der WebIDE aussieht, navigieren Sie im Dateiexplorer auf der linken Seite zum Ordner project, dann zu ansible-vars-demo, dann zu vars, und Sie sollten Ihre Datei webserver.yml sehen. Klicken Sie darauf, um ihren Inhalt anzuzeigen oder zu bearbeiten.
Erstellen einer Inventory-Datei
Als Nächstes müssen wir eine Inventory-Datei erstellen, um Ansible mitzuteilen, welche Hosts verwaltet werden sollen. In einer realen Umgebung würde dies tatsächliche Serveradressen enthalten, aber für dieses Tutorial verwenden wir localhost.
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/inventory.ini mit folgendem Inhalt:
[webservers]
localhost ansible_connection=local
Dieses einfache Inventory definiert eine Gruppe namens webservers, die nur unsere lokale Maschine enthält.
Verständnis der Projektstruktur
An diesem Punkt sollte Ihre Projektstruktur wie folgt aussehen:
ansible-vars-demo/
├── inventory.ini
└── vars/
└── webserver.yml
Diese grundlegende Struktur trennt unser Inventory (welche Hosts verwaltet werden sollen) von unseren Variablendefinitionen (wie diese Hosts konfiguriert werden sollen).
Erstellen eines einfachen Playbooks mit vars_files
Nachdem wir unsere vars_file erstellt haben, erstellen wir ein einfaches Ansible-Playbook, das diese Variablen verwendet. Dies demonstriert, wie man Konfigurationsdaten aus vars_files importiert und verwendet.
Verständnis von Ansible Playbooks
Ansible Playbooks sind YAML-Dateien, die eine Reihe von Aufgaben definieren, die auf verwalteten Hosts ausgeführt werden sollen. Playbooks sind der Kern der Funktionalität von Ansible und ermöglichen es Ihnen, komplexe Konfigurationsprozesse zu automatisieren.
Erstellen eines einfachen Playbooks
Erstellen wir ein Playbook, das die Konfiguration eines Webservers mithilfe der Variablen simuliert, die wir in unserer vars_file definiert haben. Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/webserver_setup.yml mit folgendem Inhalt:
---
- name: Configure Web Server
hosts: webservers
vars_files:
- vars/webserver.yml
tasks:
- name: Display web server configuration
debug:
msg: "Web server will be configured with: Port={{ http_port }}, ServerName={{ server_name }}, DocumentRoot={{ document_root }}"
- name: Create a directory for document root
file:
path: "/tmp/{{ document_root }}"
state: directory
mode: "0755"
- name: Create a sample index.html file
copy:
content: |
<html>
<head>
<title>Welcome to {{ server_name }}</title>
</head>
<body>
<h1>Welcome to {{ server_name }}</h1>
<p>This server is configured to handle {{ max_clients }} simultaneous connections.</p>
</body>
</html>
dest: "/tmp/{{ document_root }}/index.html"
mode: "0644"
Lassen Sie uns verstehen, was dieses Playbook tut:
hosts: webservers- Gibt an, dass dieses Playbook auf allen Hosts in der Gruppe "webservers" aus unserem Inventory ausgeführt werden soll.vars_files: - vars/webserver.yml- Importiert Variablen aus unserervars_file.- Die erste Aufgabe verwendet das
debug-Modul, um eine Meldung anzuzeigen, die die Variablen zeigt. - Die zweite Aufgabe erstellt eine Verzeichnisstruktur, die für das Webserver-Document-Root verwendet werden würde.
- Die dritte Aufgabe erstellt eine Beispiel-HTML-Datei, die die Variablen aus unserer
vars_fileenthält.
Ausführen des Playbooks
Führen wir nun das Playbook aus, um es in Aktion zu sehen:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini webserver_setup.yml
Sie sollten eine Ausgabe ähnlich dieser sehen:
PLAY [Configure Web Server] ****************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Display web server configuration] ****************************************
ok: [localhost] => {
"msg": "Web server will be configured with: Port=80, ServerName=example.com, DocumentRoot=/var/www/html"
}
TASK [Create a directory for document root] ************************************
changed: [localhost]
TASK [Create a sample index.html file] *****************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Überprüfen der Ergebnisse
Überprüfen wir, ob unser Playbook die erwarteten Dateien erstellt hat:
ls -la /tmp/var/www/html/
cat /tmp/var/www/html/index.html
Sie sollten die Verzeichnisstruktur und den Inhalt der Datei index.html sehen, die die Werte aus unserer vars_file enthalten sollte:
<html>
<head>
<title>Welcome to example.com</title>
</head>
<body>
<h1>Welcome to example.com</h1>
<p>This server is configured to handle 200 simultaneous connections.</p>
</body>
</html>
Verständnis des Workflows
Fassen wir zusammen, was wir erreicht haben:
- Wir haben Konfigurationsdaten in einer separaten
vars_file(vars/webserver.yml) gespeichert. - Wir haben ein Playbook erstellt, das diese Konfigurationsdaten importiert und verwendet.
- Wir haben das Playbook ausgeführt, um Aufgaben auszuführen, die die Variablen verwenden.
Diese Trennung von Konfigurationsdaten (vars_files) von der Automatisierungslogik (Playbooks) macht unseren Ansible-Code wartbarer und wiederverwendbarer. Wir können die Konfiguration jetzt aktualisieren, indem wir nur die vars_file bearbeiten, ohne das Playbook selbst zu ändern.
Arbeiten mit mehreren vars_files
Nachdem wir die Grundlagen von vars_files verstanden haben, wollen wir untersuchen, wie man mehrere vars_files zur Verwaltung verschiedener Umgebungen verwendet. Dies ist eine gängige Praxis in realen Szenarien, in denen Sie möglicherweise unterschiedliche Konfigurationen für Entwicklungs-, Staging- und Produktionsumgebungen haben.
Erstellen umgebungsspezifischer vars_files
Erstellen wir vars_files für verschiedene Umgebungen. Erstellen wir zunächst eine Konfiguration für die Entwicklungsumgebung:
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/vars/dev_environment.yml mit folgendem Inhalt:
---
## Development Environment Configuration
environment_name: development
debug_mode: true
log_level: debug
backup_frequency: weekly
max_memory: 512MB
Als Nächstes erstellen wir eine Konfiguration für die Produktionsumgebung:
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/vars/prod_environment.yml mit folgendem Inhalt:
---
## Production Environment Configuration
environment_name: production
debug_mode: false
log_level: error
backup_frequency: daily
max_memory: 2048MB
Erstellen eines Playbooks mit mehreren vars_files
Erstellen wir nun ein Playbook, das sowohl unsere Webserver-Konfiguration als auch umgebungsspezifische Konfigurationen verwendet. Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/environment_setup.yml mit folgendem Inhalt:
---
- name: Configure Environment
hosts: webservers
vars:
env: dev
vars_files:
- vars/webserver.yml
- "vars/{{ env }}_environment.yml"
tasks:
- name: Display environment details
debug:
msg: >
Setting up {{ environment_name }} environment with the following parameters:
- Web Server: {{ server_name }} on port {{ http_port }}
- Debug Mode: {{ debug_mode }}
- Log Level: {{ log_level }}
- Backup Frequency: {{ backup_frequency }}
- Max Memory: {{ max_memory }}
- Max Clients: {{ max_clients }}
- name: Create environment config file
copy:
content: |
## Environment Configuration for {{ server_name }}
ENVIRONMENT={{ environment_name }}
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
BACKUP_FREQUENCY={{ backup_frequency }}
MAX_MEMORY={{ max_memory }}
HTTP_PORT={{ http_port }}
MAX_CLIENTS={{ max_clients }}
dest: "/tmp/{{ environment_name }}_config.env"
mode: "0644"
Dieses Playbook führt mehrere neue Konzepte ein:
- Wir setzen eine Variable
env: devinnerhalb des Playbooks selbst. - Wir schließen sowohl unsere Webserver-
vars_fileals auch eine umgebungsspezifischevars_fileein. - Der Pfad der Umgebungsvariablen-Datei enthält eine Variable:
"vars/{{ env }}_environment.yml", die zuvars/dev_environment.ymlausgewertet wird. - Die Aufgaben verwenden Variablen aus beiden
vars_files.
Ausführen des Playbooks mit verschiedenen Umgebungen
Führen wir das Playbook zuerst mit der Entwicklungsumgebung aus (was bereits die Standardeinstellung ist):
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini environment_setup.yml
Sie sollten eine Ausgabe sehen, die die Einstellungen der Entwicklungsumgebung enthält:
TASK [Display environment details] ********************************************
ok: [localhost] => {
"msg": "Setting up development environment with the following parameters:\n- Web Server: example.com on port 80\n- Debug Mode: True\n- Log Level: debug\n- Backup Frequency: weekly\n- Max Memory: 512MB\n- Max Clients: 200"
}
Führen wir nun dasselbe Playbook aus, aber überschreiben wir die Variable env, um die Produktionsumgebung zu verwenden:
ansible-playbook -i inventory.ini environment_setup.yml -e "env=prod"
Sie sollten eine Ausgabe sehen, die die Einstellungen der Produktionsumgebung enthält:
TASK [Display environment details] ********************************************
ok: [localhost] => {
"msg": "Setting up production environment with the following parameters:\n- Web Server: example.com on port 80\n- Debug Mode: False\n- Log Level: error\n- Backup Frequency: daily\n- Max Memory: 2048MB\n- Max Clients: 200"
}
Überprüfen der Konfigurationsdateien
Überprüfen wir, ob unser Playbook die Konfigurationsdateien für die Umgebung erstellt hat:
cat /tmp/development_config.env
cat /tmp/production_config.env
Sie sollten zwei verschiedene Konfigurationsdateien sehen, jede mit Einstellungen aus der jeweiligen vars_file der Umgebung.
Verständnis der Variablen-Vorrangs
Es ist wichtig zu verstehen, dass Ansible beim Verwenden mehrerer vars_files eine bestimmte Reihenfolge für die Variablen-Vorrangsregelung einhält. Wenn derselbe Variablenname an mehreren Stellen vorkommt, überschreibt der später definierte Wert frühere Definitionen.
In unserem Beispiel, wenn wir http_port sowohl in den Dateien webserver.yml als auch dev_environment.yml definiert hätten, hätte der Wert aus dev_environment.yml Vorrang, da er später in der Liste der vars_files enthalten ist.
Dieses Verhalten ermöglicht es Ihnen, allgemeine Standardwerte in einer Datei zu definieren und dann bestimmte Werte für verschiedene Umgebungen zu überschreiben.
Erweiterte vars_files-Techniken
In diesem letzten Schritt werden wir einige fortgeschrittene Techniken für die Arbeit mit vars_files in Ansible untersuchen, einschließlich der hierarchischen Organisation von Variablen und der Implementierung einer rollenbasierten Variablenorganisation.
Hierarchische Organisation von Variablen
In komplexen Projekten ist es oft hilfreich, Variablen hierarchisch zu organisieren. Erstellen wir eine Struktur, in der wir Folgendes haben:
- Gemeinsame Variablen, die für alle Umgebungen gelten
- Umgebungsspezifische Variablen
- Anwendungsspezifische Variablen
Erstellen wir zunächst eine Datei mit gemeinsamen Variablen:
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/vars/common.yml mit folgendem Inhalt:
---
## Common variables for all environments
organization: "Example Corp"
admin_email: "admin@example.com"
timezone: "UTC"
Als Nächstes erstellen wir anwendungsspezifische Variablen:
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/vars/database.yml mit folgendem Inhalt:
---
## Database application variables
db_port: 3306
db_user: "dbuser"
db_name: "appdb"
db_max_connections: 100
Erstellen eines hierarchischen Playbooks
Erstellen wir nun ein Playbook, das die Verwendung dieser hierarchischen Variablen demonstriert. Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/hierarchical_setup.yml mit folgendem Inhalt:
---
- name: Hierarchical Variable Demo
hosts: webservers
vars:
env: dev
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display hierarchical configuration
debug:
msg: >
Configuration for {{ app }} in {{ environment_name }} environment:
- Organization: {{ organization }}
- Admin Email: {{ admin_email }}
- Timezone: {{ timezone }}
- Debug Mode: {{ debug_mode }}
- Log Level: {{ log_level }}
- DB Port: {{ db_port }}
- DB User: {{ db_user }}
- DB Max Connections: {{ db_max_connections }}
- name: Create hierarchical config file
copy:
content: |
## {{ organization }} Configuration
## {{ environment_name }} Environment
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
BACKUP_FREQUENCY={{ backup_frequency }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
DB_MAX_CONNECTIONS={{ db_max_connections }}
dest: "/tmp/{{ environment_name }}_{{ app }}_config.conf"
mode: "0644"
Verständnis von Gruppen- und Host-Variablen
Zusätzlich zu vars_files unterstützt Ansible auch das Speichern von Variablen in speziellen Verzeichnissen namens group_vars und host_vars. Sehen wir uns an, wie diese funktionieren:
Erstellen Sie eine Verzeichnisstruktur für Gruppen- und Host-Variablen:
mkdir -p ~/project/ansible-vars-demo/group_vars
mkdir -p ~/project/ansible-vars-demo/host_vars
Erstellen Sie nun eine Datei mit Gruppenvariablen für die Gruppe 'webservers':
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/group_vars/webservers.yml mit folgendem Inhalt:
---
## Variables for all webservers
firewall_enabled: true
ssh_port: 22
monitoring_enabled: true
Und erstellen Sie eine Datei mit Host-Variablen für 'localhost':
Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/host_vars/localhost.yml mit folgendem Inhalt:
---
## Variables specific to localhost
local_backup_path: "/tmp/backups"
is_development_machine: true
Erstellen eines Playbooks mit allen Variablentypen
Erstellen wir ein abschließendes Playbook, das die Verwendung aller Variablentypen zusammen demonstriert. Erstellen Sie eine neue Datei unter ~/project/ansible-vars-demo/complete_setup.yml mit folgendem Inhalt:
---
- name: Complete Variable Demo
hosts: webservers
vars:
env: prod
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display complete configuration
debug:
msg: >
Complete configuration for {{ inventory_hostname }}:
- Organization: {{ organization }}
- Environment: {{ environment_name }}
- Debug Mode: {{ debug_mode }}
- Firewall Enabled: {{ firewall_enabled }}
- SSH Port: {{ ssh_port }}
- Monitoring Enabled: {{ monitoring_enabled }}
- Local Backup Path: {{ local_backup_path }}
- Is Development Machine: {{ is_development_machine }}
- name: Create complete config file
copy:
content: |
## {{ organization }} - {{ environment_name }} Environment
## Host: {{ inventory_hostname }}
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
## Server Settings
FIREWALL_ENABLED={{ firewall_enabled }}
SSH_PORT={{ ssh_port }}
MONITORING_ENABLED={{ monitoring_enabled }}
## Host-specific Settings
LOCAL_BACKUP_PATH={{ local_backup_path }}
IS_DEVELOPMENT_MACHINE={{ is_development_machine }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
dest: "/tmp/complete_config.conf"
mode: "0644"
Ausführen der erweiterten Playbooks
Führen wir unser hierarchisches Playbook aus:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini hierarchical_setup.yml
Sie sollten eine Ausgabe sehen, die Variablen aus allen drei vars_files enthält.
Führen wir nun unser vollständiges Playbook aus:
ansible-playbook -i inventory.ini complete_setup.yml
Diesmal sollten Sie eine Ausgabe sehen, die Variablen aus vars_files, group_vars und host_vars enthält.
Überprüfen der Konfigurationsdateien
Überprüfen wir die Konfigurationsdateien, die von unseren erweiterten Playbooks erstellt wurden:
cat /tmp/dev_database_config.conf
cat /tmp/complete_config.conf
Verständnis der Variablen-Vorrangsregelung in Ansible
Bei der Verwendung mehrerer Variablenquellen befolgt Ansible eine bestimmte Reihenfolge der Vorrangsregelung:
- Befehlszeilenvariablen (
-eoder--extra-vars) - Variablen, die im Play definiert sind
- Variablen aus enthaltenen Dateien und Rollen
- Host-Fakten
- Host-Variablen
- Gruppenvariablen
- Inventory-Variablen
- Rollen-Standardvariablen
Dies bedeutet, dass Variablen, die in host_vars definiert sind, dieselben Variablen überschreiben, die in group_vars definiert sind, wodurch wiederum dieselben Variablen überschrieben werden, die in vars_files definiert sind.
Diese hierarchische Struktur bietet Ihnen eine leistungsstarke Möglichkeit, die Konfiguration über verschiedene Umgebungen, Hosts und Anwendungen hinweg zu verwalten.
Zusammenfassung
In diesem Tutorial haben Sie gelernt, wie Sie Ansible vars_files effektiv für die Konfigurationsverwaltung einsetzen können. Sie haben:
- Ansible installiert und Ihre erste
vars_fileerstellt, um Konfigurationsdaten zu speichern - Ein grundlegendes Playbook erstellt und ausgeführt, das
vars_filesverwendet, um die Konfiguration von der Automatisierungslogik zu trennen - Mit mehreren
vars_filesgearbeitet, um verschiedene Umgebungen zu verwalten - Erweiterte Techniken erkundet, einschließlich hierarchischer Variablenorganisation und der Verwendung von
group_varsundhost_vars
Diese Fähigkeiten bieten eine solide Grundlage für den Aufbau skalierbarer und wartbarer Ansible-Automatisierung. Durch die Trennung Ihrer Konfigurationsdaten von Ihrer Automatisierungslogik können Sie:
- Ihre Playbooks über verschiedene Umgebungen hinweg wiederverwendbarer machen
- Den Prozess der Aktualisierung von Konfigurationswerten vereinfachen
- Komplexe Konfigurationen strukturiert verwalten
- Die Zusammenarbeit verbessern, indem Sie Konfigurationsdaten klar organisieren
Denken Sie bei der weiteren Arbeit mit Ansible daran, dass ein effektives Variablenmanagement der Schlüssel zum Aufbau wartbarer Automatisierung ist. Die in diesem Tutorial erlernten Techniken helfen Ihnen, Ihre Ansible-Projekte zu organisieren, wenn sie an Komplexität zunehmen.


