On Friday, January 27, 2017 at 3:25:32 AM UTC-8, Jinesh Choksi wrote:
>
>
> *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.
>
I was not aware of the slurp module prior to this. That combined with
the regex_search filter certainly opens many avenues for searching files.
I can see where this could be problematic for large files, but in this case
that is not an issue. I am running Ansible version 2.2.0.0 and that
appears to include the regex_search filter. This solution works for me, so
I will go with it.
I looked around for more information about the regex_search filter, but
found very little. It is stored in the ansible/plugins/filter/core.py file
if you want to look at it and see what other undocumented filters are
available.
-Mark
--
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/ac83c4fa-5e10-4102-aea3-d1f23dc11d85%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.