2015-02-19 15 views
13

Sto cercando di leggere il contenuto di un file, archiviarlo in una variabile e quindi inserirlo in un altro file se non esistono già.Utilizzo di variabili per il nome file e il contenuto del file nel modulo lineinfile

Allora, come sto cercando di andare su questo è la seguente:

# 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 }}') }}" 

Ho quindi utilizzare queste variabili nel mio playbook Ansible come segue:

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

Tuttavia, quando provo ed eseguo il playbook, ricevo il seguente messaggio di errore:

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

Qualcuno può consigliare una soluzione o suggerire cosa potrei aver fatto di sbagliato?

Grazie,

Seán

+0

Ho il sospetto Jinja2 non si espande all'interno virgolette singole . Non sicuro al 100%. In ogni caso, per favore usa il modulo 'template' invece di lineinfile. Sarà molto meno caotico su tutta la linea. – tedder42

+0

Hey @ Seán hai trovato una soluzione per il tuo problema? Al momento ho lo stesso problema e forse puoi condividere la tua soluzione con me/gli altri. Grazie – ByteNudger

risposta

1

Prima vorrei fare in modo che la variabile ssh_public_key_file è impostato correttamente. Se aggiungi un'attività come quella che segue, cosa mostra?

- name: display variable 
    debug: var=ssh_public_key_file 

Se l'output simile a questa, allora la variabile non è definita correttamente (es. Il fatto "ambiente" non esiste per l'host):

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

Tuttavia, se tutto è definito correttamente allora il vostro output dovrebbe mostrare le variabili sostituito con i loro valori corretti:

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

Dopo aver verificato che poi vorrei fare la stessa cosa con il vostro ssh_public_key variabile. Esegui semplicemente il suo valore usando il modulo di debug. Dovrebbe essere visualizzato come il contenuto del file della chiave pubblica.

Un'altra cosa che suggerirei fortemente è di evitare del tutto l'uso del lineinfile. Poiché stai lavorando con le chiavi SSH, ti consigliamo di utilizzare il modulo authorized_key. È un modo molto più semplice di gestire i file authorized_keys.

15

Devi cambiare la linea:

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

Se è necessario concatenare le variabili e le stringhe si può fare in questo modo:

# 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) }}" 
Problemi correlati