জবাবদিহিতে কোনও ফাইল বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন?


128

কোনও ফাইল উপস্থিত আছে কিনা তা আমাকে পরীক্ষা করতে হবে /etc/। যদি ফাইলটি বিদ্যমান থাকে তবে আমাকে কাজটি এড়িয়ে যেতে হবে। আমি যে কোডটি ব্যবহার করছি তা এখানে:

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

উত্তর:


207

আপনি প্রথমে গন্তব্য ফাইলটি উপস্থিত আছে কিনা তা যাচাই করতে পারেন এবং তার ফলাফলের ফলাফলের ভিত্তিতে সিদ্ধান্ত নিতে পারেন:

    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মিথ্যা হবে (এবং এটি তখন দ্বিতীয় কাজটি চালিত হবে) have : আপনি এখানে পরিসংখ্যান মডিউল বিবরণ দেখতে পারবেন 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যদি এটি আরও প্রাকৃতিক পড়তে চান।
racl101

1
আপনি কি দয়া করে "Foo == মিথ্যা" এর পরিবর্তে "Foo নট" ব্যবহার করবেন?
ম্যাথিয়াস উরলিচস

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


2
ব্যবহারকারীর প্রশ্নের নির্দিষ্ট পরিস্থিতি, কমান্ড মডিউলটির ব্যবহারকারীর ব্যবহার এবং উত্তরযোগ্য সর্বোত্তম অনুশীলনের উপর ভিত্তি করে আমি এই প্রশ্নের উত্তরটির প্রথম উদাহরণটি বিবেচনা করব।
apotek

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একটি সহজ স্ট্রিং?
গচার্বন

1
জিনজা 2 টেমপ্লেটটি এখানে পথটি বৈধ করতে সহায়তা করে।
উত্তরযোগ্য

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

আপনি ফাইলটি রেজিস্ট্রেশন করতে, এবং শর্তটি প্রয়োগ করার জন্য মডিউলটি যখন উপযুক্ত স্থিতি মডিউল ব্যবহার করতে পারেন ।

- 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

**

কন্ডিশনের সাহায্যে কোনও ফাইল উত্তরবহলে বিদ্যমান কিনা তা পরীক্ষা করতে হবে

**

ওএস প্রান্তে ফাইল উপস্থিত থাকলে ফাইলটি সরাতে আমি যে উত্তরযোগ্য প্লেটি ব্যবহার করি তা নীচে।

 - 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

অন্যান্য উত্তরগুলির পরিপূরক হিসাবে আপেক্ষিক পথে একটি নোট।

কোড হিসাবে পরিকাঠামো করার সময় আমি সাধারণত ভূমিকা এবং কাজগুলি ব্যবহার করি যা আপেক্ষিক পাথ গ্রহণ করে, বিশেষত সেই ভূমিকাগুলির মধ্যে সংজ্ঞায়িত ফাইলগুলির জন্য।

প্লেবুক_ডির এবং ভূমিকা_পাথের মতো বিশেষ ভেরিয়েবলগুলি অস্তিত্বের জন্য পরীক্ষা করার জন্য প্রয়োজনীয় নিখুঁত পাথ তৈরি করতে খুব দরকারী।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.