ansible parse text string from stdout

2,979 views
Skip to first unread message

Saravanan

unread,
Nov 30, 2018, 4:39:46 PM11/30/18
to Ansible Project
Hi Ansible Experts,
Need help to capture the JBOSS EAP JVM uptime value through Ansible playbook. From the below task stdout need to parse the uptime value which is in numeric field to a variable. 

{
    "outcome" => "success",
    "result" => 3613082543L
}

Can you please suggest the right string parsing method to achieve this? I was unable to use Unix commands like grep/ awk/ sed to filter this numeric value.

Kai Stian Olstad

unread,
Nov 30, 2018, 7:35:11 PM11/30/18
to ansible...@googlegroups.com
You have not provided the task, but if you are using the shell module just add
| awk '/result/ { print $3 }'
and you stdout will only contain that value.



--
Kai Stian Olstad


Saravanan

unread,
Nov 30, 2018, 9:11:52 PM11/30/18
to Ansible Project
Thanks for your reply Kai.
I am using the below task using command module to get the uptime value of JBOSS EAP server instance. However still I am receiving error as mentioned below.

- name: Check the JBOSS Server Uptime Domain mode
 
command: "{{ CLI_SCRIPT }} --connect controller={{ item.hostname }}:{{ item.port }} --user={{ jbossuser }} --password={{ jbosspass }} /host={{ item.host }}-{{ item.server }}/core-service=platform-mbean/type=runtime:read-attribute(name=uptime)| awk '/result/ { print $3 }'"
  register: uptime
 
delegate_to: remoteserver
 
ignore_errors: yes

Error message:
fatal: [127.0.0.1 -> remoteserver]: FAILED! => {"changed": true, "cmd": ["/opt/jboss/jboss-eap-7.2.0/bin/jboss-cli.sh", "--connect", "controller=remoteserver:11011", "--user=someuser", "--password=sometext", "/host=jbosshost-server/core-service=platform-mbean/type=runtime:read-attribute(name=uptime)|", "awk", "/result/ { print $3 }"], "delta": "0:00:09.420046", "end": "2018-11-30 20:05:18.798064", "msg": "non-zero return code", "rc": 1, "start": "2018-11-30 20:05:09.378018", "stderr": "Duplicate argument '--command'/'--commands'.", "stderr_lines": ["Duplicate argument '--command'/'--commands'."], "stdout": "", "stdout_lines": []}

I believe we can use Ansible regex, to capture this value.

Kai Stian Olstad

unread,
Dec 1, 2018, 5:14:10 AM12/1/18
to ansible...@googlegroups.com
On Saturday, 1 December 2018 03:11:52 CET Saravanan wrote:
> Thanks for your reply Kai.
> I am using the below task using command module to get the uptime value of
> JBOSS EAP server instance. However still I am receiving error as mentioned
> below.
>
> - name: Check the JBOSS Server Uptime Domain mode
> command: "{{ CLI_SCRIPT }} --connect controller={{ item.hostname }}:{{ item.port }} --user={{ jbossuser }} --password={{ jbosspass }} /host={{ item.host }}-{{ item.server }}/core-service=platform-mbean/type=runtime:read-attribute(name=uptime)| awk '/result/ { print $3 }'"
> register: uptime
> delegate_to: remoteserver
> ignore_errors: yes

Command module doesn't support pipe or redirect only shell module does that.
So just replace command: with shell: and it this should work.


> I believe we can use Ansible regex, to capture this value.

To my knowledge (or lack there of) this is actually cumbersome to achieve in Ansible, just using shell module and add awk is way easier.



--
Kai Stian Olstad


Saravanan

unread,
Dec 2, 2018, 1:08:54 PM12/2/18
to Ansible Project
Unable to use shell module to query the JBOSS uptime with CLI script in Ansible. Can you please help to rectify the error?

 - name: Check the JBOSS Server Uptime Domain mode
   shell: "{{ CLI_SCRIPT }} --connect controller={{ item.hostname }}:{{ item.port }} --user={{ myusername }} --password={{ mypassword }} /host={{ item.host }}-{{ item.server }}/core-service=platform-mbean/type=runtime:read-attribute(name=uptime)| awk '/result/ { print $3 }'"
   register: uptime
   delegate_to: remoteserver
   ignore_errors: yes

Error message:

fatal: [127.0.0.1 -> remoteserver]: FAILED! => {"changed": true, "cmd": "/opt/jboss/jboss-eap-7.2.0/bin/jboss-cli.sh --connect controller=jbossserver:11011 --user=myusername --password=mypassword /host=jbosshost-server/core-service=platform-mbean/type=runtime:read-attribute(name=uptime) | awk '/result/ { print $3 }'", "delta": "0:00:00.278269", "end": "2018-12-02 12:03:04.863388", "msg": "non-zero return code", "rc": 2, "start": "2018-12-02 12:03:04.585119", "stderr": "/bin/sh: syntax error at line 1: `(' unexpected", "stderr_lines": ["/bin/sh: syntax error at line 1: `(' unexpected"], "stdout": "", "stdout_lines": []}


Kai Stian Olstad

unread,
Dec 2, 2018, 1:18:40 PM12/2/18
to ansible...@googlegroups.com
On Sunday, 2 December 2018 19:08:54 CET Saravanan wrote:
> Unable to use shell module to query the JBOSS uptime with CLI script in
> Ansible. Can you please help to rectify the error?
>
> - name: Check the JBOSS Server Uptime Domain mode
> shell: "{{ CLI_SCRIPT }} --connect controller={{ item.hostname }}:{{
> item.port }} --user={{ myusername }} --password={{ mypassword }} /host={{
> item.host }}-{{ item.server }}/core-service=platform-
> mbean/type=runtime:read-attribute(name=uptime)| awk '/result/ { print $3 }'"
> register: uptime
> delegate_to: remoteserver
> ignore_errors: yes
>
> Error message:
>
> fatal: [127.0.0.1 -> remoteserver]: FAILED! => {"changed": true, "cmd": "
> /opt/jboss/jboss-eap-7.2.0/bin/jboss-cli.sh --connect
> controller=jbossserver:11011 --user=myusername --password=mypassword
> /host=jbosshost-server/core-service=platform-mbean/type=runtime:read-attribute(name=uptime)
> | awk '/result/ { print $3 }'", "delta": "0:00:00.278269", "end":
> "2018-12-02 12:03:04.863388", "msg": "non-zero return code", "rc": 2,
> "start": "2018-12-02 12:03:04.585119", "stderr": "/bin/sh: syntax error at
> line 1: `(' unexpected", "stderr_lines": ["/bin/sh: syntax error at line 1:
> `(' unexpected"], "stdout": "", "stdout_lines": []}

It doesn't like the parenthesise so try to escape them both with a backslash.


--
Kai Stian Olstad


Saravanan

unread,
Dec 2, 2018, 1:54:38 PM12/2/18
to Ansible Project
Thank you for the assistance. Added with two backslash to escape the parenthesis.

- name: Check the JBOSS Server Uptime Domain mode
   shell: "{{ CLI_SCRIPT }} --connect controller={{ item.hostname }}:{{ item.port }} --user={{ myusername }} --password={{ mypassword }} /host={{ item.host }}-{{ item.server }}/core-service=platform-mbean/type=runtime:read-attribute\\(name=uptime\\)| awk '/result/ { print $3 }'"
   register: uptime
   delegate_to: remoteserver
   ignore_errors: yes
Reply all
Reply to author
Forward
0 new messages