Hi Joanna, so using lineinfile with regexp, but without backrefs will duplicate a line and lineinfile with regexp and backrefs will not? Indeed, it seems to be like that.
- name: another replacement attempt
lineinfile:
dest: /etc/zypp/zypp.conf
backrefs: yes
regexp: '^(multiversion.kernels = latest),(latest-1),(running)$'
line: '\1,oldest,\3'
state: present
works as expected and does not create a duplicate line if regexp is not
found. The registered variable shows '"changed": false'.
I added that to the bug report...
This behaviour is not documented on
<http://docs.ansible.com/ansible/lineinfile_module.html>, so I consider
this as an error.
Werner
Joanna Delaporte [29.06.2016 20:59]:
> Hi Werner,
>
> You would want to use the backrefs feature of the lineinfile module. Here
> is an example that I use for deleting root password hashes from the
> /etc/shadow file. I use regex numbered groups (with parens and \1, etc) to
> capture and replay existing parts of lines as needed:
>
> - name: delete root password
> lineinfile: 'dest=/etc/shadow
> backup=yes
> backrefs=yes
> regexp="^(root):.*?:(.*)$"
> line="\1:*:\2"'
>
> And another example (two tasks) that update an ntp config with a new IP
> address:
>
> # The following two tasks will replace existing ntp config from .135 to .133
> - name: Fix ntp.conf
> lineinfile: dest=/etc/ntp.conf
> backup=yes
> state=present
> backrefs=yes
> regexp='^(.*server.*) 192.168.1.135'
> line='\1 192.168.1.133'
> - lineinfile: dest=/etc/ntp.conf
> state=present
> backup=yes
> backrefs=yes
> regexp='^(.*restrict.*) 192.168.1.135'
> line='\1 192.168.1.133'
>
>
>
> On Wednesday, June 29, 2016 at 1:07:36 AM UTC-5, Werner Flamme wrote:
>>
>> Hi everyone,
>>
>> I have one play that does not do what I want it to:
>>
>> - name: set kernel multiversions
>> lineinfile:
>> dest: /etc/zypp/zypp.conf
>> line: "multiversion.kernels = latest,oldest,running"
>> regexp: "multiversion.kernels = latest,latest-1,running"
>> state: present
>>
>> I expect
>> -> the module scans for a line matching "regex"
>> -> if this is found, the found line is replaced with "line"
>> -> if "regex" has no matches, nothing is done
>>
>> The module instead scans the file, and on the first run it behaves as I
>> expect, the line in the file is modified. On subsequent runs, one line
>> (per run) is added to the file (before EOF), so that I have multiple
>> lines containing "line".
>>
>> Is this behaviour expected? How can I make a replacement only when
>> "regex" matches?
>>
>> When using a registered variable, this variable is shown as:
>>
>> ok: [hostname] => {
>> "myrole_var1": {
>> "backup": "",
>> "changed": true,
>> "diff": [
>> {
>> "after": "",
>> "after_header": "/etc/zypp/zypp.conf (content)",
>> "before": "",
>> "before_header": "/etc/zypp/zypp.conf (content)"
>> },
>> {
>> "after_header": "/etc/zypp/zypp.conf (file attributes)",
>> "before_header": "/etc/zypp/zypp.conf (file attributes)"
>> }
>> ],
>> "msg": "line added"
>> }
>> }
>>
>> So nothing I could use "when" on.
>>
>> I use the blockinfile module to add a line in this file, but I do not
>> see how to use this module to replace one line. This module runs only
>> once, on subsequent runs it says "OK" instead of "Changed".
>>
>> Regards,
>> Werner
>>
>> --
>>
>>
>>
>
--
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/e0af147f-5f40-5a0d-bcb9-8dc4ee259b26%40ufz.de.
For more options, visit https://groups.google.com/d/optout.
smime.p7s
Description: S/MIME Cryptographic Signature
