elasticsearch,ansible,ansible-inventory,ansible-facts,Json,elasticsearch,Ansible,Ansible Inventory,Ansible Facts" /> elasticsearch,ansible,ansible-inventory,ansible-facts,Json,elasticsearch,Ansible,Ansible Inventory,Ansible Facts" />

Json 如何在ansible add_主机模块中使用set_fact打印数组变量

Json 如何在ansible add_主机模块中使用set_fact打印数组变量,json,elasticsearch,ansible,ansible-inventory,ansible-facts,Json,elasticsearch,Ansible,Ansible Inventory,Ansible Facts,我正在尝试使用add_hosts模块动态构建“elasticsearch”集群的资源清册 我有以下任务: 在第一个任务(识别集群中的ES节点)中,我查询ElasticSearchAPI以获取节点的名称并将其保存在“ES_节点”数组中 在第二个(提取节点名)中,我提取节点名并将它们保存在“nodo”数组中 在第三个(为IP节点创建新的var)中,(我尝试了,但无法)使用带有节点名称的循环获取IP。我设法打印变量“es_nodes.json.nodes..ip”的名称,但无法打印内容,即ip

我正在尝试使用add_hosts模块动态构建“elasticsearch”集群的资源清册

我有以下任务:

在第一个任务(识别集群中的ES节点)中,我查询ElasticSearchAPI以获取节点的名称并将其保存在“ES_节点”数组中

在第二个(提取节点名)中,我提取节点名并将它们保存在“nodo”数组中

在第三个(为IP节点创建新的var)中,(我尝试了,但无法)使用带有节点名称的循环获取IP。我设法打印变量“es_nodes.json.nodes..ip”的名称,但无法打印内容,即ip

    - name: Create new var for Node IP
      set_fact:
        nodo_ip: es_nodes.json.nodes.{{ item }}.ip
      with_items: "{{ nodo }}"
在详细输出中显示:

ok: [<ansible_ip>] => (item=GxcbPcQ0Qe6vSFOde0zFwg) => {"ansible_facts": {"nodo_ip": "es_nodes.json.nodes.GxcbPcQ0Qe6vSFOde0zFwg.ip"}, "changed": false, "item": "GxcbPcQ0Qe6vSFOde0zFwg"}
ok: [<ansible_ip>] => (item=V2bdDTnwTCexY67U36YE8g) => {"ansible_facts": {"nodo_ip": "es_nodes.json.nodes.V2bdDTnwTCexY67U36YE8g.ip"}, "changed": false, "item": "V2bdDTnwTCexY67U36YE8g"}

我希望您能了解打印IP的正确语法,而不是第三个任务中节点的名称,或者了解动态创建资源清册的“不同”方法。

如果我能很好地理解,您需要从另一个var的内容(从with_items获得)构建一个变量然后检索变量的内容

一种可能性是创建一个单独的剧本,该剧本将包含在主脚本中,并与include任务中的_项一起使用。 以下是一个简单的示例,您可以根据自己的情况进行调整:

主要剧本:

- hosts: localhost
  vars:
    es_nodes_x: "val x"
    es_nodes_y: "val y"
  tasks:
    # Create new var for Node IP
    - include: sub.yml param={{item}}
      with_items:
        - "x"
        - "y"
包括剧本(sub.yml):


在nodo-UU ip事实上,你能尝试一下这个语法吗?在nodo-ip事实上,你能尝试一下这个语法吗?你能尝试一下这个语法吗,你能尝试一下这个语法吗?你能尝试一下这个语法吗,你能尝试一下这个语法吗,你能尝试一下这个语法吗,你能尝试一下你能尝试一下这个语法吗,你能尝试一下你能尝试这个语法吗,你能尝试你能尝试一下你能尝试这个语法吗,你能尝试一下你能尝试这个语法,你能尝试一下你能尝试这个语法,你能尝试这个语法,你能尝试你能尝试这个语法你能尝试这个语法,你能尝试这个语法吗你能尝试这个语法吗你能尝试这个语法吗你能尝试这个语法吗你能尝试这个语法吗,你能尝试这个语法吗你能尝试这个语法吗你能尝试这个语法吗你能尝试这个语法吗你能尝试这个语法吗你尝试这个语法吗你能尝试这个语法吗你尝试这个语法吗你能尝试这个语法吗你尝试这个语法吗吗你[]:失败!=>{“msg”:“模板化字符串时出现模板错误:应为名称或编号。字符串:{{es_nodes.json.nodes.{{item}}.ip}}}}}我想您不能将密钥嵌套在其中keys@Zebra8844我尝试执行以下任务:`-name:createnewvar for Node IP``set_事实:``nodo_IP:{{es_nodes.json.nodes.{{item}}.IP}}`` with_items:{{nodo}`我试过使用“{es_nodes.json.nodes.[item].ip}}”和“{es_nodes.json.nodes.['item'].ip}}”回答是相同的错误。你试过用{item}}代替[item]吗?谢谢Zebra,但是,我试过这个解决方案,在sub.yml中它做的是完全相同的,打印变量的名称,但不打印它的内容。这很奇怪。我已经在我的计算机上运行了上面的剧本,调试消息会打印变量的内容,而不是相同的内容。我的ansible版本是2.5.1。
ok: [<ansible_ip>] => (item=GxcbPcQ0Qe6vSFOde0zFwg) => {"ansible_facts": {"nodo_ip": "es_nodes.json.nodes.GxcbPcQ0Qe6vSFOde0zFwg.ip"}, "changed": false, "item": "GxcbPcQ0Qe6vSFOde0zFwg"}
ok: [<ansible_ip>] => (item=V2bdDTnwTCexY67U36YE8g) => {"ansible_facts": {"nodo_ip": "es_nodes.json.nodes.V2bdDTnwTCexY67U36YE8g.ip"}, "changed": false, "item": "V2bdDTnwTCexY67U36YE8g"}
    - name: Add host to group elasticsearch-security
      add_host:
        name: "{{ item }}"
        groups: elasticsearch-security
      with_items: "{{ nodo_ip }}"
- hosts: localhost
  vars:
    es_nodes_x: "val x"
    es_nodes_y: "val y"
  tasks:
    # Create new var for Node IP
    - include: sub.yml param={{item}}
      with_items:
        - "x"
        - "y"
- set_fact:
    v: "{{param}}"
- debug:
    msg: "{{ vars['es_nodes_' + v] }}"