कैसे जांच करें कि क्या कोई फ़ाइल Ansible में मौजूद है?


128

मुझे यह देखना होगा कि क्या कोई फ़ाइल मौजूद है /etc/। यदि फ़ाइल मौजूद है, तो मुझे कार्य को छोड़ना होगा। यहाँ कोड का उपयोग कर रहा हूँ:

- name: checking the file exists
  command: touch file.txt
  when: $(! -s /etc/file.txt)

जवाबों:


208

आप पहले जांच सकते हैं कि गंतव्य फ़ाइल मौजूद है या नहीं और फिर उसके परिणाम के आधार पर निर्णय लें:

    tasks:
      - name: Check that the somefile.conf exists
        stat:
          path: /etc/file.txt
        register: stat_result

      - name: Create the file, if it doesnt exist already
        file:
          path: /etc/file.txt
          state: touch
        when: not stat_result.stat.exists

1
क्या होगा अगर निर्देशिका मौजूद नहीं है?
ram4nd

2
यदि निर्देशिका मौजूद नहीं है, तो रजिस्टर stat_resultमें एक stat_result.state.existsगलत (और जब दूसरा कार्य चलता है) होगा। : आप यहाँ स्टेट मॉड्यूल का विवरण देख सकते docs.ansible.com/ansible/stat_module.html
विल

1
कब: stat_result.stat.exists परिभाषित किया गया है और stat_result.stat.exists
danday74

2
इसके लिए धन्यवाद। इसके अलावा, अगर पता चला आप लिख सकते हैं: when: stat_result.stat.exists == Falseकरने के लिए when: not stat_result.stat.existsयदि आप इसे करना चाहते हैं और अधिक प्राकृतिक पढ़ने के लिए।
रासलीला १०

1
क्या आप कृपया "फू == मिथ्या" के बजाय "फू फू" का उपयोग नहीं करेंगे?
मथायस उरलिचस

32

स्टेट मॉड्यूल इस के रूप में अच्छी तरह से करने के रूप में फाइल के लिए अन्य जानकारी का एक बहुत कुछ प्राप्त करेंगे। उदाहरण के दस्तावेज से:

- stat: path=/path/to/something
  register: p

- debug: msg="Path exists and is a directory"
  when: p.stat.isdir is defined and p.stat.isdir

नवीनतम संस्करणों की तरह दिखता है, "=", "<", ">" आदि के बजाय "पूर्ण पाठ तुलना" जैसे "आदि" का उपयोग करते समय एक चेतावनी है
बुज़ुत

24

फ़ाइल के मौजूद होने पर कार्य को छोड़ने के लिए यह स्टेटमेंट मॉड्यूल के साथ प्राप्त किया जा सकता है।

- hosts: servers
  tasks:
  - name: Ansible check file exists.
    stat:
      path: /etc/issue
    register: p
  - debug:
      msg: "File exists..."
    when: p.stat.exists
  - debug:
      msg: "File not found"
    when: p.stat.exists == False

16

सामान्य तौर पर आप स्टेट मॉड्यूल के साथ ऐसा करेंगे । लेकिन कमांड मॉड्यूल के पास createsविकल्प है जो इसे बहुत सरल बनाता है:

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

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

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch

1
state: fileफ़ाइलें नहीं बनाता है। देखें docs.ansible.com/ansible/file_module.html
माइकल Krupp

2
मैं इस प्रश्न के लिए सही उत्तर में पहले उदाहरण पर विचार करूंगा, उपयोगकर्ता के प्रश्न की विशिष्ट परिस्थितियों के आधार पर, उपयोगकर्ता के कमांड मॉड्यूल का उपयोग, और ansible सर्वोत्तम प्रथाओं।
एपकोट १६'१

2
vars:
  mypath: "/etc/file.txt"

tasks:
  - name: checking the file exists
    command: touch file.txt
    when: mypath is not exists

2
आप अपने उत्तर की व्याख्या नहीं करते हैं, और when: mypath is not existsइस मामले में क्या मतलब है? mypathएक साधारण स्ट्रिंग नहीं है?
gcharbon

1
Jinja2 टेम्पलेट यहाँ पथ को मान्य करने में मदद करता है। Ansible डॉक्स
ड्रीमयूथ

10
नियंत्रक पर फ़ाइलों के लिए इस चेक को नोट करें, रिमोट नहीं।
फीफ

2

मुझे लगता है कि यह इन .stat.existsप्रकार की जांच करने के लिए कष्टप्रद और त्रुटि हो सकती है । उदाहरण के लिए उन्हें चेक मोड ( --check) काम करने के लिए अतिरिक्त देखभाल की आवश्यकता होती है ।

यहाँ कई उत्तर सुझाते हैं

  • प्राप्त करें और पंजीकरण करें
  • लागू करें जब रजिस्टर अभिव्यक्ति सच है

