Wie man eine Datei mit Inhalt in Ansible erstellt

AnsibleAnsibleBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Ansible ist ein leistungsstarkes IT-Automatisierungswerkzeug, das die Infrastrukturverwaltung vereinfacht. In diesem praktischen Lab lernen Sie, wie Sie Ansible verwenden, um Dateien mit spezifischem Inhalt auf Zielsystemen zu erstellen. Am Ende dieses Labs werden Sie die Grundlagen der Ansible-Dateiverwaltung verstehen und in der Lage sein, die automatisierte Dateierstellung in Ihrer eigenen Infrastruktur zu implementieren.

Installation und Einrichtung von Ansible

Bevor wir mit Ansible Dateien erstellen können, müssen wir es auf unserem System installieren und konfigurieren. Richten wir unsere Umgebung ein:

Installation von Ansible

Zuerst aktualisieren wir die Paketlisten und installieren Ansible auf unserem Ubuntu 22.04 System:

sudo apt update
sudo apt install -y ansible

Nachdem Sie diese Befehle ausgeführt haben, sollten Sie eine Ausgabe sehen, die anzeigt, dass Ansible erfolgreich installiert wurde. Überprüfen wir die Installation:

ansible --version

Sie sollten eine ähnliche Ausgabe wie diese sehen:

ansible [core 2.12.0]
  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, ...) [GCC 11.2.0]
  jinja version = 3.0.3
  libyaml = True

Erstellen eines einfachen Ansible-Inventars

Ansible verwendet eine Inventardatei, um die Hosts zu definieren, die es verwalten soll. Für dieses Lab erstellen wir ein lokales Inventar, das unsere eigene Maschine enthält:

  1. Erstellen Sie ein neues Verzeichnis für unser Ansible-Projekt:
mkdir -p ~/project/ansible-files
cd ~/project/ansible-files
  1. Erstellen Sie eine Inventardatei mit VSCode:
    • Klicken Sie auf das Explorer-Symbol in der WebIDE
    • Navigieren Sie zum Verzeichnis ~/project/ansible-files
    • Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
    • Benennen Sie die Datei inventory
    • Fügen Sie der Datei den folgenden Inhalt hinzu:
[local]
localhost ansible_connection=local

Diese Inventardatei weist Ansible an, Befehle auf der lokalen Maschine auszuführen, ohne SSH zu verwenden.

  1. Erstellen Sie eine einfache ansible.cfg-Datei im selben Verzeichnis:
    • Klicken Sie auf das Explorer-Symbol in der WebIDE
    • Navigieren Sie zum Verzeichnis ~/project/ansible-files
    • Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
    • Benennen Sie die Datei ansible.cfg
    • Fügen Sie der Datei den folgenden Inhalt hinzu:
[defaults]
inventory = ./inventory
host_key_checking = False
  1. Überprüfen wir unsere Einrichtung, indem wir einen einfachen Ansible-Befehl ausführen:
cd ~/project/ansible-files
ansible local -m ping

Sie sollten eine ähnliche Ausgabe wie diese sehen:

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Dies bestätigt, dass Ansible korrekt installiert und konfiguriert ist, um Befehle auf Ihrer lokalen Maschine auszuführen.

Erstellen von Dateien mit Inhalt mithilfe von Ansible Playbooks

Nachdem wir Ansible eingerichtet haben, lernen wir nun, wie man Dateien mit Inhalt erstellt. Ansible bietet mehrere Module für die Dateiverwaltung, und wir konzentrieren uns in diesem Schritt auf das copy-Modul.

Verstehen von Ansible Playbooks

Ansible Playbooks sind YAML-Dateien, die eine Reihe von Aufgaben beschreiben, die auf Ziel-Hosts ausgeführt werden sollen. Jede Aufgabe verwendet ein spezifisches Ansible-Modul, um eine Aktion auszuführen.

Erstellen wir unser erstes Playbook, um eine Datei mit Inhalt zu erstellen:

  1. Erstellen Sie in der WebIDE eine neue Datei im Verzeichnis ~/project/ansible-files:
    • Klicken Sie mit der rechten Maustaste auf das Verzeichnis und wählen Sie "Neue Datei"
    • Benennen Sie die Datei create_file.yml
    • Fügen Sie den folgenden Inhalt hinzu:
