我使用 Ansible playbook 启动 JVM 应用程序,并希望进行运行状况检查任务以确保应用程序正在运行。该应用程序没有 HTTP 接口,但通过 MBean 公开多个属性。那么我可以从 Ansible 访问这些属性吗?
其中一条评论说得对。 我发现最简单的方法是编写一个小的 python 脚本。在此示例中,我从 Artemis 代理获取 HAStatus 的值。
你必须从 python 安装 jmx 查询。
python3 -m pip install jmxquery
这是 jmx_query.py 代码。 由于某种原因,我无法指定 jmx 的用户名和密码。
jmx_connection = jmxquery.JMXConnection(jmx_url, 用户名=用户名, 密码=密码)
我还没有查看 jmxquery 代码来看看有什么问题。 我的 jmx 没有被锁定,所以我把它拿出来,它运行得很好。
import jmxquery
# Replace with your broker's JMX details
jmx_url = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"
username = "admin"
password = "password"
mbean = "org.apache.activemq.artemis:broker=\"MyBroker\""
attribute = "HAStatus"
# Create a JMX query
jmx_connection = jmxquery.JMXConnection(jmx_url)
query = [jmxquery.JMXQuery(f'{mbean}:{attribute}')]
# Query JMX and print the result
result = jmx_connection.query(query)
print(result[0].value)
这是我的 ansible 脚本,用于报告我从 jmx 的发现。
---
- name: Check HAStatus of ActiveMQ Artemis via JMX
hosts: all
gather_facts: no
tasks:
- name: Query JMX for HAStatus
command: >
python3 /path/to/jmx_query.py
register: jmx_output
changed_when: false
- name: Parse JMX Output
set_fact:
ha_status: "{{ jmx_output.stdout }}"
- name: Emit message based on HAStatus
debug:
msg: >
The ActiveMQ Artemis HAStatus is {{ ha_status }}.
- name: Check if HAStatus is live
when: ha_status == "live"
debug:
msg: "The broker is currently the primary (live) node."
- name: Check if HAStatus is backup
when: ha_status == "backup"
debug:
msg: "The broker is currently a backup node."
- name: Fail if HAStatus is unknown
when: ha_status not in ["live", "backup"]
fail:
msg: "Unknown HAStatus: {{ ha_status }}"