使用 Ansible 从 stdout 输出中提取值
Extract values from stdout output using Ansible
我是运行一个获取tomcat状态并注册到变量中的命令。我如何提取该命令的特定输出并将其放入变量中以进一步检查
播放 -
- name: Check the State og tomcat service
shell: "svcs tomcat"
register: tomcat_status
- name: Show captured processes
debug:
msg: "{{ tomcat_status.stdout_lines|list }}"
上面的输出是-
server1 ok: {
"changed": false,
"msg": [
"STATE STIME FMRI",
"online 20:11:48 svc:/network/tomcat:tomcat"
]
}
如何在此处提取 STATE 的值?我想知道它是在线还是禁用还是关机等
注意 - 使用 -vvvv
输出
server1 done: {
"changed": true,
"cmd": "svcs tomcat",
"delta": "0:00:00.025711",
"end": "2020-05-11 12:43:43.323017",
"invocation": {
"module_args": {
"_raw_params": "svcs tomcat",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": false
}
},
"rc": 0,
"start": "2020-05-11 12:43:43.297306",
"stderr": "",
"stderr_lines": [],
"stdout": "STATE STIME FMRI\nonline 20:11:48 svc:/network/tomcat:tomcat",
"stdout_lines": [
"STATE STIME FMRI",
"online 20:11:48 svc:/network/tomcat:tomcat"
]
}
根据您的debug
,tomcat_status.stdout_lines
是一个列表(此处不需要|list
过滤器,因为它已经是一个列表)如下所示:
["STATE STIME FMRI", "online 20:11:48 svc:/network/tomcat:tomcat"]
要获得 STATE
值,您需要第二行的第一个字段。所以:
- set_fact:
tomcat_state: "{{ tomcat_status.stdout_lines.1.split().0 }}"
取第二行 (tomcat_status.stdout_lines.1
) 然后在空格处拆分它 (.split()
),然后取第一个值 (.0
)。
这是一个完整的测试:
- hosts: localhost
vars:
tomcat_status:
stdout_lines:
- "STATE STIME FMRI"
- "online 20:11:48 svc:/network/tomcat:tomcat"
tasks:
- set_fact:
tomcat_state: "{{ tomcat_status.stdout_lines.1.split().0 }}"
- debug:
var: tomcat_state
运行 该剧本导致:
PLAY [localhost] *****************************************************************************
TASK [set_fact] ******************************************************************************
ok: [localhost]
TASK [debug] *********************************************************************************
ok: [localhost] => {
"tomcat_state": "online"
}
PLAY RECAP ***********************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我是运行一个获取tomcat状态并注册到变量中的命令。我如何提取该命令的特定输出并将其放入变量中以进一步检查
播放 -
- name: Check the State og tomcat service
shell: "svcs tomcat"
register: tomcat_status
- name: Show captured processes
debug:
msg: "{{ tomcat_status.stdout_lines|list }}"
上面的输出是-
server1 ok: {
"changed": false,
"msg": [
"STATE STIME FMRI",
"online 20:11:48 svc:/network/tomcat:tomcat"
]
}
如何在此处提取 STATE 的值?我想知道它是在线还是禁用还是关机等
注意 - 使用 -vvvv
输出 server1 done: {
"changed": true,
"cmd": "svcs tomcat",
"delta": "0:00:00.025711",
"end": "2020-05-11 12:43:43.323017",
"invocation": {
"module_args": {
"_raw_params": "svcs tomcat",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": false
}
},
"rc": 0,
"start": "2020-05-11 12:43:43.297306",
"stderr": "",
"stderr_lines": [],
"stdout": "STATE STIME FMRI\nonline 20:11:48 svc:/network/tomcat:tomcat",
"stdout_lines": [
"STATE STIME FMRI",
"online 20:11:48 svc:/network/tomcat:tomcat"
]
}
根据您的debug
,tomcat_status.stdout_lines
是一个列表(此处不需要|list
过滤器,因为它已经是一个列表)如下所示:
["STATE STIME FMRI", "online 20:11:48 svc:/network/tomcat:tomcat"]
要获得 STATE
值,您需要第二行的第一个字段。所以:
- set_fact:
tomcat_state: "{{ tomcat_status.stdout_lines.1.split().0 }}"
取第二行 (tomcat_status.stdout_lines.1
) 然后在空格处拆分它 (.split()
),然后取第一个值 (.0
)。
这是一个完整的测试:
- hosts: localhost
vars:
tomcat_status:
stdout_lines:
- "STATE STIME FMRI"
- "online 20:11:48 svc:/network/tomcat:tomcat"
tasks:
- set_fact:
tomcat_state: "{{ tomcat_status.stdout_lines.1.split().0 }}"
- debug:
var: tomcat_state
运行 该剧本导致:
PLAY [localhost] *****************************************************************************
TASK [set_fact] ******************************************************************************
ok: [localhost]
TASK [debug] *********************************************************************************
ok: [localhost] => {
"tomcat_state": "online"
}
PLAY RECAP ***********************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0