*File: example_file.txt*
string1 string2 string3
string4 string5 string0
string7 string8 string9
*File: run.sh*
#!/usr/bin/env bash
ansible-playbook -vvv -i 'localhost,' -c local test.yml
*File: test.yml*
- hosts:
- localhost
tasks:
- name: "Slurp the file we wish to search"
slurp:
src: ./example_file.txt
register: slurped_file
- name: "To avoid base64 decoding multiple times, we do it once"
set_fact: plain_file="{{ slurped_file['content'] | b64decode }}"
# - name: "You can use this task to test your regex"
# debug: msg="{{ plain_file | regex_search('string7') is none}}"
- name: "Insert the wanted line into the file as it doesn't exist"
lineinfile:
dest: ./example_file.txt
line: "something {{ item }} somethingelse"
state: present
when: plain_file | regex_search(item) is none
with_items:
- string6
- string1
- string8
- foobar
Example output:
$ ./run.sh
Using /etc/ansible/ansible.cfg as config file
PLAYBOOK: test.yml
*************************************************************
1 plays in test.yml
PLAY [localhost]
***************************************************************
TASK [setup]
*******************************************************************
Using module file
/usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: algomi-deploy
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo
~/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950 `" && echo
ansible-tmp-1485515755.89-254326766505950="` echo
~/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950 `" ) && sleep 0'
<localhost> PUT /tmp/tmpP7Zu66 TO
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950/setup.py
<localhost> EXEC /bin/sh -c 'chmod u+x
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950/
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950/setup.py
&& sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950/setup.py;
rm -rf
"/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515755.89-254326766505950/"
> /dev/null 2>&1 && sleep 0'
ok: [localhost]
TASK [Slurp the file we wish to search]
****************************************
task path: /opt/home/algomi-deploy/test.yml:4
Using module file
/usr/lib/python2.7/site-packages/ansible/modules/core/network/basics/slurp.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: algomi-deploy
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo
~/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445 `" && echo
ansible-tmp-1485515756.18-190467128946445="` echo
~/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445 `" ) && sleep 0'
<localhost> PUT /tmp/tmpUjpiaz TO
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445/slurp.py
<localhost> EXEC /bin/sh -c 'chmod u+x
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445/
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445/slurp.py
&& sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445/slurp.py;
rm -rf
"/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.18-190467128946445/"
> /dev/null 2>&1 && sleep 0'
ok: [localhost] => {
"changed": false,
"content":
"c3RyaW5nMSBzdHJpbmcyIHN0cmluZzMKc3RyaW5nNCBzdHJpbmc1IHN0cmluZzAKc3RyaW5nNyBzdHJpbmc4IHN0cmluZzkK",
"encoding": "base64",
"invocation": {
"module_args": {
"src": "./example_file.txt"
},
"module_name": "slurp"
},
"source": "./example_file.txt"
}
TASK [To avoid base64 decoding multiple times, we do it once]
******************
task path: /opt/home/algomi-deploy/test.yml:10
ok: [localhost] => {
"ansible_facts": {
"plain_file": "string1 string2 string3\nstring4 string5
string0\nstring7 string8 string9\n"
},
"changed": false,
"invocation": {
"module_args": {
"plain_file": "string1 string2 string3\nstring4 string5
string0\nstring7 string8 string9\n"
},
"module_name": "set_fact"
}
}
TASK [Insert the wanted line into the file as it doesn't exist]
****************
task path: /opt/home/algomi-deploy/test.yml:17
Using module file
/usr/lib/python2.7/site-packages/ansible/modules/core/files/lineinfile.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: algomi-deploy
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo
~/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270 `" && echo
ansible-tmp-1485515756.42-101048875702270="` echo
~/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270 `" ) && sleep 0'
<localhost> PUT /tmp/tmpPv_qtT TO
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270/lineinfile.py
<localhost> EXEC /bin/sh -c 'chmod u+x
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270/
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270/lineinfile.py
&& sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270/lineinfile.py;
rm -rf
"/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.42-101048875702270/"
> /dev/null 2>&1 && sleep 0'
changed: [localhost] => (item=string6) => {
"backup": "",
"changed": true,
"diff": [
{
"after": "",
"after_header": "./example_file.txt (content)",
"before": "",
"before_header": "./example_file.txt (content)"
},
{
"after_header": "./example_file.txt (file attributes)",
"before_header": "./example_file.txt (file attributes)"
}
],
"invocation": {
"module_args": {
"backrefs": false,
"backup": false,
"content": null,
"create": false,
"delimiter": null,
"dest": "./example_file.txt",
"directory_mode": null,
"follow": false,
"force": null,
"group": null,
"insertafter": null,
"insertbefore": null,
"line": "something string6 somethingelse",
"mode": null,
"owner": null,
"regexp": null,
"remote_src": null,
"selevel": null,
"serole": null,
"setype": null,
"seuser": null,
"src": null,
"state": "present",
"unsafe_writes": null,
"validate": null
},
"module_name": "lineinfile"
},
"item": "string6",
"msg": "line added"
}
skipping: [localhost] => (item=string1) => {
"changed": false,
"item": "string1",
"skip_reason": "Conditional check failed",
"skipped": true
}
skipping: [localhost] => (item=string8) => {
"changed": false,
"item": "string8",
"skip_reason": "Conditional check failed",
"skipped": true
}
Using module file
/usr/lib/python2.7/site-packages/ansible/modules/core/files/lineinfile.py
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo
~/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938 `" && echo
ansible-tmp-1485515756.52-54649606538938="` echo
~/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938 `" ) && sleep 0'
<localhost> PUT /tmp/tmpAvxVae TO
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938/lineinfile.py
<localhost> EXEC /bin/sh -c 'chmod u+x
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938/
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938/lineinfile.py
&& sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python
/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938/lineinfile.py;
rm -rf
"/opt/home/algomi-deploy/.ansible/tmp/ansible-tmp-1485515756.52-54649606538938/"
> /dev/null 2>&1 && sleep 0'
changed: [localhost] => (item=foobar) => {
"backup": "",
"changed": true,
"diff": [
{
"after": "",
"after_header": "./example_file.txt (content)",
"before": "",
"before_header": "./example_file.txt (content)"
},
{
"after_header": "./example_file.txt (file attributes)",
"before_header": "./example_file.txt (file attributes)"
}
],
"invocation": {
"module_args": {
"backrefs": false,
"backup": false,
"content": null,
"create": false,
"delimiter": null,
"dest": "./example_file.txt",
"directory_mode": null,
"follow": false,
"force": null,
"group": null,
"insertafter": null,
"insertbefore": null,
"line": "something foobar somethingelse",
"mode": null,
"owner": null,
"regexp": null,
"remote_src": null,
"selevel": null,
"serole": null,
"setype": null,
"seuser": null,
"src": null,
"state": "present",
"unsafe_writes": null,
"validate": null
},
"module_name": "lineinfile"
},
"item": "foobar",
"msg": "line added"
}
PLAY RECAP
*********************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0
*Final contents of the example_file.txt file:*
string1 string2 string3
string4 string5 string0
string7 string8 string9
something string6 somethingelse
something foobar somethingelse
- The above slurps <http://docs.ansible.com/ansible/slurp_module.html> a
file from the "remote" node.
- It converts the base64 encoded contents of the file into plain text so
that we can regex search it
- It uses lineinfile to insert lines using with_items when the regex_search
of the plain test file doesn't match an item
The downsides of the above play are that the slurping a large file may not
be possible for you due to memory restrictions. Also, you weren't clear on
what should be inserted into the file if the sought for string was not
found and so the solution may not be complete.
Note: the regex_search filter is something new (i.e. not in the docs
<http://docs.ansible.com/ansible/playbooks_filters.html#other-useful-filters>
yet). I didn't know about it until I came across this
PR https://github.com/ansible/ansible/pull/14696
I ran the above on ansible 2.2.1.0.
--
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/d9c9844a-aece-453a-9429-5be7356f9b4c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.