Ansible के साथ एक खाली फ़ाइल कैसे बनाएं?


115

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

एक अन्य तरीका दूरस्थ होस्ट पर किसी फ़ाइल को स्पर्श करना है:

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

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

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

जवाबों:


189

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

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

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

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

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


15
@ .KosVandra: वास्तव में ऐसा नहीं है। देखें: force: no
पालकीसेंट

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

महान जवाब, इस बारे में उत्सुक था कि आपके द्वारा प्रदान की गई उसी निर्माण का उपयोग करके कोई दो खाली फाइलें कैसे बनाएगा?
तसादिक रहमान

अगर यह अस्तित्व में नहीं है, तो क्या इसे बनाने का कोई तरीका है, या क्या मुझे अलग से ऐसा करने की आवश्यकता है?
झूठी जेब

आपको यह सुनिश्चित करने की आवश्यकता है कि मूल निर्देशिका मौजूद है और यह लिखने योग्य है। देखें stackoverflow.com/questions/22844905/...
रेने Pijl

37

कुछ इस तरह से ( 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कार्यक्षमता का लाभ उठाने में सक्षम हो सकते हैं ।


20
शायद यह जोर से हो: "जब: p.stat.exists नहीं"
piro

28

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

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

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


5
आपको आज्ञा से जितना संभव हो उतना बचना चाहिए क्योंकि यह बेकार नहीं है। ryaneschinger.com/blog/…
redshark1802

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

15

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

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

3
यदि यह मौजूद नहीं है, तो यह जवाब लचीलेपन के कारण आपको किसी फ़ाइल की फ़ाइल विशेषताओं को परिभाषित करने में देता है।
देजय क्लेटन

10

file: path=/etc/nologin state=touch

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


3
यह उदासीन नहीं है, फ़ाइल की तारीख को एसिबल प्लेबुक के ईचेक्स्किशन पर संशोधित किया जाएगा।
Jérôme B

3
@ Jérôme B New in Ansible 2.7: आप इसे आदर्श बना सकते हैं file: path=/etc/nologin state=touch modification_time=preserve access_time=preserve
ग्रेग

8

फ़ाइल मॉड्यूल अपने समय को संशोधित किए बिना फ़ाइल को छूने का तरीका प्रदान करता है।

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: u+rw,g-wx,o-rwx
    modification_time: preserve
    access_time: preserve

संदर्भ: https://docs.ansible.com/ansible/latest/modules/file_module.html


यह सही 2.7+ के लिए सही उत्तर है, हालांकि इसमें महत्वपूर्ण जानकारी गायब है।
होनज़ा

3

पता चलता है कि मेरे पास इसे टिप्पणी के रूप में रखने के लिए पर्याप्त प्रतिष्ठा नहीं है, जो इसके लिए अधिक उपयुक्त स्थान होगा:

पुन। AllBlackt का उत्तर, यदि आप Ansible के बहुस्तरीय प्रारूप को पसंद करते हैं, तो आपको उद्धृत करने के लिए समायोजित करने की आवश्यकता है state(मैंने इसे काम करने में कुछ मिनट बिताए हैं, इसलिए उम्मीद है कि यह गति किसी और की है)

- 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

यदि फ़ाइल मौजूद नहीं है तो बदल दिया गया है। खाली फ़ाइल बनाएँ।

- name: create fake 'nologin' shell
  file:
    path: /etc/nologin
    state: touch
  register: p
  changed_when: p.diff.before.state == "absent"

0

दो उत्तरों का एक संयोजन, एक मोड़ के साथ। कोड तब बदला जाएगा जब फ़ाइल बनाई जाएगी या अनुमति अपडेट की जाएगी।

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: 0644
    modification_time: preserve
    access_time: preserve
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644"

और एक ऐसा संस्करण जो मालिक और समूह को भी सही करता है और इसका पता लगाता है जब यह इनको सही करता है:

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    state: touch
    mode: 0644
    owner: root
    group: root
    modification_time: preserve
    access_time: preserve
  register: p
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644" or
    p.diff.before.owner|default(0) != 0 or
    p.diff.before.group|default(0) != 0

ansible 2.7+ केवल - जिसका उल्लेख किया जाना चाहिए।
होन्जा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.