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:
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?
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.
Avec le module stat:
- stat:
path: "path/to/your/file"
register: your_file_info
- debug:
var: your_file_info.stat.md5
La solution élégante utilisera les 3 modules ci-dessous fournis par ansible
http://docs.ansible.com/ansible/stat_module.html
utiliser le module stat pour extraire la valeur md5 et l'enregistrer dans une variable
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
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
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') }}"