---
- name: Create a file with content
  hosts: local
  tasks:
    - name: Create a simple text file
      copy:
        dest: "~/project/hello.txt"
        content: |
          Hello from Ansible!
          This file was created using the Ansible copy module.
          Current date: {{ ansible_date_time.date }}

Lassen Sie uns verstehen, was dieses Playbook tut:

  • Die Zeile hosts: local gibt an, dass dieses Playbook auf den Hosts in der Gruppe local aus unserem Inventar ausgeführt wird.
  • Der Abschnitt tasks enthält eine Liste der auszuführenden Aufgaben.
  • Das copy-Modul wird verwendet, um eine Datei mit Inhalt zu erstellen.
  • Der Parameter dest gibt den Zielpfad für die Datei an.
  • Der Parameter content enthält den Textinhalt, der in die Datei geschrieben wird.
  • {{ ansible_date_time.date }} ist eine Variable, die beim Ausführen des Playbooks durch das aktuelle Datum ersetzt wird.
  1. Führen wir nun das Playbook aus:
cd ~/project/ansible-files
ansible-playbook create_file.yml

Sie sollten eine ähnliche Ausgabe wie diese sehen:

PLAY [Create a file with content] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple text file] ***********************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. Überprüfen wir, ob die Datei erstellt wurde und den erwarteten Inhalt enthält:
cat ~/project/hello.txt

Sie sollten eine ähnliche Ausgabe wie diese sehen:

Hello from Ansible!
This file was created using the Ansible copy module.
Current date: 2023-08-15

Das Datum spiegelt das aktuelle Datum wider, an dem Sie das Playbook ausführen.

Idempotenz in Ansible

Idempotenz ist eine Schlüsselfunktion von Ansible – das mehrmalige Ausführen desselben Playbooks sollte dasselbe Ergebnis liefern. Führen wir das Playbook erneut aus, um die Idempotenz in Aktion zu sehen:

ansible-playbook create_file.yml

Dieses Mal sollten Sie sehen, dass die Anzahl der "changed" 0 ist:

PLAY [Create a file with content] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple text file] ***********************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Dies zeigt, dass Ansible erkennt, dass die Datei bereits mit dem korrekten Inhalt existiert, und sie daher nicht erneut modifiziert.

Verwenden von Variablen und Vorlagen in Ansible

In diesem Schritt werden wir untersuchen, wie man Variablen und Vorlagen verwendet, um mit Ansible dynamischere Dateien zu erstellen.

Arbeiten mit Variablen

Variablen machen Ihre Playbooks flexibler und wiederverwendbarer. Erstellen wir ein Playbook, das Variablen verwendet, um eine Konfigurationsdatei zu erstellen:

  1. Erstellen Sie in der WebIDE eine neue Datei im Verzeichnis ~/project/ansible-files:
    • Klicken Sie mit der rechten Maustaste auf das Verzeichnis und wählen Sie "Neue Datei"
    • Benennen Sie die Datei variables_demo.yml
    • Fügen Sie den folgenden Inhalt hinzu:
---
- name: Create files using variables
  hosts: local
  vars:
    app_name: "MyApplication"
    app_version: "1.0.0"
    port_number: 8080
    log_level: "INFO"
  tasks:
    - name: Create config file with variables
      copy:
        dest: "~/project/app_config.ini"
        content: |
          ## Configuration for {{ app_name }}
          ## Generated by Ansible

          [application]
          name = {{ app_name }}
          version = {{ app_version }}

          [server]
          port = {{ port_number }}
          log_level = {{ log_level }}

In diesem Playbook:

  • Der Abschnitt vars definiert Variablen, die im gesamten Playbook verwendet werden können.
  • Auf die Variablen wird mit der Syntax {{ variable_name }} verwiesen.
  • Das copy-Modul wird verwendet, um eine Datei mit Inhalt zu erstellen, der diese Variablen enthält.
  1. Führen wir nun das Playbook aus:
cd ~/project/ansible-files
ansible-playbook variables_demo.yml

Sie sollten eine ähnliche Ausgabe wie diese sehen:

PLAY [Create files using variables] ********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create config file with variables] ***************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. Untersuchen wir den Inhalt der generierten Datei:
cat ~/project/app_config.ini

Sie sollten eine ähnliche Ausgabe wie diese sehen:

## Configuration for MyApplication
## Generated by Ansible

[application]
name = MyApplication
version = 1.0.0

[server]
port = 8080
log_level = INFO

Verwenden von Jinja2-Vorlagen

