Skip to content

Commit e849b06

Browse files
authored
F #85: Workaround file permission issues in infra role (fix) (#86)
- Move FE-VM deployment code to a separate file (clarity). - Use POSIX ACLs to handle file permissions in both cases, when libvirtd is installed with OpenNebula config or without.
1 parent 5ba3d4a commit e849b06

4 files changed

Lines changed: 117 additions & 113 deletions

File tree

roles/infra/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Dependencies
4343
------------
4444

4545
- `community.libvirt`
46+
- `ansible.posix`
4647

4748
Example Playbook
4849
----------------

roles/infra/meta/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
collections:
33
- opennebula.deploy
44
- community.libvirt
5+
- ansible.posix

roles/infra/tasks/deploy.yml

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
---
2+
- vars:
3+
_dirs: >-
4+
{{ [runtime_dir] + ((passthrough_fs | map(attribute='source_dir')) if (passthrough_fs is truthy) else []) }}
5+
block:
6+
- name: Create dirs
7+
ansible.builtin.file:
8+
path: "{{ item }}"
9+
state: directory
10+
owner: 0
11+
group: kvm
12+
mode: ug=rwx,o=
13+
loop: "{{ _dirs }}"
14+
15+
- name: Set ACLs to workaround oneadmin's access
16+
ansible.posix.acl:
17+
path: "{{ item.0 }}"
18+
state: present
19+
etype: group
20+
entity: 9869
21+
permissions: rwX
22+
default: "{{ item.1 }}"
23+
loop: "{{ _dirs | product([true, false]) }}"
24+
25+
- block:
26+
- name: Create temporary dirs
27+
ansible.builtin.tempfile:
28+
prefix: "one-deploy.{{ frontend }}."
29+
state: directory
30+
loop_control: { loop_var: frontend }
31+
loop: "{{ infra_to_frontends[inventory_hostname] }}"
32+
register: tempfile
33+
34+
- name: Create context.sh files
35+
ansible.builtin.template:
36+
dest: "{{ tempfile.results[item].path }}/context.sh"
37+
src: context.sh.j2
38+
vars:
39+
frontend: "{{ tempfile.results[item].frontend }}"
40+
context: "{{ hostvars[tempfile.results[item].frontend].context }}"
41+
loop: "{{ range(tempfile.results | count) }}"
42+
register: template_context_sh
43+
44+
- name: Create context ISO images
45+
ansible.builtin.shell:
46+
cmd: genisoimage --input-charset utf-8 -Jr -V CONTEXT
47+
-o '{{ runtime_dir }}/{{ frontend }}.iso'
48+
'{{ tempfile.results[item].path }}/context.sh'
49+
vars:
50+
frontend: "{{ tempfile.results[item].frontend }}"
51+
loop: "{{ range(tempfile.results | count) }}"
52+
when: template_context_sh is changed
53+
54+
always:
55+
- name: Delete temporary dirs
56+
ansible.builtin.file:
57+
path: "{{ item }}"
58+
state: absent
59+
loop: "{{ tempfile.results | map(attribute='path') }}"
60+
61+
- name: Download OS image
62+
ansible.builtin.get_url:
63+
url: "{{ os_image_url }}"
64+
dest: "{{ runtime_dir }}/{{ os_image_url | basename }}"
65+
mode: ug=rw,o=
66+
67+
- name: Clone OS image
68+
ansible.builtin.copy:
69+
dest: "{{ runtime_dir }}/{{ frontend }}.qcow2"
70+
src: "{{ runtime_dir }}/{{ os_image_url | basename }}"
71+
remote_src: true
72+
force: false
73+
mode: ug=rw,o=
74+
loop_control: { loop_var: frontend }
75+
loop: "{{ infra_to_frontends[inventory_hostname] }}"
76+
77+
- name: Try to resize cloned OS images
78+
ansible.builtin.shell:
79+
cmd: qemu-img resize '{{ runtime_dir }}/{{ frontend }}.qcow2' '{{ os_image_size }}'
80+
loop_control: { loop_var: frontend }
81+
loop: "{{ infra_to_frontends[inventory_hostname] }}"
82+
ignore_errors: true # NOTE: This is a best effort operation.
83+
84+
- name: Compute VNC ports
85+
ansible.builtin.set_fact:
86+
frontends_to_vnc_ports: >-
87+
{{ dict(_frontends | zip(_ports)) }}
88+
vars:
89+
_ports: >-
90+
{{ range(vnc_max_port, vnc_max_port - (_frontends | count), -1) }}
91+
_frontends: >-
92+
{{ groups[_frontend_group] }}
93+
_frontend_group: >-
94+
{{ frontend_group | d('frontend') }}
95+
96+
- name: Define Front-end VMs
97+
community.libvirt.virt:
98+
command: define
99+
xml: "{{ lookup('template', 'frontend.xml.j2') }}"
100+
autostart: true
101+
vars:
102+
context: "{{ hostvars[frontend].context }}"
103+
loop_control: { loop_var: frontend }
104+
loop: "{{ infra_to_frontends[inventory_hostname] }}"
105+
106+
- name: Start Front-end VMs
107+
community.libvirt.virt:
108+
name: "{{ frontend }}"
109+
state: running
110+
loop_control: { loop_var: frontend }
111+
loop: "{{ infra_to_frontends[inventory_hostname] }}"

roles/infra/tasks/main.yml

