जवाबों:
आप पहले जांच सकते हैं कि गंतव्य फ़ाइल मौजूद है या नहीं और फिर उसके परिणाम के आधार पर निर्णय लें:
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
stat_result
में एक stat_result.state.exists
गलत (और जब दूसरा कार्य चलता है) होगा। : आप यहाँ स्टेट मॉड्यूल का विवरण देख सकते docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
करने के लिए when: not stat_result.stat.exists
यदि आप इसे करना चाहते हैं और अधिक प्राकृतिक पढ़ने के लिए।
स्टेट मॉड्यूल इस के रूप में अच्छी तरह से करने के रूप में फाइल के लिए अन्य जानकारी का एक बहुत कुछ प्राप्त करेंगे। उदाहरण के दस्तावेज से:
- 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
फ़ाइल के मौजूद होने पर कार्य को छोड़ने के लिए यह स्टेटमेंट मॉड्यूल के साथ प्राप्त किया जा सकता है।
- 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
सामान्य तौर पर आप स्टेट मॉड्यूल के साथ ऐसा करेंगे । लेकिन कमांड मॉड्यूल के पास 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
state: file
फ़ाइलें नहीं बनाता है। देखें docs.ansible.com/ansible/file_module.html
vars:
mypath: "/etc/file.txt"
tasks:
- name: checking the file exists
command: touch file.txt
when: mypath is not exists
when: mypath is not exists
इस मामले में क्या मतलब है? mypath
एक साधारण स्ट्रिंग नहीं है?
मुझे लगता है कि यह इन .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) अनज़िप करना होगा
उम्मीद है की यह मदद करेगा
पता चला कि कॉलिंग stat
धीमा है और बहुत सारी जानकारी एकत्र करता है जो फ़ाइल अस्तित्व की जांच के लिए आवश्यक नहीं है।
समाधान खोजने में कुछ समय बिताने के बाद, मैंने निम्नलिखित समाधान खोजे, जो बहुत तेजी से काम करता है:
- raw: test -e /path/to/something && echo true || echo false
register: file_exists
- debug: msg="Path exists"
when: file_exists == true
आप फ़ाइल को पंजीकृत करने के लिए और हालत को लागू करने के लिए मॉड्यूल के लिए 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
**
**
नीचे 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
यदि आप केवल यह सुनिश्चित करना चाहते हैं कि एक निश्चित फ़ाइल मौजूद है (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
अन्य उत्तरों के पूरक के लिए सापेक्ष पथ पर एक नोट।
कोड के रूप में इन्फ्रास्ट्रक्चर करते समय मैं आमतौर पर भूमिकाओं और कार्यों का उपयोग करता हूं जो सापेक्ष पथों को स्वीकार करते हैं, विशेष रूप से उन भूमिकाओं में परिभाषित फाइलों के लिए।
अस्तित्व के परीक्षण के लिए आवश्यक निरपेक्ष पथ बनाने के लिए playbook_dir और role_path जैसे विशेष चर बहुत उपयोगी हैं।