0

我需要从 Hazelcast 产品中获取 JMX 指标。我创建了一个连接到 JMX 端口的 Logstash 进程。这个过程必须读取一个 json,其中包含 Hazelcast JMX 的主机名、端口、集群、环境等信息。我需要在 Logstash 机器上部署每个 Hazelcast 机器/端口的 json 文件。在这种情况下,有 3 台 Hazelcast 机器,共有 6 个进程,具有不同的端口。

示例数据:

Hazelcast 主机名:hazelcast01、hazelcast02、hazelcast03 Hazelcast 端口:6661、6662、6663、6664、6665 Logstash 主机名:logstash01、logstash02、logstash03

Ansible 中的 Hazelcast 信息字典:

logstash_hazelcast_jmx:
  - hazelcast_pre:
      name: hazelcast_pre
      port: 15554
      cluster: PRE
  - hazelcast_dev:
      name: hazelcast_dev
      port: 15555
      cluster: DEV

Ansible 中的任务示例:

- name: Deploy HAZELCAST JMX config
  template:
    src: "hazelcast_jmx.json.j2"
    dest: "{{ logstash_directory_jmx_hazelcast }}/hazelcast_jmx_{{ item }}_{{ item.value.cluster }}.json"
    owner: "{{ logstash_system_user }}"
    group: "{{ logstash_system_group }}"
    mode: 0640
  with_dict: 
    - "{{ groups['HAZELCAST'] }}"
    - logstash_hazelcast_jmx

最终结果应如下所示:

/opt/logstash/jmx/hazelcast/hazelcast_jmx_hazelcast01_DEV.json
/opt/logstash/jmx/hazelcast/hazelcast_jmx_hazelcast01_PRE.json
/opt/logstash/jmx/hazelcast/hazelcast_jmx_hazelcast02_DEV.json
...

以下是 json 内容的示例:

{
  "host" : "{{ hostname of groups['HAZELCAST' }}",
  "port" : {{ item.value.port }},
  "alias" : "{{ hostname of groups['HAZELCAST' }}_{{ item.value.cluster }}",
  "queries" : [
  {
    "object_name" : "com.hazelcast:instance=_hz_{{ item.value.cluster }},type=XXX,name=YYY",
     "attributes" : [ "size", "localHits"  ],
    "object_alias" : "Hazelcast_map"
    }   ,{
    "object_name" : "com.hazelcast:instance=_hz_{{ item.value.cluster }},type=IMap,name=user",
     "attributes" : [ "size", "localHits"  ],
    "object_alias" : "Hazelcast_map"
    }
   ]
}

我认为我遇到的问题是 with_dict 选项不允许使用清单主机列表和字典。

如何为每台机器/端口获取这一代的 json 文件?

4

1 回答 1

0

如果您针对 logstash 主机运行 playbook,则可以使用with_nested

---
- hosts: logstash_hosts
  tasks:
    - name: Deploy HAZELCAST JMX config
      template:
        src: "hazelcast_jmx.json.j2"
        dest: "{{ logstash_directory_jmx_hazelcast }}/hazelcast_jmx_{{ helper_host }}_{{ helper_cluster }}.json"
        owner: "{{ logstash_system_user }}"
        group: "{{ logstash_system_group }}"
        mode: 0640
      with_nested: 
        - "{{ groups['HAZELCAST'] }}"
        - "{{ logstash_hazelcast_jmx }}"
      vars:
        helper_host: "{{ item.0 }}"
        helper_cluster: "{{ item.1.cluster }}"
        helper_port: "{{ item.1.port }}"

我还使用了名称更有意义的辅助变量。您还应该使用 helper vars 或item.0,修改您的模板item.1- 其中item.0HAZELCAST组中的主机,并且item.1logstash_hazelcast_jmx列表中的项目。

于 2017-08-04T11:20:59.833 回答