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.

Reply via email to