জবাবদিহি: বেশ কয়েকটি লাইনের জন্য লাইনফাইলে?


162

lineinfileএকটি ফাইলে একটি লাইন যুক্ত করার জন্য একটি মডিউল রয়েছে একইভাবে , বেশ কয়েকটি লাইন যুক্ত করার উপায় আছে কি?

আমি কোনও টেম্পলেট ব্যবহার করতে চাই না কারণ আপনাকে পুরো ফাইল সরবরাহ করতে হবে। টেম্পলেটটি কোনও বিকল্প নয় বলে এই ফাইলটিতে ইতিমধ্যে কী রয়েছে তা অগত্যা না জেনে আমি একটি বিদ্যমান ফাইলে কিছু যুক্ত করতে চাই।


আমি বুঝতে পারি আপনি ব্যবহার করতে চান না template, তবে ব্যবহার lineinfileকরা একটি অ্যান্টিপ্যাটার্ন । এটি একটি শক্তিশালী লাল পতাকা যা আপনি "ফাইলটিতে কী আছে তা জানেন না", যা অজানা ব্যর্থতার যথেষ্ট ঝুঁকি নিয়ে যায়।
টেডার 42

39
এটি কোনও অ্যান্টি-প্যাটার্ন নয়। লাইন ইনফাইলে মূল বিষয় হ'ল একই ফাইল পরিচালনা করতে একাধিক উত্সকে সমর্থন করা, যা কখনও কখনও অপ্রয়োজনীয় হয়। বেশিরভাগ কনফিগারেশন ফাইলের একটি নির্দিষ্ট ফর্ম্যাট থাকে এবং সংঘাত এড়ানোর জন্য যুক্তি সাধারণত খুব বেশি পরিমাণে হয় না।
ডগ এফ

আমি জানি না যে আমার পিসিতে ফাইলগুলির বিশাল সংখ্যা কী রয়েছে; এর অর্থ এই নয় যে আমি তাদের সকলকে নাক করে দিতে চাই!
ডিলানইং

উত্তর:


222

এটি করতে আপনি একটি লুপ ব্যবহার করতে পারেন । with_itemsলুপ ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হল :

- name: Set some kernel parameters
  lineinfile:
    dest: /etc/sysctl.conf
    regexp: "{{ item.regexp }}"
    line: "{{ item.line }}"
  with_items:
    - { regexp: '^kernel.shmall', line: 'kernel.shmall = 2097152' }
    - { regexp: '^kernel.shmmax', line: 'kernel.shmmax = 134217728' }
    - { regexp: '^fs.file-max', line: 'fs.file-max = 65536' }

নিশ্চিত করুন আপনার রেখার রেখা = এবং regexp = এ উদ্ধৃতিতে যুক্তি রয়েছে । আমি না, এবং আমি পেতে রাখা msg: this module requires key=value arguments। প্রদত্ত উদাহরণটির এই সঠিকটি রয়েছে - আমি কেবল উদাহরণটি অনুসরণ করি নি।
জেডিএস

1
আমি জিজ্ঞাসা করতে পারি যে প্রথম পরিবর্তনের আগে কীভাবে একটি একক ব্যাকআপ করবেন? আইটেম.ব্যাকআপ? : ডি
tdihp

6
এটি সম্ভবত উত্তর ২.০ এর আগে ভোট দেওয়া হয়েছিল। একটি ভাল উত্তর এখন হচ্ছে: stackoverflow.com/a/28306576/972128
kkurian

@ ক্কুরিয়ান অবশ্যই আপনি যদি সন্নিবেশ করছিলেন তবেই আপনি প্রতিস্থাপন করছেন যদি তা নয়?
ndtreviv

7
@ ক্কুরিয়ান ব্লকইনফিল সমাধানটি কার্যকর হবে না যদি আপনার উদাহরণস্বরূপ একটি জেসন ফাইলে কিছু লাইন যুক্ত করা দরকার এবং কোনও মার্কার না চান। আপনি চিহ্নিতকারীদের "" এ সেট করতে গেলে, উত্তরযুক্ত ব্লকফিনফিল এখনও চিহ্নিতকারীদের সন্ধান করবে, কোনও সন্ধান করবে না এবং আবার ব্লকটি সন্নিবেশ করবে। সুতরাং, চিহ্নিতকারীগুলি ছাড়া ব্লকইনফাইলে আদর্শবান নয়, লুপের সাথে লাইনফাইন হয়।
অবাস্তব

