Files
openstack-ansible-openstack…/tasks/openstack_grub.yml
Dmitriy Rabotyagov afaadb53ff Implement GRUB modification process
In some cases it might be required to supply extra kernel options
through GRUB modification. Good example of that is enablement
of hugepages [1].

Adding variable `openstack_host_grub_options` should allow to
manage GRUB-related options reliably and out-of-the-box.

[1] https://docs.openstack.org/nova/latest/admin/huge-pages.html#enabling-huge-pages-on-the-host

Change-Id: I148ed1760d841dd99bc1e075b6200d6d7e835530
Signed-off-by: Dmitriy Rabotyagov <dmitriy.rabotyagov@cleura.com>
2025-07-30 13:01:56 +00:00

61 lines
2.4 KiB
YAML

---
# Copyright 2025, Cleura AB.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Fetch current GRUB parameters
ansible.builtin.shell: . /etc/default/grub && echo ${GRUB_CMDLINE_LINUX_DEFAULT}
register: _openstack_grub_default
changed_when: false
- name: Update GRUB options
ansible.builtin.lineinfile:
path: /etc/default/grub
regex: '^GRUB_CMDLINE_LINUX_DEFAULT='
line: 'GRUB_CMDLINE_LINUX_DEFAULT="{{ _openstack_resulting_grub_record }}"'
backup: true
mode: '0644'
owner: root
group: root
notify:
- Update GRUB
vars:
# Create list of dicts from the parsed grub parameters, ie:
# [{'key': 'console', 'value': 'tty0'}]
_openstack_current_grub: >-
{{
_openstack_grub_default.stdout | split(' ') | map('split', '=') | map('zip', ['key', 'value']) | map('map', 'reverse') | map('community.general.dict')
}}
# Fetch list of user-provided records which have `state: absent`
_openstack_absent_grub_records: >-
{{
openstack_host_custom_grub_options | selectattr('state', 'defined') | selectattr('state', 'eq', 'absent') | ansible.utils.remove_keys(target='state')
}}
# Remove records which should be removed from the list
_openstack_filtered_custom_grub: >-
{{
openstack_host_custom_grub_options | selectattr('state', 'defined') | rejectattr('state', 'eq', 'absent') +
openstack_host_custom_grub_options | selectattr('state', 'undefined')
}}
# Combine the result back from dict to GRUB parameters
_openstack_resulting_grub_record: |-
{% set grub = [] %}
{% for record in (_openstack_current_grub + _openstack_filtered_custom_grub) | unique | reject('in', _openstack_absent_grub_records) %}
{% if 'value' in record %}
{% set _ = grub.append(record['key'] ~ '=' ~ record['value']) %}
{% else %}
{% set _ = grub.append(record['key']) %}
{% endif %}
{% endfor %}
{{ grub | join(' ') }}