hostvars 上的 Ansible 复杂数据操作

Ansible complex data manipulation on hostvars

我想在这里用一个例子来说明我的问题,我有如下的 hostvars facts 设置:

我的 ansible 主机组:app_group = ["hostname-a", "hostname-b", "hostname-c", "hostname-d"]

hostname-a:
    action_list:
        start: ["service-A": "jar example-a.jar]
        stop: []
        
hostname-b:
    action_list:
        start: []
        stop: ["service-B]
        
hostname-c:
    action_list:
        start: ["service-X": "jar example-x.jar]
        stop: []
        
hostname-d:
    action_list:
        start: ["service-Y": "jar example-y.jar]
        stop: []
    
    

我需要构建一个包含完整服务名称列表的变量

final_start_service_list: ["service-A", "service-X", "service-Y"]

我尝试了类似下面的方法,但没有用..

- debug:
    msg: "{{ groups["app_group"] | map('extract', hostvars) | map(attribute='action_list') | flatten| map(attribute='start')| default([]) | flatten | default([]) }}"

lookup vars 是你需要的,我想,例如

- hosts: hostname_a,hostname_b,hostname_c,hostname_d
  vars:
    hostname_a:
      action_list:
        start: ["service-A": "jar example-a.jar"]
        stop: []
    hostname_b:
      action_list:
        start: []
        stop: ["service-B"]
    hostname_c:
      action_list:
        start: ["service-X": "jar example-x.jar"]
        stop: []
    hostname_d:
      action_list:
        start: ["service-Y": "jar example-y.jar"]
        stop: []
  tasks:
    - set_fact:
        final_start_service_list: "{{ final_start_service_list|default([]) +
                                      _start.keys()|list }}"
      loop: "{{ ansible_play_hosts_all }}"
      vars:
        _var: "{{ lookup('vars', item) }}"
        _start: "{{ _var.action_list.start.0|default('') }}"
      when: _start|length > 0
      run_once: true
    - debug:
        var: final_start_service_list
      run_once: true

做这份工作

  final_start_service_list:
  - service-A
  - service-X
  - service-Y