【问题标题】:How to generate json files in the same task with templates in Ansible如何在 Ansible 中使用模板在同一任务中生成 json 文件
【发布时间】:2017-08-04 11:05:04
【问题描述】:

我需要从 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文件?

【问题讨论】:

    标签: ansible ansible-inventory ansible-template


    【解决方案1】:

    如果您针对 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 }}"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 2014-06-17
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多