11---
22- ansible.builtin.import_tasks :
3- file : " {{ role_path }}/tasks/common.yml"
4- vars :
5- common_task : init
3+ file : " {{ role_path }}/tasks/_init.yml"
64
75- ansible.builtin.include_role :
86 name : opennebula/leader
97 when : leader is undefined
108
11- - when : inventory_hostname == leader
9+ - delegate_to : " {{ leader }}"
10+ run_once : true
1211 block :
1312 - name : Get Datastores
1413 ansible.builtin.shell :
1716 changed_when : false
1817 register : shell
1918
20- - name : Parse Datastores
21- ansible.builtin.set_fact :
22- ds_names_parsed : >-
23- {{ _names }}
24- ds_dict_parsed : >-
25- {{ dict(_names | zip(_datastores)) }}
26- vars :
27- _document : >-
28- {{ shell.stdout | from_json }}
29- _datastores : >-
30- {{ [_document.DATASTORE_POOL.DATASTORE | d([])] | flatten }}
31- _names : >-
32- {{ _datastores | map(attribute='NAME') | d([]) | list }}
19+ - name : Parse Datastores
20+ ansible.builtin.set_fact :
21+ ds_names_parsed : >-
22+ {{ _names }}
23+ ds_dict_parsed : >-
24+ {{ dict(_names | zip(_datastores)) }}
25+ vars :
26+ _document : >-
27+ {{ shell.stdout | from_json }}
28+ _datastores : >-
29+ {{ [_document.DATASTORE_POOL.DATASTORE | d([])] | flatten }}
30+ _names : >-
31+ {{ _datastores | map(attribute='NAME') | d([]) | list }}
3332
34- - when : inventory_hostname == leader
35- block :
3633 # NOTE: Only "system" datastores can be enabled or disabled.
3734 - name : Update Datastores
3835 ansible.builtin.shell :
5148 {{ _combined | opennebula.deploy.to_one }}
5249 executable : /bin/bash
5350 changed_when : true
54- when : (_combined | opennebula.deploy.to_one != ds_dict_parsed[item].TEMPLATE | opennebula.deploy.to_one)
55- or
56- (ds_dict[item].enabled is defined and (ds_dict[item].enabled != (ds_dict_parsed[item].STATE | int == 0)))
51+ when :
52+ - ds_dict[item].id is defined
53+ - (_combined | opennebula.deploy.to_one != ds_dict_parsed[item].TEMPLATE | opennebula.deploy.to_one)
54+ or
55+ (ds_dict[item].enabled is defined and (ds_dict[item].enabled != (ds_dict_parsed[item].STATE | int == 0)))
5756 loop : " {{ _existing }}"
5857 vars :
5958 _existing : >-
7574 executable : /bin/bash
7675 changed_when : true
7776 loop : " {{ _missing }}"
78- register : new_ds
77+ register : shell_create_datastores
7978 vars :
8079 _missing : >-
8180 {{ ds_names | reject('in', ds_names_parsed) }}
8281
83- - name : Map created datastores
82+ - name : Merge back datastore IDs into ds_dict
8483 ansible.builtin.set_fact :
85- ds_map : >-
86- {{ (ds_map | default({})) | combine({
87- (item.item): {
88- 'id': (item.stdout.splitlines()[-1].split(':')[-1] | trim),
89- 'src': ds_dict[item.item].symlink.src | default('/var/lib/one/datastores/') | normpath,
90- 'groups': ds_dict[item.item].symlink.groups | default([])
91- }
92- }) }}
93- loop : " {{ new_ds.results | default([]) }}"
94- loop_control :
95- label : " {{ item.item }}"
96- run_once : true
97- when : new_ds is defined
98-
99- - name : Publish datastore mapping
100- ansible.builtin.add_host :
101- name : datastore_mapping_host
102- groups : datastore_map
103- ds_map : " {{ hostvars[inventory_hostname].ds_map | default({}) }}"
104- run_once : true
105- when :
106- - hostvars[inventory_hostname].ds_map is defined
84+ ds_dict : >-
85+ {{ ds_dict | combine(_update1, _update2, recursive=true) }}
86+ vars :
87+ # IDs can be sourced either from initial parse or immediately after new datastores are created.
88+ _update1 : >-
89+ {%- set output = [] -%}
90+ {%- for item in ds_dict_parsed.items() -%}
91+ {{- output.append([item.0, {"id": item.1.ID | int}]) -}}
92+ {%- endfor -%}
93+ {{- dict(output) -}}
94+ _update2 : >-
95+ {%- set output = [] -%}
96+ {%- for item in shell_create_datastores.results -%}
97+ {{- output.append([item.item, {"id": item.stdout_lines[-1].split(':')[-1] | trim | int}]) -}}
98+ {%- endfor -%}
99+ {{- dict(output) -}}
107100
108101 - ansible.builtin.import_tasks :
109- file : " {{ role_path }}/tasks/common.yml"
110- vars :
111- common_task : symlink
102+ file : " {{ role_path }}/tasks/_link.yml"
0 commit comments