ऑटो का आसान तरीका क्या है कि गैर-मौजूद में गैर-मौजूदा डायर बनाएं


117

मेरी एन्सिबल प्लेबुक में कई बार मुझे वहां फाइल बनाने की जरूरत पड़ती है

 - name: Copy file
   template:
     src: code.conf.j2
     dest: "{{project_root}}/conf/code.conf"

अब कई बार confदिर नहीं है। फिर मुझे पहले उस डायर को बनाने के लिए अधिक कार्य करना होगा।

यदि किसी विकल्प के साथ मौजूद नहीं है, तो ऑटो को dir बनाने का कोई आसान तरीका है



मुझे विश्वास नहीं हो रहा है कि यह अभी भी ansible 2.9 में एक मुद्दा है। इन मॉड्यूल्स के लिए कितना मुश्किल होगा कि वे एक डीआईआर टॉगल करें, जिसे बंद किया जाए। यह नाटकपुस्तकों में बहुत अधिक गिरावट को बचाएगा, नीचे दिए गए उत्तरों की तरह बहानों से निपटने के लिए
krad

जवाबों:


139

अभी, यह एकमात्र तरीका है

- name: Ensures {{project_root}}/conf dir exists
  file: path={{project_root}}/conf state=directory
- name: Copy file
  template:
    src: code.conf.j2
    dest: "{{project_root}}/conf/code.conf"

2
मुझे लगता है कि यह सुनिश्चित करना सही शब्द है। आश्वासन: "किसी को किसी भी संदेह को दूर करने के लिए सकारात्मक रूप से बताएं", सुनिश्चित करें: "यह सुनिश्चित करें कि (कुछ) घटित होगा या मामला होगा"।
डैनियल कॉम्पटन

ऐसा लगता है कि अगर प्रत्यक्ष मौजूद है तो जाँच करें, लेकिन यह इसे बनाने के लिए प्रतीत नहीं होता है।
मैट

8
नोट करना चाहिए जिसे आप जोड़ना चाहते हो सकता है कि recurse=yesकरने के लिए fileप्राप्त करने के लिए कॉल mkdir -pप्रकार व्यवहार
मिच

1
पहेली का एक और टुकड़ा जो सहायक हो सकता है वह निर्देशिका प्राप्त करने के लिए एक विशिष्ट-विशिष्ट dirnameफ़िल्टर है जिसमें एक फ़ाइल शामिल है।
कैस्पर

1
@radtek फ़ाइल मॉड्यूल पहले से ही राज्य = निर्देशिका के साथ करता है। यदि यह सुनिश्चित करना संभव नहीं है कि प्रस्तावित फ़ाइल पथ निर्देशिका के लिए इंगित करता है।
अलेक्जेंडर जार्डिम

21

पूर्ण पथ उपयोग के साथ सफलता सुनिश्चित करने के लिए पुनरावृत्ति = हाँ

- name: ensure custom facts directory exists
    file: >
      path=/etc/ansible/facts.d
      recurse=yes
      state=directory

2
प्रलेखन (और मेरे परीक्षण) के अनुसार, उपनिर्देशिकाएं हमेशा बनाई जाती हैं, और recurse=yesकेवल पुनरावृत्ति की अनुमति लागू होती है। हालाँकि, प्रलेखन बताता है कि यह v1.7 के बाद से स्वचालित रूप से होता है, इसलिए recurseअच्छी तरह से अप्रचलित हो सकता है।
To एसई

16

यदि आप Ansible> = 2.0 चला रहे हैं, तो dirname फ़िल्टर भी है जिसका उपयोग आप किसी पथ के निर्देशिका भाग को निकालने के लिए कर सकते हैं। इस तरह से आप केवल एक चर का उपयोग करके पूरे पथ को पकड़ सकते हैं, ताकि यह सुनिश्चित हो सके कि दोनों कार्य कभी भी सिंक से बाहर न हों।

उदाहरण के लिए यदि आपके पास dest_pathएक चर में परिभाषित प्लेबुक है जैसे कि आप उसी चर का पुन: उपयोग कर सकते हैं:

- name: My playbook
  vars:
    dest_path: /home/ubuntu/some_dir/some_file.txt
  tasks:

    - name: Make sure destination dir exists
      file:
        path: "{{ dest_path | dirname }}"
        state: directory
        recurse: yes

    # now this task is always save to run no matter how dest_path get's changed arround
    - name: Add file or template to remote instance
      template: 
        src: foo.txt.j2
        dest: "{{ dest_path }}"

1
जबकि यह समाधान अभी भी क्रिया है, मुझे लगता है कि यह लेखक के इरादे के सबसे करीब है। मुझे अच्छा लगेगा अगर साल्ट की तरह एक साधारण 'makedirs' पैरामीटर हो: docs.saltstack.com/en/latest/ref/states/all/…
lsh

7

AFAIK, इसका एकमात्र तरीका विकल्प का उपयोग करके किया जा सकता है state=directory। जबकि templateमॉड्यूल अधिकांश copyविकल्पों का समर्थन करता है , जो बदले में अधिकांश fileविकल्पों का समर्थन करता है , आप state=directoryइसके साथ कुछ का उपयोग नहीं कर सकते । इसके अलावा, यह काफी भ्रामक होगा (इसका मतलब यह होगा कि {{project_root}}/conf/code.confयह एक निर्देशिका है? या इसका मतलब यह होगा कि {{project_root}}/conf/पहले बनाया जाना चाहिए।

इसलिए मुझे नहीं लगता कि पिछले fileकार्य को जोड़े बिना अभी यह संभव है ।

- file: 
    path: "{{project_root}}/conf"
    state: directory
    recurse: yes

7

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

- name: create directory with parent directories
  file:
    path: /data/test/foo
    state: directory

यह मूल निर्देशिका डेटा बनाने और फू के साथ परीक्षण करने के लिए पर्याप्त किराया है

कृपया पैरामीटर विवरण देखें - " स्थिति " http://docs.ansible.com/ansible/latest/modules/file_module.html


कृपया भविष्य में तोड़े जा सकने वाले लिंक के बजाय यहां समाधान जोड़ें।
इग्नासियो आरा

@IgnacioAra बहुमूल्य टिप्पणी के लिए धन्यवाद, मैंने समाधान जोड़ा है।
एल्बी

1

आप अपने अनुषंगी संस्करण के आधार पर निम्नलिखित का उपयोग करके फ़ोल्डर बना सकते हैं।

नवीनतम संस्करण 2 <

- name: Create Folder
  file: 
   path: "{{project_root}}/conf"
   recurse: yes
   state: directory

पुराना संस्करण:

- name: Create Folder
  file: 
      path="{{project_root}}/conf"
      recurse: yes
      state=directory

देखें - http://docs.ansible.com/ansible/latest/file_module.html


1

यदि यह नहीं है तो कॉपी मॉड्यूल निर्देशिका बनाता है। इस मामले में इसने रेजोल्यूशन को बनाया ।conf.d निर्देशिका

- name: put fallback_dns.conf in place                                                                 
  copy:                                                                                                
    src: fallback_dns.conf                                                                             
    dest: /etc/systemd/resolved.conf.d/                                                                
    mode: '0644'                                                                                       
    owner: root                                                                                        
    group: root                                                                                        
  become: true                                                                                         
  tags: testing
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.