web-dev-qa-db-fra.com

Existe-t-il un moyen élégant de vérifier l’intégrité des fichiers avec md5 en utilisant les fichiers md5 récupérés depuis le serveur?

J'ai plusieurs fichiers sur un serveur que je dois télécharger depuis un ansible playbook, mais comme la connexion a de bonnes chances d'interruption, j'aimerais vérifier leur intégrité après le téléchargement.

J'envisage deux approches:

  1. Stocker le md5 de ces fichiers dans ansible en vars
  2. Stockez le md5 de ces fichiers sur le serveur en tant que fichiers avec l’extension .md5. Une telle paire ressemblerait à: file.extension et file.extension.md5.

L'approche first introduit une surcharge lors du maintien des md5 dans ansible. Donc, chaque fois que quelqu'un ajoute un nouveau fichier, il doit s'assurer d'ajouter le md5 au bon endroit.

Mais, il existe un avantage: il existe une solution à cela, qui consiste à utiliser l'action de vérification intégrée à partir de get_url avec checksum=md5. Par exemple.:

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

L'approche second est plus élégante et réduit la responsabilité. Lorsque quelqu'un ajoute un nouveau fichier sur le serveur, il s'assurera d'ajouter également le .md5 et n'aura même pas besoin d'utiliser les playbooks ansible.

Est-il possible d'utiliser l'approche checksum pour faire correspondre le md5 à partir d'un fichier?

7

Si vous souhaitez utiliser votre méthode de stockage de la somme de contrôle dans des fichiers sur le serveur, vous pouvez certainement utiliser l'argument de somme de contrôle get_url pour le valider. 

Téléchargez le fichier .md5 et lisez-le dans une var: 

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

Et lorsque vous téléchargez le fichier, transmettez le contenu de md5_value à get_url: 

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

Notez qu'il est essentiel de spécifier un chemin d'accès à un fichier dans dest; Si vous définissez ceci dans un répertoire (et que vous avez un nom de fichier dans url), le comportement change de manière significative.

Notez également que vous avez probablement besoin de la force: true. Cela entraînera le téléchargement d'un nouveau fichier à chaque fois que vous l'exécutez. La somme de contrôle n'est déclenchée que lorsque les fichiers sont téléchargés. Si le fichier existe déjà sur votre hôte, vous n'aurez pas à valider la somme du fichier existant, ce qui pourrait ne pas être souhaitable. 

Pour éviter le téléchargement chaque fois que vous le souhaitez, vous pouvez vérifier si le fichier existe déjà, voir quelle est sa somme et définir le paramètre force forcé. 

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

En outre, si vous extrayez les sommes/artefacts d'un serveur Web, vous pouvez obtenir la valeur de la somme directement à partir de l'URL sans avoir à télécharger le fichier sur l'hôte. Voici un exemple utilisant un serveur Nexus qui hébergerait les artefacts et leurs sommes:

- 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

Cela pourrait être utilisé à la place de get_url pour télécharger le fichier md5, puis à l'aide de lookup pour le lire. 

15
barnesm999

Avec le module stat:

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

- debug:
    var: your_file_info.stat.md5
2
modle13

La solution élégante utilisera les 3 modules ci-dessous fournis par ansible

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

    utiliser le module stat pour extraire la valeur md5 et l'enregistrer dans une variable

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

    tout en utilisant le module de copie pour copier le fichier du serveur, enregistrez la valeur de retour de md5 dans une autre variable

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

    utilisez ce module conditionnel pour comparer les 2 variables ci-dessus et imprimer les résultats, que le fichier soit copié correctement ou non

1
Ganesan Srinivasan

Une autre solution consiste à utiliser url lookup (testé sur ansible-2.3.1.0):

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