web-dev-qa-db-de.com

Verwenden von Variablen für Dateinamen und Dateiinhalt im Modul "lineinfile"

Ich versuche, den Inhalt einer Datei zu lesen, in einer Variablen zu speichern und sie dann in eine andere Datei einzufügen, wenn sie noch nicht vorhanden ist.

Also, wie ich versuche, dies zu tun, 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 verwende diese Variablen dann in meinem Ansible-Spielbuch wie folgt:

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

Wenn ich jedoch das Playbook versuche, wird folgende Fehlermeldung angezeigt:

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

Kann jemand eine Lösung empfehlen oder vorschlagen, was ich falsch gemacht habe?

Vielen Dank,

Seán

15
Seán

Sie müssen die Zeile ändern in:

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

Wenn Sie Variablen und Zeichenfolgen verketten müssen, können Sie dies folgendermaßen 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) }}"
21
ByteNudger

Zuerst würde ich sicherstellen, dass Ihre ssh_public_key_file-Variable korrekt eingerichtet ist. Wenn Sie eine Aufgabe wie die folgende hinzufügen, was zeigt sie?

- name: display variable
  debug: var=ssh_public_key_file

Wenn die Ausgabe in etwa wie folgt aussieht, ist die Variable nicht richtig definiert (z. B. ist die "Umgebungs" -Unterschrift für den Host nicht vorhanden):

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

Wenn jedoch alles richtig definiert ist, sollte Ihre Ausgabe die Variablen anzeigen, die durch ihre korrekten Werte ersetzt wurden:

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

Sobald Sie das bestätigt haben, würde ich dasselbe mit Ihrer ssh_public_key-Variablen tun. Geben Sie den Wert einfach über das Debug-Modul aus. Es sollte als Inhalt der öffentlichen Schlüsseldatei angezeigt werden.

Eine andere Sache, die ich dringend empfehlen würde, ist, Lineinfile vollständig zu vermeiden. Da Sie mit SSH-Schlüsseln arbeiten, würde ich empfehlen, stattdessen das Modul authorised_key zu verwenden. Dies ist eine viel sauberere Art der Verwaltung von Authorized_keys-Dateien.

1
Bruce P