কীভাবে উত্তর দিয়ে খালি ফাইল তৈরি করবেন?


115

উত্তরযোগ্য ব্যবহার করে খালি ফাইল তৈরির সহজ উপায় কী? আমি জানি যে আমি একটি ফাঁকা ফাইল 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
@ Osকোসভান্ড্রা: আসলে তা হয় না। দেখুন: force: no
পালাকসিন্ট

ধন্যবাদ - এটি ফাইল / টাচ বা স্বীকৃত স্ট্যাটাস / ফাইলের উত্তরের চেয়ে অনেক সুন্দর সমাধান এবং "উইথ_ইটিমস" এর সাথে করা সহজ
বাস্তববাদী

দুর্দান্ত উত্তর, আপনি যে অনুরূপ কন্ট্রাক্ট সরবরাহ করেছিলেন তা ব্যবহার করে কেউ কীভাবে দুটি খালি ফাইল তৈরি করবে সে সম্পর্কে কৌতূহল ছিল?
তাসদিক রহমান

যদি এটি বিদ্যমান না থাকে তবে এটির জন্য প্যারেন্ট ডিরেক্টরি তৈরি করার কোনও উপায় আছে বা আমার আলাদাভাবে এটি করা দরকার?
মিথ্যা পকেট

আপনার প্যারেন্ট ডিরেক্টরিটি বিদ্যমান এবং তা লিখিতযোগ্য তা নিশ্চিত করতে হবে। স্ট্যাকওভারফ্লো.com
রেনি পিজল

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 সম্মত হয়েছে। যদিও এই ক্ষেত্রে, কাজটি আদর্শবান, যেহেতু "/ path / to / file" ইতিমধ্যে বিদ্যমান থাকলে এটি কার্যকর করা হবে না। আমি মনে করি রেনি পিজলের সমাধানটি তিনটি শীর্ষ উত্তরের মতো আরও উত্তরযোগ্য, এবং আপনার যদি মালিকানা, মোড ইত্যাদি সেট করার প্রয়োজন হয় তবে অবশ্যই আপনার ব্যবহার করা উচিত
লায়নোস

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
এটি আদর্শবান নয়, ফাইলের তারিখটি উত্তরযোগ্য প্লেবুকের ইচেক্সেকিউশনে সংশোধন করা হবে।
জেরুমে বি

3
উত্তর ২.ô এ জারুমে বি নিউ: আপনি এটিকে আদর্শবান করে তুলতে পারেন 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


এটি উত্তরীয় ২.7++ এর সঠিক উত্তর, তবে গুরুত্বপূর্ণ তথ্য এতে অনুপস্থিত।
হনজা

3

দেখা যাচ্ছে যে এটিকে একটি মন্তব্য হিসাবে রাখার মতো যথেষ্ট খ্যাতি আমার নেই, এটি এর জন্য আরও উপযুক্ত জায়গা হবে:

করছেন। অলব্ল্যাক্টের উত্তর, আপনি যদি উত্তরযোগ্যর বহুজাতিক বিন্যাস পছন্দ করেন তবে আপনার উদ্ধৃতি সামঞ্জস্য করতে হবে 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

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