Für komplexere Dateiinhalte unterstützt Ansible Jinja2-Vorlagen. Erstellen wir eine Vorlagendatei und verwenden sie in einem Playbook:

  1. Erstellen Sie ein Vorlagenverzeichnis:
mkdir -p ~/project/ansible-files/templates
  1. Erstellen Sie eine Vorlagendatei in der WebIDE:
    • Navigieren Sie zum Verzeichnis ~/project/ansible-files/templates
    • Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
    • Benennen Sie die Datei web_config.j2
    • Fügen Sie den folgenden Inhalt hinzu:
## Web Server Configuration
## Generated by Ansible on {{ ansible_date_time.date }}

server {
    listen {{ web_port }};
    server_name {{ server_name }};

    location / {
        root {{ doc_root }};
        index index.html;
    }

    {% if enable_ssl %}
    ## SSL Configuration
    ssl_certificate {{ ssl_cert }};
    ssl_certificate_key {{ ssl_key }};
    {% endif %}
}
  1. Erstellen Sie nun ein Playbook, das diese Vorlage verwendet:
    • Navigieren Sie zum Verzeichnis ~/project/ansible-files
    • Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
    • Benennen Sie die Datei template_demo.yml
    • Fügen Sie den folgenden Inhalt hinzu:
---
- name: Create files using templates
  hosts: local
  vars:
    web_port: 80
    server_name: "example.com"
    doc_root: "/var/www/html"
    enable_ssl: true
    ssl_cert: "/etc/ssl/certs/example.com.crt"
    ssl_key: "/etc/ssl/private/example.com.key"
  tasks:
    - name: Create web server config from template
      template:
        src: templates/web_config.j2
        dest: ~/project/web_server.conf

In diesem Playbook:

  • Das template-Modul wird anstelle von copy verwendet.
  • Der Parameter src verweist auf unsere Vorlagendatei.
  • Der Parameter dest gibt an, wo die Ausgabedatei erstellt werden soll.
  • Die im Abschnitt vars definierten Variablen werden in der Vorlage verwendet.
  1. Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook template_demo.yml

Sie sollten eine ähnliche Ausgabe wie diese sehen:

PLAY [Create files using templates] ********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create web server config from template] **********************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. Untersuchen wir die generierte Konfigurationsdatei:
cat ~/project/web_server.conf

Sie sollten eine ähnliche Ausgabe wie diese sehen:

## Web Server Configuration
## Generated by Ansible on 2023-08-15

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html;
    }

    ## SSL Configuration
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
}

Beachten Sie, wie die Jinja2-Vorlage mit unseren Variablen gerendert wurde und der bedingte Abschnitt für SSL enthalten war, da enable_ssl auf true gesetzt war.

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:

  1. 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.
  1. 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
  1. Ü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
  1. Ü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:

  1. 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.
  1. 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.

  1. 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:

  1. 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.
  1. 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
  1. Ü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.

Zusammenfassung

Herzlichen Glückwunsch zum Abschluss dieses Ansible-Dateiverwaltungs-Labs. Sie haben mehrere wichtige Konzepte und Techniken gelernt:

  1. Wie man Ansible für grundlegende Automatisierungsaufgaben installiert und konfiguriert
  2. Erstellen von Dateien mit spezifischem Inhalt mithilfe des copy-Moduls
  3. Verwenden von Variablen, um Ihren Dateiinhalt dynamisch zu gestalten
  4. Arbeiten mit Jinja2-Vorlagen für komplexere Dateigenerierung
  5. Festlegen von Dateiberechtigungen und Eigentumsverhältnissen
  6. Implementieren der bedingten Dateierstellung basierend auf Variablen
  7. Verwenden verschiedener Ansible-Module für unterschiedliche Dateiverwaltungsaufgaben

Diese Fähigkeiten bilden eine solide Grundlage für die Automatisierung von Dateiverwaltungsaufgaben in Ihrer Infrastruktur. Mit Ansible können Sie konsistenten Dateiinhalt über mehrere Server hinweg sicherstellen, Änderungen kontrolliert anwenden und eine prüfbare Aufzeichnung Ihrer Konfiguration führen.

Um Ihre Ansible-Lernreise fortzusetzen, sollten Sie sich mit fortgeschritteneren Themen wie Rollen, Playbook-Organisation und der Integration von Ansible mit anderen DevOps-Tools befassen.