2016-04-06 16 views
6

Ho diversi file su un server che ho bisogno di scaricare da un ansible playbook, ma poiché la connessione ha buone possibilità di interruzione vorrei controllarne l'integrità dopo il download.C'è un modo elegante per verificare l'integrità dei file con md5 in ansible usando i file md5 recuperati dal server?

che sto considerando due approcci:

  1. Conservare l'MD5 di quei file in ansible come vars
  2. Conservare l'MD5 di tali file sul server come file con estensione .md5. Tale coppia dovrebbe essere: file.extension e file.extension.md5.

L'approccio primo introduce overhead mantenere le md5s in ansible. Quindi ogni volta che qualcuno aggiunge un nuovo file, deve assicurarsi di aggiungere l'MD5 nel posto giusto.

Ma come vantaggio, esiste una soluzione per questo, utilizzando il controllo integrato dall'azione get_url in combinazione con checksum=md5. Es .:

action: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf checksum=md5:66dffb5228a211e61d6d7ef4a86f5758 

Il secondo approccio è più elegante e restringe la responsabilità. Quando qualcuno aggiunge un nuovo file sul server, si assicurerà di aggiungere anche lo .md5 e non avrà nemmeno bisogno di usare i playbook ansibili.

C'è un modo per utilizzare l'approccio checksum per far corrispondere l'md5 da un file?

risposta

11

Se voglio andare con il tuo metodo di archiviazione del checksum nei file sul server, puoi sicuramente usare il valore di checksum get_url per convalidarlo.

Scarica il.il file md5 e leggere in una var:

- set_fact: 
    md5_value: "{{ lookup('file', '/etc/myfile.md5') }}" 

E poi, quando si scarica il file, passare il contenuto di md5_value a GET_URL:

- get_url: 
    url: http://example.com 
    dest: /my/dest/file 
    checksum: "md5:{{ md5_value }}" 
    force: true 

Nota che è di vitale importanza per specificare il percorso di un file in dest; se lo si imposta su una directory (e si ha un nome file in url), il comportamento cambia in modo significativo.

Nota anche che probabilmente hai bisogno della forza: vero. Ciò causerà il download di un nuovo file ogni volta che lo esegui. Il checksum viene attivato solo quando i file vengono scaricati. Se il file esiste già sul tuo host, non si preoccuperà di convalidare la somma del file esistente, il che potrebbe non essere desiderabile.

Per evitare il download ogni volta che è possibile fare una statistica per vedere se il file esiste già, vedere qual è la sua somma e impostare la forza param in modo condizionale.

- stat: 
    path: /my/dest/file 
    register: existing_file 

- set_fact: 
    force_new_download: "{{ existing_file.stat.md5 != md5_value }}" 
    when: existing_file.stat.exists 

- get_url: 
    url: http://example.com 
    dest: /my/dest/file 
    checksum: "md5:{{ md5_value }}" 
    force: "{{ force_new_download | default ('false') }}" 

Inoltre, se si sta tirando le somme/manufatti da una sorta di web server si può effettivamente ottenere il valore della somma direttamente dal URL senza dover scaricare effettivamente il file per l'host. Ecco un esempio utilizzando un server Nexus che avrebbe ospitato i manufatti e le loro somme:

- set_fact: 
    md5_value: "{{ item }}" 
    with_url: http://my_nexus_server.com:8081/nexus/service/local/artifact/maven/content?g=log4j&a=log4j&v=1.2.9&r=central&e=jar.md5 

Questo potrebbe essere utilizzato al posto di usare GET_URL per scaricare il file md5 e poi utilizzando la ricerca di leggere da esso.

1

La soluzione elegante userà i sottostanti 3 moduli forniti dal ansible sé

  1. http://docs.ansible.com/ansible/stat_module.html

    utilizzare il modulo stat per estrarre il valore MD5 e registrarlo in una variabile

  2. http://docs.ansible.com/ansible/copy_module.html

    durante l'utilizzo del modulo di copia per copiare il file dal server, Rulli Protetti il ​​valore di ritorno di md5 in un altro

  3. http://docs.ansible.com/ansible/playbooks_conditionals.html

    uso variabile questo modulo condizionale per confrontare i suddetti 2 variabili e stampare i risultati se il file viene copiato correttamente o meno

1

Con il modulo stat:

- stat: 
    path: "path/to/your/file" 
    register: your_file_info 

- debug: 
    var: your_file_info.stat.md5 
0

Un'altra soluzione è quella di utilizzare url lookup (testato su ansible-2.3.1.0):

- name: Download 
    get_url: 
    url: "http://localhost/file" 
    dest: "/tmp/file" 
    checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}"