2015-02-05 18 views
61

Ansible का उपयोग कर खाली फ़ाइल बनाने का सबसे आसान तरीका क्या है? मुझे पता है कि मैं एक खाली फ़ाइल को files निर्देशिका में सहेज सकता हूं और फिर इसे दूरस्थ होस्ट पर कॉपी कर सकता हूं, लेकिन मुझे लगता है कि कुछ हद तक असंतोषजनक है।उत्तरदायी के साथ एक खाली फ़ाइल कैसे बनाएं?

एक और तरीका है दूरस्थ होस्ट पर एक फ़ाइल को छूने के लिए है:

- name: create fake 'nologin' shell 
    file: path=/etc/nologin state=touch owner=root group=sys mode=0555 

लेकिन फिर फ़ाइल हर बार छुआ जाता है, लॉग में एक पीली लाइन है, जो भी असंतोषजनक है के रूप में दिखने ...

क्या इस साधारण समस्या का कोई बेहतर समाधान है?

उत्तर

79

फ़ाइल मॉड्यूल के प्रलेखन कहते हैं state=file

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

तो हम प्रति मॉड्यूल का उपयोग, एक नया खाली फ़ाइल केवल जब फ़ाइल अभी मौजूद नहीं है (यदि फ़ाइल मौजूद है, उसकी सामग्री संरक्षित है) बनाने के लिए force=no का उपयोग कर।

- name: ensure file exists 
    copy: 
    content: "" 
    dest: /etc/nologin 
    force: no 
    group: sys 
    owner: root 
    mode: 0555 

यह एक घोषणात्मक और सुरुचिपूर्ण समाधान है।

+1

यह फ़ाइल को खाली कर देता है, अगर यह पहले से मौजूद है –

+10

@ अकोसवंद्रा: असल में यह नहीं है। देखें: 'बल: नहीं'। – palacsint

+0

धन्यवाद - यह फ़ाइल/स्पर्श या स्वीकृत स्टेट/फ़ाइल उत्तर से बहुत अच्छा समाधान है, और "with_items" – Realist

29

कुछ इस तरह (प्रथम stat मॉड्यूल का उपयोग कर इसके बारे में डेटा इकट्ठा करने और फिर एक सशर्त का उपयोग कर छानने) काम करना चाहिए:

- stat: path=/etc/nologin 
    register: p 

- name: create fake 'nologin' shell 
    file: path=/etc/nologin state=touch owner=root group=sys mode=0555 
    when: p.stat.exists is defined and not p.stat.exists 

आप वैकल्पिक रूप से changed_when कार्यक्षमता लाभ उठाने के लिए सक्षम हो सकता है।

+18

शायद यह हो shoud: "जब: नहीं p.stat.exists" – piro

21

एक अन्य विकल्प, कमांड मॉड्यूल का उपयोग कर:

- name: Create file 
    command: touch /path/to/file 
    args: 
    creates: /path/to/file 

'बनाता है' तर्क सुनिश्चित करता है कि यह क्रिया नहीं है, तो फ़ाइल मौजूद है।

+1

आप जितना संभव हो उतना आदेश से बचना चाहिए क्योंकि यह idempotent नहीं है। http://ryaneschinger.com/blog/ensuring-command-module-task-is-repeatable-with-ansible/ – redshark1802

+1

@ redshark1802 सहमत हैं। यद्यपि इस मामले में, कार्य बेवकूफ है, क्योंकि यह "/ path/to/file" पहले से मौजूद है, तो इसे निष्पादित नहीं किया जाएगा। मुझे लगता है कि रेने पिज्ल का समाधान तीन शीर्ष उत्तरों की तरह अधिक उत्तरदायी है, और निश्चित रूप से आपको इसका उपयोग करना चाहिए यदि आपको स्वामित्व, मोड इत्यादि सेट करने की आवश्यकता है। – Leynos

9

स्वीकार्य उत्तर पर बिल्डिंग, यदि आप फ़ाइल को प्रत्येक रन पर अनुमतियों के लिए चेक करना चाहते हैं, और फ़ाइल के अस्तित्व के अनुसार ये बदल गए हैं, या अगर फ़ाइल मौजूद नहीं है तो बस फ़ाइल बनाएं, तो आप निम्न का उपयोग कर सकते हैं :

- stat: path=/etc/nologin 
    register: p 

- name: create fake 'nologin' shell 
    file: path=/etc/nologin 
     owner=root 
     group=sys 
     mode=0555 
     state={{ "file" if p.stat.exists else "touch"}} 
+0

यह उत्तर लचीलापन के कारण आपको शानदार है क्योंकि यह आपको परिभाषित करने में देता है फ़ाइल की फ़ाइल विशेषताएँ यदि यह मौजूद नहीं है। –

8

file: path=/etc/nologin state=touch

स्पर्श (1.4 + में नया) की पूर्ण बराबर - उपयोग स्टेट यदि आप फ़ाइल टाइमस्टैम्प बदलने के लिए नहीं करना चाहती।

संबंधित मुद्दे