Combine过滤器的第一个参数必须是字典:

  - set_fact:
      node_data: "{{ node_data | combine ( item.split(' ').0 : { 'name': item.split(' ').0 , 'ip' : item.split(' ').1 }, recursive=True) }}"
    with_items: "{{ nodes.stdout_lines }}"

需要这样做:

  - set_fact:
      node_data: "{{ node_data | combine ({item.split(' ').0 : { 'name': item.split(' ').0 , 'ip' : item.split(' ').1 }}, recursive=True) }}"
    with_items: "{{ nodes.stdout_lines }}"

请注意要合并的第一个参数新{{...}。为了干净,你可能需要考虑重新格式化此task:

    - set_fact:
        node_data: >-
          {{ node_data | combine ({
            item.split(' ').0: {
              'name': item.split(' ').0,
              'ip': item.split(' ').1
            },
          }, recursive=True) }}
      with_items: "{{ nodes.stdout_lines }}"

您甚至可以通过将对item.split的调用移到vars中来使其更加干净,如下所示:

    - set_fact:
        node_data: >-
          {{ node_data | combine ({
            name: {
              'name': name,
              'ip': ip
            },
          }, recursive=True) }}
      vars:
        name: "{{ item.split(' ').0 }}"
        ip: "{{ item.split(' ').1 }}"
      with_items: "{{ nodes.stdout_lines }}"