176

blockinfileপরিবর্তে আপনি ব্যবহার করার চেষ্টা করতে পারেন ।

আপনি যেমন কিছু করতে পারেন

- blockinfile: |
    dest=/etc/network/interfaces backup=yes
    content="iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0"

8
blockinfileমডিউল চমৎকার প্রত্যেক সময় আমি এটা ব্যবহার করার জন্য চয়ন করেছেন, সে কাজ করেছে। আমি বিশেষত insertafter/ insertbeforeবিকল্পগুলির স্বজ্ঞাত আচরণ পছন্দ করি।
জে টেলর

9
সর্বাধিক ভোট প্রাপ্ত উত্তরটি সম্ভবত উত্তরযোগ্য 2.0 এর আগেই ছিল তবে এখন এটিই আরও সঠিক উত্তর।
উইলেম ভ্যান কেটভিচ

11
ব্লকইনফাইলে চিহ্নিতকারী প্রয়োজন। এটি কখনও কখনও কোনও বিকল্প হয় না।
সিলিং

1
আমরা কি কন্টেন্ট ওভাররাইট করতে সক্ষম blockinfile?
পিকারামল

1
এটি করার সঠিক উপায় এটি আমার মনে হয়। docs.ansible.com/ansible/ blockinfile_module.html
পাওলো ভিক্টর

20

আপনার যদি অনন্য সম্পত্তি = মান লাইনগুলির একটি সেট কনফিগার করতে হয় তবে আমি আরও সংক্ষিপ্ত লুপের প্রস্তাব দিই। উদাহরণ স্বরূপ:

- name: Configure kernel parameters
  lineinfile:
    dest: /etc/sysctl.conf
    regexp: "^{{ item.property | regex_escape() }}="
    line: "{{ item.property }}={{ item.value }}"
  with_items:
    - { property: 'kernel.shmall', value: '2097152' }
    - { property: 'kernel.shmmax', value: '134217728' }
    - { property: 'fs.file-max', value: '65536' }

অ্যালিক্স অ্যাক্সেলের পরামর্শ অনুসারে একটি ডিক ব্যবহার করে এবং মন্তব্য করা আউটগুলিতে মিলে যাওয়া স্বয়ংক্রিয়ভাবে অপসারণ যোগ করা,

- name: Configure IPV4 Forwarding
  lineinfile:
    path: /etc/sysctl.conf
    regexp: "^#? *{{ item.key | regex_escape() }}="
    line: "{{ item.key }}={{ item.value }}"
  with_dict:
    'net.ipv4.ip_forward': 1

2
আপনি যদি_ডিক্ট ব্যবহার করেন তবে এটি আরও সংক্ষিপ্ত হবে।
অ্যালিক্স অ্যাক্সেল

18

সমাধানের একটি শব্দ-মুক্ত সংস্করণ এখানে যা_সাইটগুলি সহ ব্যবহার করা হয়:

- name: add lines
  lineinfile: 
    dest: fruits.txt
    line: '{{ item }}'
  with_items:
    - 'Orange'
    - 'Apple'
    - 'Banana' 

প্রতিটি আইটেমের জন্য, আইটেমটি ফলের মধ্যে উপস্থিত থাকলে। কোনও পদক্ষেপ নেওয়া হয় না।

যদি আইটেমটি না থাকে তবে এটি ফাইলের শেষে যুক্ত হবে।

সহজ কিছু.


এটি সন্নিবেশের পরে একত্রিত করা যায় না।
সিলিং

যদি একাধিক লাইন অনুপস্থিত থাকে তবে আমি আইটেমটি একটি ক্রমে উপস্থিত হতে চাই। যে আইটেমগুলিতে সংযোজন করা হয়েছে তাতে আমি কীভাবে নিশ্চিত হতে পারি?
মিউইই বেলজিয়াম

5

