Как создать файлы json в одной задаче с помощью шаблонов в Ansible

Мне нужно получить метрики JMX из продукта Hazelcast. Я создал процесс Logstash, который подключается к порту JMX. Этот процесс должен прочитать json, где находится информация об имени хоста, порте, кластере, среде и т. Д. Hazelcast JMX. Мне нужно развернуть на машинах Logstash файл json для каждой машины / порта Hazelcast. В этом случае есть три машины Hazelcast и 6 процессов с разными портами.

Пример данных:

Имена хостов Hazelcast: hazelcast01, hazelcast02, hazelcast03 Порты Hazelcast: 6661, 6662, 6663, 6664, 6665 Имена хостов Logstash: logstash01, logstash02, logstash03

Словарь Hazelcast информации в Ansible:

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 для каждой машины / порта?

1 ответ

Если вы запускаете вашу playbook против хостов logstash, вы можете использовать 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 }}"

Я также использовал вспомогательные переменные с более значимыми именами. Вы также должны изменить свой шаблон с помощью вспомогательных переменных или item.0, item.1 - где item.0 хозяин из HAZELCAST группа и item.1 это элемент из logstash_hazelcast_jmx список.

Другие вопросы по тегам