2016-04-06 6 views
6

मेरे पास एक सर्वर पर कई फाइलें हैं जिन्हें मुझे ansible playbook से डाउनलोड करने की आवश्यकता है, लेकिन क्योंकि कनेक्शन में व्यवधान की संभावना है, इसलिए मैं डाउनलोड के बाद अपनी अखंडता जांचना चाहता हूं।क्या सर्वर से प्राप्त एमडी 5 फाइलों का उपयोग करके एमडी 5 के साथ फ़ाइल अखंडता की जांच करने का एक शानदार तरीका है?

मैं दो तरीकों पर विचार कर रहा हूँ:

  1. स्टोर ansible में उन फ़ाइलों की md5 वार्स के रूप में
  2. स्टोर विस्तार .md5 साथ फ़ाइलों के रूप में सर्वर पर उन फ़ाइलों की md5। ऐसी एक जोड़ी इस तरह दिखेगी: file.extension और file.extension.md5

पहले दृष्टिकोण ansible में md5s को बनाए रखने में भूमि के ऊपर परिचय देता है। तो हर बार कोई नई फाइल जोड़ता है, उसे यह सुनिश्चित करने की ज़रूरत है कि वह सही जगह पर एमडी 5 जोड़ता है।

लेकिन एक लाभ के रूप में, checksum=md5 के साथ संयोजन में निर्मित चेक का उपयोग करके इसका समाधान है। उदा .:

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

दूसरा दृष्टिकोण और अधिक सुरुचिपूर्ण और संकरी जिम्मेदारी। जब कोई सर्वर पर एक नई फ़ाइल जोड़ता है, तो वह .md5 को भी जोड़ना सुनिश्चित करेगा और उत्तरदायी प्लेबुक का उपयोग करने की भी आवश्यकता नहीं होगी।

क्या फ़ाइल से md5 से मेल खाने के लिए checksum दृष्टिकोण का उपयोग करने का कोई तरीका है?

उत्तर

11

यदि आप करने के लिए सर्वर पर फ़ाइलों में चेकसम को संग्रहीत करने की अपनी विधि के साथ जाना चाहते हैं, आप निश्चित रूप से get_url चेकसम तर्क का सत्यापन करने के लिए इसका उपयोग कर सकते हैं।

डाउनलोड करें।md5 फ़ाइल और यह एक वर में पढ़ें:

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

और फिर जब आप फाइल डाउनलोड, md5_value की सामग्री को पारित करने के लिए GET_URL:

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

ध्यान दें कि यह एक करने के लिए एक पथ निर्दिष्ट करने के लिए महत्वपूर्ण है dest में फ़ाइल; यदि आप इसे किसी निर्देशिका में सेट करते हैं (और url में फ़ाइल नाम है), व्यवहार महत्वपूर्ण रूप से बदलता है।

ध्यान दें कि आपको शायद बल की आवश्यकता है: सत्य। यह हर बार जब आप इसे चलाने के लिए एक नई फ़ाइल डाउनलोड करने का कारण बन जाएगा। चेकसम केवल तभी ट्रिगर होता है जब फाइलें डाउनलोड की जाती हैं। अगर फ़ाइल आपके मेजबान पर पहले से मौजूद है तो यह मौजूदा फ़ाइल के योग को मान्य करने के लिए परेशान नहीं होगी, जो वांछित नहीं हो सकती है।

डाउनलोड से बचने के लिए हर बार जब आप यह देखने के लिए स्टेट कर सकते हैं कि फ़ाइल पहले से मौजूद है या नहीं, तो देखें कि इसकी राशि क्या है, और बल को सशर्त रूप से सेट करें।

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

इसके अलावा, अगर आप रकम खींच रहे हैं/वेब सर्वर के कुछ प्रकार की स्मृतियों को आप वास्तव में सही यूआरएल से राशि का मूल्य वास्तव में की मेजबानी के लिए फ़ाइल डाउनलोड करने के लिए बिना प्राप्त कर सकते हैं।

- 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 

यह md5 फ़ाइल डाउनलोड करने के लिए GET_URL का उपयोग कर और फिर इसे से पढ़ने के लिए देखने का उपयोग कर के स्थान पर इस्तेमाल किया जा सकता है: यहाँ एक नेक्सस सर्वर है कि कलाकृतियों और उनके रकम की मेजबानी करेगा का उपयोग कर एक उदाहरण है।

1

सुरुचिपूर्ण समाधान ansible ही द्वारा प्रदान की नीचे 3 मॉड्यूल का उपयोग किया जाएगा

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

    md5 मान प्राप्त करने के स्टेट मॉड्यूल का उपयोग और एक चर

  2. में यह रजिस्टर http://docs.ansible.com/ansible/copy_module.html

    सर्वर से फ़ाइल की प्रतिलिपि बनाने के लिए प्रतिलिपि मॉड्यूल का उपयोग करते समय, फिर से gister वापसी इस सशर्त मॉड्यूल अन्य चर

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

    उपयोग में md5 के मूल्य से ऊपर 2 चर की तुलना और परिणाम फ़ाइल ठीक से कॉपी किया गया है या नहीं प्रिंट या नहीं

1
स्टेट मॉड्यूल के साथ

:

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

- debug: 
    var: your_file_info.stat.md5 
0

एक अन्य समाधान यूआरएल का उपयोग करने के देखने (ansible-2.3.1.0 पर परीक्षण) है:

- name: Download 
    get_url: 
    url: "http://localhost/file" 
    dest: "/tmp/file" 
    checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}" 
संबंधित मुद्दे