এটি আদর্শ নয়, তবে আপনাকে একাধিক কল করার অনুমতি দেওয়া হয়েছে lineinfile। এটির সাহায্যে insert_afterআপনি চাইলে ফলাফলটি পেতে পারেন:

- name: Set first line at EOF (1/3)
  lineinfile: dest=/path/to/file regexp="^string 1" line="string 1"
- name: Set second line after first (2/3)
  lineinfile: dest=/path/to/file regexp="^string 2" line="string 2" insertafter="^string 1"
- name: Set third line after second (3/3)
  lineinfile: dest=/path/to/file regexp="^string 3" line="string 3" insertafter="^string 2"

5
হ্যাঁ তবে এটি একবারে এক লাইন। আমার যদি 15 টি লাইন থাকে তবে আমি কেবলমাত্র একটি আদেশ দিয়ে তাদের যুক্ত করতে পছন্দ করব। এটি সম্ভব হবে বলে মনে হয় না।
মাইকেল

1
ধন্যবাদ। দেখে মনে হচ্ছে এটি পরে / আগে sertোকানো সহ একাধিক লাইনই কেবল একমাত্র উপায়।
টিমাস

5

আমি \nলাইন প্যারামিটার ব্যবহার করে তা করতে সক্ষম হয়েছি ।

এটি বিশেষভাবে কার্যকর যদি ফাইলটি বৈধতা দেওয়া যায় এবং একটি একক লাইন যুক্ত করা একটি অবৈধ ফাইল উত্পন্ন করে।

আমার ক্ষেত্রে, আমি যোগ ছিল AuthorizedKeysCommandএবং AuthorizedKeysCommandUserকরতে sshd_config নিম্নলিখিত কমান্ডের সাহায্যে:

- lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s'

বিকল্পগুলির মধ্যে কেবল একটি যুক্ত করা কোনও ফাইল উত্পন্ন করে যা বৈধতা ব্যর্থ করে।


12
এটি প্রতিবার প্লেবুক চালানোর সময় অতিরিক্ত সময় লাইন তৈরি করবে - এটি সঠিকভাবে সনাক্ত করতে পারে না যে লাইনটি ইতিমধ্যে বিদ্যমান। কমপক্ষে, এটি আমার জন্য উত্তরযোগ্য 1.7.1
ডেভিড

1
আমি একটি বাগ রিপোর্ট করেছি , তবে উত্তরদাতাদের এটি ঠিক করার কোনও আগ্রহ নেই।
সিলিং

1
একটি নতুন ব্লকইনফাইল মডিউল রয়েছে যা এখন সেই সমাধানের চেয়ে ভাল হওয়া উচিত। ( Docs.ansible.com/ansible/blockinfile_module.html )
Penz

1

একাধিক লাইন যুক্ত করতে আপনি ব্লকফाइल ব্যবহার করতে পারেন:

- name: Add mappings to /etc/hosts
  blockinfile:
    path: /etc/hosts
    block: |
      '10.10.10.10  server.example.com'
      '10.10.10.11  server1.example.com'

একটি লাইন যুক্ত করতে আপনি লিনিনফাইল ব্যবহার করতে পারেন:

- name: server.example.com in /etc/hosts
  lineinfile:
    path: /etc/hosts
    line: '192.0.2.42 server.example.com server'
    state: present

1

একাধিক লাইন যুক্ত করতে আপনি এখানে ভ্যারিয়েবল সহ lineinfileমডিউলটি সহজ করতে এখানে ব্যবহার করতে পারেন :)with_itemsvars

---
- hosts: localhost  #change Host group as par inventory
  gather_facts: no
  become: yes
  vars:
    test_server: "10.168.1.1"
    test_server_name: "test-server"
    file_dest: "/etc/test/test_agentd.conf"

  - name: configuring test.conf
    lineinfile:
      dest: "{{ item.dest }}"
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
    with_items:
      - { dest: '"{{ file_dest }}"', regexp: 'Server=', line: 'Server="{{test_server}}"' }
      - { dest: '"{{ file_dest }}"', regexp: 'ServerActive=', line: 'ServerActive="{{test_server}}"' }
      - { dest: '"{{ file_dest }}"', regexp: 'Hostname=', line: 'Hostname="{{test_server_name}}"' }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.