0

I need to get JMX metrics from the Hazelcast product. I have created a Logstash process that connects to the JMX port. This process has to read a json where is the information of the hostname, port, cluster, environment, etc of Hazelcast JMX. I need to deploy on the Logstash machines the json file for each Hazelcast machine / port. In this case there are three Hazelcast machines and a total of 6 processes with different ports.

Example data:

Hazelcast Hostnames: hazelcast01, hazelcast02, hazelcast03 Hazelcast Ports: 6661, 6662, 6663, 6664, 6665 Logstash Hostnames: logstash01, logstash02, logstash03

Dictionary of Hazelcast information in Ansible:

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

Example of task in 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

The final result should be as follows:

/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
...

Here is an example of the json content:

{
  "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"
    }
   ]
}

I think the problem I have is that the with_dict option does not allow using a listing of inventory hosts and a dictionary.

How can I get this generation of json files for each machine / port?

1 Answers1

0

If you run your playbook against logstash hosts, you can use 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 }}"

I also used helper variables with more meaningful names. You should also modify your template with either helper vars or item.0, item.1 – where item.0 is a host from HAZELCAST group, and item.1 is an item from logstash_hazelcast_jmx list.

Konstantin Suvorov
  • 65,183
  • 9
  • 162
  • 193