हालाँकि, कभी-कभी यह एक कोड गंध होता है इसलिए हमेशा बेहतर तरीके से अंसिबल का उपयोग करने के लिए देखें, विशेष रूप से सही मॉड्यूल का उपयोग करने के कई फायदे हैं। जैसे

- name: install ntpdate
  package:
    name: ntpdate

या

- file:
    path: /etc/file.txt
    owner: root
    group: root
    mode: 0644

लेकिन जब एक मॉड्यूल का उपयोग करना संभव नहीं है, तो यह भी जांच लें कि क्या आप पिछले कार्य के परिणाम को पंजीकृत और जांच सकते हैं। जैसे

# jmeter_version: 4.0 
- name: Download Jmeter archive
  get_url:
    url: "http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
    checksum: sha512:eee7d68bd1f7e7b269fabaf8f09821697165518b112a979a25c5f128c4de8ca6ad12d3b20cd9380a2b53ca52762b4c4979e564a8c2ff37196692fbd217f1e343
  register: download_result

- name: Extract apache-jmeter
  unarchive:
    src: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/"
    remote_src: yes
    creates: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}"
  when: download_result.state == 'file'

नोट when:लेकिन यह भी creates:तो --checkबाहर त्रुटि नहीं है

मैं इसका उल्लेख करता हूं क्योंकि अक्सर ये कम-से-आदर्श अभ्यास जोड़े में आते हैं अर्थात कोई उपयुक्त / यम पैकेज नहीं है इसलिए हमें 1) डाउनलोड और 2) अनज़िप करना होगा

उम्मीद है की यह मदद करेगा


2

पता चला कि कॉलिंग statधीमा है और बहुत सारी जानकारी एकत्र करता है जो फ़ाइल अस्तित्व की जांच के लिए आवश्यक नहीं है।
समाधान खोजने में कुछ समय बिताने के बाद, मैंने निम्नलिखित समाधान खोजे, जो बहुत तेजी से काम करता है:

- raw: test -e /path/to/something && echo true || echo false
  register: file_exists

- debug: msg="Path exists"
  when: file_exists == true

1
कृपया अपने उत्तर में बताएं, क्या समस्या थी, और यह स्निपेट इसे कैसे हल करेगा, दूसरों को इस उत्तर को समझने में मदद करने के लिए
FZs

1

आप फ़ाइल को पंजीकृत करने के लिए और हालत को लागू करने के लिए मॉड्यूल के लिए Ansible स्टेट मॉड्यूल का उपयोग कर सकते हैं।

- name: Register file
      stat:
        path: "/tmp/test_file"
      register: file_path

- name: Create file if it doesn't exists
      file: 
        path: "/tmp/test_file"
        state: touch
      when: file_path.stat.exists == False

0

**

अगर हालत का उपयोग करके किसी फ़ाइल को Ansible में मौजूद है, तो कैसे जांचें

**

नीचे asible play है जिसका उपयोग मैंने फाइल को OS अंत में मौजूद फाइल को हटाने के लिए किया था।

 - name: find out /etc/init.d/splunk file exists or not'
      stat:
        path: /etc/init.d/splunk
      register: splunkresult
      tags:
        - always

    - name: 'Remove splunk from init.d file if splunk already running'
      file:
        path: /etc/init.d/splunk
        state: absent
      when: splunkresult.stat.exists == true
      ignore_errors: yes
      tags:
        - always

मैंने नीचे की तरह प्ले कंडीशन का उपयोग किया है

when: splunkresult.stat.exists == true --> Remove the file

आप अपनी आवश्यकता के आधार पर सही / गलत दे सकते हैं

when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true

0

यदि आप केवल यह सुनिश्चित करना चाहते हैं कि एक निश्चित फ़ाइल मौजूद है (f.ex. क्योंकि यह अलग तरीके से अलग तरीके से बनाई जा सकती है) और असफल हो सकती है यदि यह नहीं है, तो आप ऐसा कर सकते हैं:

- name: sanity check that /some/path/file exists
  command: stat /some/path/file
  check_mode: no # always run
  changed_when: false # doesn't change anything

0

अन्य उत्तरों के पूरक के लिए सापेक्ष पथ पर एक नोट।

कोड के रूप में इन्फ्रास्ट्रक्चर करते समय मैं आमतौर पर भूमिकाओं और कार्यों का उपयोग करता हूं जो सापेक्ष पथों को स्वीकार करते हैं, विशेष रूप से उन भूमिकाओं में परिभाषित फाइलों के लिए।

अस्तित्व के परीक्षण के लिए आवश्यक निरपेक्ष पथ बनाने के लिए playbook_dir और role_path जैसे विशेष चर बहुत उपयोगी हैं।

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