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
我想在这里用一个例子来说明我的问题,我有如下的 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