2017-11-01 3 views
0

wir haben mehrere csv-Dateien zu verketten basierend auf Anforderungen. Jede CSV-Datei enthält Header und wir können sie nicht ändern, da sie aus der Quelle stammen. Ich habe so viele Fragmente zu kombinieren.Ansible: Wie man Dateien zusammensetzt, indem man Überschriften entfernt?

Beispiel CSV1

hostname,ip,zone 
host1,1.3.2.4,EU 
host2,1.3.2.5,EU 

Beispiel CSV2

hostname,ip,zone 
host32,8.3.2.4,US 
host22,8.3.2.5,US 

Schluss Ouput erforderlich ist

hostname,ip,zone 
host1,1.3.2.4,EU 
host2,1.3.2.5,EU 
host32,8.3.2.4,US 
host22,8.3.2.5,US 

Ich versuche, mit ansible Textbuch

- assemble: 
    src: /home/mycsvDirectory 
    dest: /home/newCSV/mycombined.csv 

Die oben zu tun montieren funktioniert perfekt, aber die Header jedes Mal enthalten. Ich wollte nur einen Header haben, nachdem alle Fragmente wie erwartet zusammengefügt wurden. Wie geht das effizient in ansible? (Ich kann mir einen Weg vorstellen, die Dateien durchzulaufen und zu tun, aber das ist ineffizient auf 100 von Dateien)

Antwort

1

Das assemble Modul ist wirklich nicht das richtige Werkzeug zum semantischen Zusammenführen von Dateien (das heißt, Zusammenführen Dateien auf eine Weise, die vom Inhalt der Dateien abhängt). Die einfachste Lösung für Ihr Problem wäre, den Header in allen Fragmentdateien zu platzieren. Wenn das Löschen der Kopfzeilen keine Option ist, ist die einfachste Lösung mit Ansible wahrscheinlich, ein benutzerdefiniertes Modul zu schreiben (verwenden Sie das Modul csv, um alle Fragmente zu analysieren, und verwenden Sie dann csv.writer oder ähnliches, um Ihre Ausgabe zu generieren)).

Es gibt mehrere Hacky-Workarounds, die Sie verwenden könnten. Beispielsweise führen Sie einen command: Block aus, um sed -i '2,$ {/^hostname/d}' auf der Datei auszuführen, nachdem Sie es zusammengestellt haben.

+0

danke für schnelle antwort. Alle vorhandenen Methoden in ansible ich könnte verwenden; wie einen Filter weglassen oder so? (Ansonsten mag ich deine Idee von sed) – diaryfolio

Verwandte Themen