2015-02-19 9 views
13

Ich versuche, den Inhalt einer Datei zu lesen, diese in einer Variablen zu speichern und sie dann in eine andere Datei einzufügen, wenn sie nicht bereits vorhanden sind.Verwenden von Variablen für Dateiname und Dateiinhalte im LineInfile-Modul

So, wie ich bin versucht, um dies zu realisieren ist wie folgt:

# Create a variable that represents the path to the file that you want to read from 
ssh_public_key_file: '../../jenkins_master/files/{{ hostvars[inventory_hostname]["environment"] }}/id_rsa.pub' 

# Create a variable that represents the contents of this file: 
ssh_public_key: "{{ lookup('file', '{{ ssh_public_key_file }}') }}" 

ich dann diese Variablen in meinem ansible Textbuch wie folgt verwenden:

- name: Install SSH authorized key 
    lineinfile: create=yes dest=~/.ssh/authorized_keys line=" {{ ssh_public_key }}" mode=0644 

aber wenn ich versuche, und führe das Playbook aus, bekomme ich folgende Fehlermeldung:

could not locate file in lookup: {{ ssh_public_key_file }} 

Kann mir jemand eine Lösung empfehlen oder schlage ich vor, was ich falsch gemacht habe?

Danke,

Seán

+0

Ich vermute jinja2 nicht in einfache Anführungszeichen nicht erweitern . Nicht 100% sicher, aber. Bitte benutzen Sie in jedem Fall das 'template' Modul anstelle von lineinfile. Es wird viel weniger chaotisch auf der ganzen Linie sein. – tedder42

+0

Hey @ Seán hast du eine Lösung für dein Problem gefunden? Ich habe derzeit das gleiche Problem und vielleicht können Sie Ihre Lösung mir/den anderen teilen. Vielen Dank – ByteNudger

Antwort

1

Zuerst würde ich sicherstellen, dass Ihre ssh_public_key_file Variable richtig eingerichtet ist. Wenn Sie eine Aufgabe wie die folgende hinzufügen, was wird angezeigt?

- name: display variable 
    debug: var=ssh_public_key_file 

Wenn die Ausgabe ungefähr so ​​aussieht, dann wird die Variable nicht richtig definiert (. ZB die „Umwelt“ Tatsache existiert nicht für den Host):

ok: [localhost] => { 
    "ssh_public_key_file": "../../jenkins_master/files/{{ hostvars[inventory_hostname][\"environment\"] }}/id_rsa.pub" 
} 

Doch wenn alles definiert richtig, dann sollten Sie Ihre Ausgabe die Variablen zeigen ersetzt mit ihren korrekten Werte:

ok: [localhost] => { 
    "ssh_public_key_file": "../../jenkins_master/files/foo/id_rsa.pub" 
} 

Sobald Sie das dann überprüft haben, würde ich mit Ihremdas gleiche tun 10 variabel. Geben Sie den Wert einfach mit dem Debug-Modul aus. Es sollte als der Inhalt der öffentlichen Schlüsseldatei angezeigt werden.

Eine andere Sache, die ich dringend empfehlen würde, ist es, lineinfile insgesamt zu vermeiden. Da Sie mit SSH-Schlüsseln arbeiten, würde ich Ihnen empfehlen, stattdessen das Modul authorized_key zu verwenden. Es ist eine viel sauberere Art, authorized_keys-Dateien zu verwalten.

15

Sie müssen die Zeile ändern:

# Create a variable that represents the contents of this file: 
ssh_public_key: "{{ lookup('file', ssh_public_key_file) }}" 

Wenn Sie Variablen und Strings verketten müssen Sie es wie folgt tun:

# Example with two variables 
ssh_public_key: "{{ lookup('file', var_1+var_2) }}" 

# Example with string and variable 
ssh_public_key: "{{ lookup('file", '~/config/'+var_1) }}" 
Verwandte Themen