Как создать файлы 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
список.