Lines changed: 4 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
ansible.builtin.package:
44
name: "{{ _common + _specific[ansible_os_family] }}"
55
vars:
6-
_common: [genisoimage, python3-libvirt, python3-lxml]
6+
_common: [acl, genisoimage, python3-libvirt, python3-lxml]
77
_specific:
88
Debian: [qemu-utils]
99
RedHat: [qemu-img]
@@ -39,117 +39,8 @@
3939
_frontend_group: >-
4040
{{ frontend_group | d('frontend') }}
4141
42-
- when:
42+
- ansible.builtin.include_tasks:
43+
file: "{{ role_path }}/tasks/deploy.yml"
44+
when:
4345
- infra_to_frontends[inventory_hostname] is defined
4446
- infra_to_frontends[inventory_hostname] is truthy
45-
block:
46-
- name: Create missing dirs
47-
ansible.builtin.file:
48-
path: "{{ item }}"
49-
state: directory
50-
owner: 9869
51-
group: 9869
52-
mode: u=rwx,go=
53-
loop: >-
54-
{{ [runtime_dir, '/var/lib/one'] + (passthrough_fs | map(attribute='source_dir')) }}
55-
56-
- block:
57-
- name: Create temporary dirs
58-
ansible.builtin.tempfile:
59-
prefix: "one-deploy.{{ frontend }}."
60-
state: directory
61-
loop_control: { loop_var: frontend }
62-
loop: "{{ infra_to_frontends[inventory_hostname] }}"
63-
register: tempfile
64-
65-
- name: Create context.sh files
66-
ansible.builtin.template:
67-
dest: "{{ tempfile.results[item].path }}/context.sh"
68-
src: context.sh.j2
69-
owner: 0
70-
group: 0
71-
mode: u=rw,go=
72-
vars:
73-
frontend: "{{ tempfile.results[item].frontend }}"
74-
context: "{{ hostvars[tempfile.results[item].frontend].context }}"
75-
loop: "{{ range(tempfile.results | count) }}"
76-
register: template_context_sh
77-
78-
- when: template_context_sh is changed
79-
block:
80-
- name: Create context ISO images
81-
ansible.builtin.shell:
82-
cmd: genisoimage -Jr -V CONTEXT -o '{{ runtime_dir }}/{{ frontend }}.iso' '{{ tempfile.results[item].path }}/context.sh'
83-
vars:
84-
frontend: "{{ tempfile.results[item].frontend }}"
85-
loop: "{{ range(tempfile.results | count) }}"
86-
87-
- name: Update context ISO image permissions
88-
ansible.builtin.file:
89-
path: "{{ runtime_dir }}/{{ frontend }}.iso"
90-
owner: 9869
91-
group: 9869
92-
mode: u=r,go=
93-
vars:
94-
frontend: "{{ tempfile.results[item].frontend }}"
95-
loop: "{{ range(tempfile.results | count) }}"
96-
97-
always:
98-
- name: Delete temporary dirs
99-
ansible.builtin.file:
100-
path: "{{ item }}"
101-
state: absent
102-
loop: "{{ tempfile.results | map(attribute='path') }}"
103-
104-
- name: Download OS image
105-
ansible.builtin.get_url:
106-
url: "{{ os_image_url }}"
107-
dest: "{{ runtime_dir }}/{{ os_image_url | basename }}"
108-
109-
- name: Clone OS image
110-
ansible.builtin.copy:
111-
dest: "{{ runtime_dir }}/{{ frontend }}.qcow2"
112-
src: "{{ runtime_dir }}/{{ os_image_url | basename }}"
113-
remote_src: true
114-
owner: 9869
115-
group: 9869
116-
mode: u=rw,go=
117-
force: false
118-
loop_control: { loop_var: frontend }
119-
loop: "{{ infra_to_frontends[inventory_hostname] }}"
120-
121-
- name: Try to resize cloned OS images
122-
ansible.builtin.shell:
123-
cmd: qemu-img resize '{{ runtime_dir }}/{{ frontend }}.qcow2' '{{ os_image_size }}'
124-
loop_control: { loop_var: frontend }
125-
loop: "{{ infra_to_frontends[inventory_hostname] }}"
126-
ignore_errors: true # NOTE: This is a best effort operation.
127-
128-
- name: Compute VNC ports
129-
ansible.builtin.set_fact:
130-
frontends_to_vnc_ports: >-
131-
{{ dict(_frontends | zip(_ports)) }}
132-
vars:
133-
_ports: >-
134-
{{ range(vnc_max_port, vnc_max_port - (_frontends | count), -1) }}
135-
_frontends: >-
136-
{{ groups[_frontend_group] }}
137-
_frontend_group: >-
138-
{{ frontend_group | d('frontend') }}
139-
140-
- name: Define Front-end VMs
141-
community.libvirt.virt:
142-
command: define
143-
xml: "{{ lookup('template', 'frontend.xml.j2') }}"
144-
autostart: true
145-
vars:
146-
context: "{{ hostvars[frontend].context }}"
147-
loop_control: { loop_var: frontend }
148-
loop: "{{ infra_to_frontends[inventory_hostname] }}"
149-
150-
- name: Start Front-end VMs
151-
community.libvirt.virt:
152-
name: "{{ frontend }}"
153-
state: running
154-
loop_control: { loop_var: frontend }
155-
loop: "{{ infra_to_frontends[inventory_hostname] }}"

0 commit comments

Comments
 (0)