2013-10-15 9 views
31

मेरे पास /etc/foo.txt पर एक साधारण फ़ाइल है। फ़ाइल है निम्नलिखित:उत्तरदायी lineinfile डुप्लिकेट लाइन

#bar 

मैं ऊपर लाइन uncomment के लिए निम्न ansible प्लेबुक कार्य है: जब मैं पहली बार ansible-प्लेबुक चलाने

- name: test lineinfile 
    lineinfile: backup=yes state=present dest=/etc/foo.txt 
       regexp='^#bar' 
       line='bar' 

, लाइन uncommented हो जाता है और/etc/

bar 

हालांकि, अगर मैं ansible-प्लेबुक फिर से चलाने के लिए, मैं निम्नलिखित मिल: foo.txt अब निम्नलिखित शामिल

012,
bar 
bar 

अगर मैं यह एक बार फिर से चलाने के लिए, तो /etc/foo.txt फ़ाइल इस तरह दिखेगा:

bar 
bar 
bar 

कैसे लाइनों के इस दोहराव से बचने के लिए? मैं बस '#bar' को अपनाना चाहता हूं और इसके साथ किया जाना चाहता हूं।

उत्तर

50

समस्या यह है कि कार्य का रेगेक्स केवल टिप्पणी की गई लाइन से मेल खाता है, #bar। बेवकूफ होने के लिए, लाइनिनफाइल कार्य को और लाइन की असम्बद्ध स्थिति दोनों से मेल खाने की आवश्यकता है। इस तरह यह #bar को अपूर्ण करेगा लेकिन bar अपरिवर्तित होगा।

यह कार्य आप क्या चाहते हैं करना चाहिए: "?"

- name: test lineinfile 
    lineinfile: 
    backup=yes 
    state=present 
    dest=/etc/foo.txt 
    regexp='^#?bar' 
    line='bar' 

नोट केवल परिवर्तन जोड़ने था एक रेगेक्स के लिए।

+0

लेकिन यह हमेशा फ़ाइल को बदलता है। मेरी समझ यह थी कि रेगेक्सपी मिलान होने पर लाइन केवल डाली जाती है (फ़ाइल संशोधित)। – jdevora

+0

जब तक फ़ाइल हर बार एक जैसी होती है, तो कार्य बेवकूफ है। यही बात मायने रखती है। – joemaller

+0

मुझे मुश्किल तरीका पता चला कि यदि आप इसके साथ संयोजन में 'insertafter' का उपयोग करते हैं, तो आप फिर से डुप्लिकेट लाइनों के साथ समाप्त होते हैं। 'insertafter' इस सूत्र को तोड़ता है। –

2

https://github.com/ansible/ansible/issues/4531 देखें।

समाधान टिप्पणी लाइन को प्रतिस्थापित नहीं करना है, लेकिन वहां मूल रखने के दौरान अतिरिक्त लाइन जोड़ने के लिए है।

55

यदि आप अपनी नियमित अभिव्यक्ति को बदलना नहीं चाहते हैं तो आपको बैकफ्रेस = हाँ जोड़ने की आवश्यकता है।

find 
if found 
    replace line found 
else 
    add line 

लिए:

find 
if found 
    replace line found 

दूसरे शब्दों में, इस आपरेशन idempotent बनाता

- name: test lineinfile 
    lineinfile: backup=yes state=present dest=/etc/foo.txt 
       regexp='^#bar' backrefs=yes 
       line='bar' 

इस से lineinfile के व्यवहार में परिवर्तन।

+5

यह सबसे अच्छा जवाब है। –

संबंधित मुद्दे