Change task ordering to perform smooth upgrades

Currently we symlink /etc/neutron to empty directory at pre-stage,
and filling it with config only during post_install. This means,
that policies and rootwrap filters are not working properly until
playbook execution finish. Additionally, we replace sudoers file
with new path in it, which makes current operations impossible for
the service, since rootwrap can not gain sudo privileges.

With this change we move symlinking and rootwrap steps to handlers,
which means that we will do replace configs while service is stopped.

During post_install we place all of the configs inside the venv,
which is versioned at the moment.

This way we minimise downtime of the service while performing upgrades

Change-Id: I6d1686ab79647acfc086f21864bde14c8a1a1a49
This commit is contained in:
Dmitriy Rabotyagov 2021-04-28 17:48:43 +03:00 committed by Dmitriy Rabotyagov
parent 7f2b7ea4f4
commit 5763885453
5 changed files with 52 additions and 46 deletions

View File

@ -70,6 +70,30 @@
- "Restart neutron services" - "Restart neutron services"
- "venv changed" - "venv changed"
- name: Symlink neutron config directory
file:
# NOTE(cloudnull): The "src" path is relative. This ensures all files remain
# within the host/container confines when connecting to
# them using the connection plugin or the root filesystem.
src: "{{ neutron_conf_version_dir | regex_replace('^/', '../') }}"
dest: "{{ neutron_conf_dir }}"
state: link
force: true
when: neutron_install_method == 'source'
listen:
- "venv changed"
- name: Drop sudoers file
template:
src: "sudoers.j2"
dest: "/etc/sudoers.d/{{ neutron_system_user_name }}_sudoers"
mode: "0440"
owner: "root"
group: "root"
listen:
- "Restart neutron services"
- "venv changed"
- name: Perform a DB contract - name: Perform a DB contract
command: "{{ neutron_bin }}/neutron-db-manage upgrade --contract" command: "{{ neutron_bin }}/neutron-db-manage upgrade --contract"
become: yes become: yes

View File

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
- name: Perform a DB expand - name: Perform a DB expand
command: "{{ neutron_bin }}/neutron-db-manage upgrade --expand" command: "{{ neutron_bin }}/neutron-db-manage --config-file {{ neutron_conf_version_dir }}/neutron.conf upgrade --expand"
become: yes become: yes
become_user: "{{ neutron_system_user_name }}" become_user: "{{ neutron_system_user_name }}"
when: when:
@ -29,7 +29,7 @@
value: "False" value: "False"
- name: Check for available offline migrations - name: Check for available offline migrations
command: "{{ neutron_bin }}/neutron-db-manage has_offline_migrations" command: "{{ neutron_bin }}/neutron-db-manage --config-file {{ neutron_conf_version_dir }}/neutron.conf has_offline_migrations"
environment: environment:
LANGUAGE: en_US.UTF-8 LANGUAGE: en_US.UTF-8
become: yes become: yes

View File

@ -21,11 +21,11 @@
group: "{{ item.group|default(neutron_system_group_name) }}" group: "{{ item.group|default(neutron_system_group_name) }}"
mode: "{{ item.mode | default(omit) }}" mode: "{{ item.mode | default(omit) }}"
with_items: with_items:
- path: "{{ neutron_conf_dir }}/plugins" - path: "{{ neutron_conf_version_dir }}/plugins"
mode: "0750" mode: "0750"
- path: "{{ neutron_conf_dir }}/plugins/{{ neutron_plugin_type.split('.')[0] }}" - path: "{{ neutron_conf_version_dir }}/plugins/{{ neutron_plugin_type.split('.')[0] }}"
mode: "0750" mode: "0750"
- path: "{{ neutron_conf_dir }}/rootwrap.d" - path: "{{ neutron_conf_version_dir }}/rootwrap.d"
owner: "root" owner: "root"
group: "root" group: "root"
@ -34,7 +34,7 @@
- name: Copy extra neutron rootwrap filters - name: Copy extra neutron rootwrap filters
copy: copy:
src: "{{ item }}" src: "{{ item }}"
dest: "{{ neutron_conf_dir }}/rootwrap.d/" dest: "{{ neutron_conf_version_dir }}/rootwrap.d/"
owner: "root" owner: "root"
group: "root" group: "root"
with_fileglob: with_fileglob:
@ -53,11 +53,11 @@
config_type: "{{ item.config_type }}" config_type: "{{ item.config_type }}"
with_items: with_items:
- src: "neutron.conf.j2" - src: "neutron.conf.j2"
dest: "{{ neutron_conf_dir }}/neutron.conf" dest: "{{ neutron_conf_version_dir }}/neutron.conf"
config_overrides: "{{ neutron_neutron_conf_overrides }}" config_overrides: "{{ neutron_neutron_conf_overrides }}"
config_type: "ini" config_type: "ini"
- src: "{{ neutron_plugins[neutron_plugin_type].plugin_ini }}.j2" - src: "{{ neutron_plugins[neutron_plugin_type].plugin_ini }}.j2"
dest: "{{ neutron_conf_dir }}/{{ neutron_plugins[neutron_plugin_type].plugin_ini }}" dest: "{{ neutron_conf_version_dir }}/{{ neutron_plugins[neutron_plugin_type].plugin_ini }}"
config_overrides: "{{ neutron_plugins[neutron_plugin_type].plugin_conf_ini_overrides }}" config_overrides: "{{ neutron_plugins[neutron_plugin_type].plugin_conf_ini_overrides }}"
config_type: "ini" config_type: "ini"
notify: notify:
@ -66,7 +66,7 @@
- name: Implement policy.yaml if there are overrides configured - name: Implement policy.yaml if there are overrides configured
config_template: config_template:
content: "{{ neutron_policy_overrides }}" content: "{{ neutron_policy_overrides }}"
dest: "{{ neutron_conf_dir }}/policy.yaml" dest: "{{ neutron_conf_version_dir }}/policy.yaml"
owner: "root" owner: "root"
group: "{{ neutron_system_group_name }}" group: "{{ neutron_system_group_name }}"
mode: "0640" mode: "0640"
@ -88,7 +88,7 @@
- name: Place api-paste.ini to the correct path in RedHat - name: Place api-paste.ini to the correct path in RedHat
file: file:
src: "/usr/share/neutron/api-paste.ini" src: "/usr/share/neutron/api-paste.ini"
dest: "{{ neutron_conf_dir }}/api-paste.ini" dest: "{{ neutron_conf_version_dir }}/api-paste.ini"
owner: "root" owner: "root"
group: "{{ neutron_system_group_name }}" group: "{{ neutron_system_group_name }}"
mode: "0640" mode: "0640"
@ -141,7 +141,7 @@
# NOTE(cloudnull): This will ensure strong permissions on all rootwrap files. # NOTE(cloudnull): This will ensure strong permissions on all rootwrap files.
- name: Set rootwrap.d permissions - name: Set rootwrap.d permissions
file: file:
path: "{{ neutron_conf_dir }}/rootwrap.d" path: "{{ neutron_conf_version_dir }}/rootwrap.d"
owner: "root" owner: "root"
group: "root" group: "root"
mode: "0640" mode: "0640"
@ -150,7 +150,7 @@
- name: Copy neutron ml2 plugin config - name: Copy neutron ml2 plugin config
config_template: config_template:
src: "{{ ('plugin_conf_bare' not in neutron_plugins[item]) | ternary(neutron_plugins[item].plugin_ini ~ '.j2', omit) }}" src: "{{ ('plugin_conf_bare' not in neutron_plugins[item]) | ternary(neutron_plugins[item].plugin_ini ~ '.j2', omit) }}"
dest: "{{ neutron_conf_dir }}/{{ neutron_plugins[item].plugin_ini }}" dest: "{{ neutron_conf_version_dir }}/{{ neutron_plugins[item].plugin_ini }}"
owner: "root" owner: "root"
group: "{{ neutron_system_group_name }}" group: "{{ neutron_system_group_name }}"
mode: "0640" mode: "0640"
@ -161,7 +161,7 @@
- name: Generate neutron dnsmasq Config - name: Generate neutron dnsmasq Config
template: template:
src: "dnsmasq-neutron.conf.j2" src: "dnsmasq-neutron.conf.j2"
dest: "{{ neutron_conf_dir }}/dnsmasq-neutron.conf" dest: "{{ neutron_conf_version_dir }}/dnsmasq-neutron.conf"
owner: "root" owner: "root"
group: "{{ neutron_system_group_name }}" group: "{{ neutron_system_group_name }}"
mode: "0640" mode: "0640"
@ -189,7 +189,7 @@
- name: Generate neutron bgpvpn networking configuration - name: Generate neutron bgpvpn networking configuration
template: template:
src: "networking_bgpvpn.conf.j2" src: "networking_bgpvpn.conf.j2"
dest: "{{ neutron_conf_dir }}/networking_bgpvpn.conf" dest: "{{ neutron_conf_version_dir }}/networking_bgpvpn.conf"
owner: "root" owner: "root"
group: "{{ neutron_system_group_name }}" group: "{{ neutron_system_group_name }}"
mode: "0640" mode: "0640"

View File

@ -53,29 +53,18 @@
- name: Create neutron dir - name: Create neutron dir
file: file:
path: "{{ item.path | default(omit) }}" path: "{{ item.path | default(omit) }}"
src: "{{ item.src | default(omit) }}"
dest: "{{ item.dest | default(omit) }}"
state: "{{ item.state | default('directory') }}" state: "{{ item.state | default('directory') }}"
owner: "{{ item.owner | default(neutron_system_user_name) }}" owner: "{{ item.owner | default(neutron_system_user_name) }}"
group: "{{ item.group | default(neutron_system_group_name) }}" group: "{{ item.group | default(neutron_system_group_name) }}"
mode: "{{ item.mode | default(omit) }}" mode: "{{ item.mode | default(omit) }}"
force: "{{ item.force | default(omit) }}"
when: when:
- (item.condition | default(true)) | bool - (item.condition | default(true)) | bool
with_items: with_items:
- path: "/openstack" - path: "/openstack"
owner: "root" owner: "root"
group: "root" group: "root"
- path: "{{ (neutron_install_method == 'distro') | ternary(neutron_conf_dir, (neutron_bin | dirname) + '/etc/neutron') }}" - path: "{{ neutron_conf_version_dir }}"
mode: "0755" mode: "0755"
# NOTE(cloudnull): The "src" path is relative. This ensures all files remain
# within the host/container confines when connecting to
# them using the connection plugin or the root filesystem.
- dest: "{{ neutron_conf_dir }}"
src: "{{ neutron_bin | dirname | regex_replace('^/', '../') }}/etc/neutron"
state: link
force: true
condition: "{{ neutron_install_method == 'source' }}"
- path: "/etc/sudoers.d" - path: "/etc/sudoers.d"
mode: "0750" mode: "0750"
owner: "root" owner: "root"
@ -87,14 +76,6 @@
mode: "0755" mode: "0755"
- path: "{{ neutron_system_home_folder }}/ha_confs" - path: "{{ neutron_system_home_folder }}/ha_confs"
- name: Drop sudoers file
template:
src: "sudoers.j2"
dest: "/etc/sudoers.d/{{ neutron_system_user_name }}_sudoers"
mode: "0440"
owner: "root"
group: "root"
- name: Add dependency repos for Neutron - name: Add dependency repos for Neutron
package: package:
name: "{{ neutron_repos }}" name: "{{ neutron_repos }}"

View File

@ -122,6 +122,7 @@ neutron_venv_packages: >-
### ###
neutron_conf_dir: /etc/neutron neutron_conf_dir: /etc/neutron
neutron_conf_version_dir: "{{ (neutron_install_method == 'distro') | ternary(neutron_conf_dir, (neutron_bin | dirname) + '/etc/neutron') }}"
neutron_lock_path: "/var/lock/neutron" neutron_lock_path: "/var/lock/neutron"
neutron_system_user_name: neutron neutron_system_user_name: neutron
neutron_system_group_name: neutron neutron_system_group_name: neutron
@ -348,7 +349,7 @@ neutron_services:
group: neutron_dhcp_agent group: neutron_dhcp_agent
service_name: neutron-dhcp-agent service_name: neutron-dhcp-agent
service_en: "{{ neutron_dhcp | bool }}" service_en: "{{ neutron_dhcp | bool }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: dhcp_agent.ini service_conf: dhcp_agent.ini
service_rootwrap: rootwrap.d/dhcp.filters service_rootwrap: rootwrap.d/dhcp.filters
execstarts: "{{ neutron_bin }}/neutron-dhcp-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/dhcp_agent.ini" execstarts: "{{ neutron_bin }}/neutron-dhcp-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/dhcp_agent.ini"
@ -360,7 +361,7 @@ neutron_services:
group: neutron_openvswitch_agent group: neutron_openvswitch_agent
service_name: neutron-openvswitch-agent service_name: neutron-openvswitch-agent
service_en: "{{ neutron_plugin_type in ['ml2.ovs', 'ml2.ovs.dvr'] }}" service_en: "{{ neutron_plugin_type in ['ml2.ovs', 'ml2.ovs.dvr'] }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: plugins/ml2/openvswitch_agent.ini service_conf: plugins/ml2/openvswitch_agent.ini
service_rootwrap: rootwrap.d/openvswitch-plugin.filters service_rootwrap: rootwrap.d/openvswitch-plugin.filters
execstarts: "{{ neutron_bin }}/neutron-openvswitch-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/plugins/ml2/openvswitch_agent.ini" execstarts: "{{ neutron_bin }}/neutron-openvswitch-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/plugins/ml2/openvswitch_agent.ini"
@ -372,7 +373,7 @@ neutron_services:
group: neutron_linuxbridge_agent group: neutron_linuxbridge_agent
service_name: neutron-linuxbridge-agent service_name: neutron-linuxbridge-agent
service_en: "{{ neutron_plugin_type == 'ml2.lxb' }}" service_en: "{{ neutron_plugin_type == 'ml2.lxb' }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: plugins/ml2/linuxbridge_agent.ini service_conf: plugins/ml2/linuxbridge_agent.ini
service_rootwrap: rootwrap.d/linuxbridge-plugin.filters service_rootwrap: rootwrap.d/linuxbridge-plugin.filters
execstarts: "{{ neutron_bin }}/neutron-linuxbridge-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/plugins/ml2/linuxbridge_agent.ini" execstarts: "{{ neutron_bin }}/neutron-linuxbridge-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/plugins/ml2/linuxbridge_agent.ini"
@ -384,7 +385,7 @@ neutron_services:
group: neutron_metadata_agent group: neutron_metadata_agent
service_name: neutron-metadata-agent service_name: neutron-metadata-agent
service_en: "{{ neutron_metadata | bool }}" service_en: "{{ neutron_metadata | bool }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: metadata_agent.ini service_conf: metadata_agent.ini
execstarts: "{{ neutron_bin }}/neutron-metadata-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/metadata_agent.ini" execstarts: "{{ neutron_bin }}/neutron-metadata-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/metadata_agent.ini"
config_overrides: "{{ neutron_metadata_agent_ini_overrides }}" config_overrides: "{{ neutron_metadata_agent_ini_overrides }}"
@ -395,7 +396,7 @@ neutron_services:
group: neutron_metering_agent group: neutron_metering_agent
service_name: neutron-metering-agent service_name: neutron-metering-agent
service_en: "{{ neutron_metering | bool }}" service_en: "{{ neutron_metering | bool }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: metering_agent.ini service_conf: metering_agent.ini
execstarts: "{{ neutron_bin }}/neutron-metering-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/metering_agent.ini" execstarts: "{{ neutron_bin }}/neutron-metering-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/metering_agent.ini"
config_overrides: "{{ neutron_metering_agent_ini_overrides }}" config_overrides: "{{ neutron_metering_agent_ini_overrides }}"
@ -407,7 +408,7 @@ neutron_services:
group: neutron_l3_agent group: neutron_l3_agent
service_name: neutron-l3-agent service_name: neutron-l3-agent
service_en: "{{ neutron_l3 | bool }}" service_en: "{{ neutron_l3 | bool }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: l3_agent.ini service_conf: l3_agent.ini
service_rootwrap: rootwrap.d/l3.filters service_rootwrap: rootwrap.d/l3.filters
environment: environment:
@ -421,7 +422,7 @@ neutron_services:
group: neutron_bgp_dragent group: neutron_bgp_dragent
service_name: neutron-bgp-dragent service_name: neutron-bgp-dragent
service_en: "{{ neutron_bgp | bool }}" service_en: "{{ neutron_bgp | bool }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: bgp_dragent.ini service_conf: bgp_dragent.ini
execstarts: "{{ neutron_bin }}/neutron-bgp-dragent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/bgp_dragent.ini" execstarts: "{{ neutron_bin }}/neutron-bgp-dragent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/bgp_dragent.ini"
config_overrides: "{{ neutron_bgp_dragent_ini_overrides }}" config_overrides: "{{ neutron_bgp_dragent_ini_overrides }}"
@ -436,7 +437,7 @@ neutron_services:
group: neutron_l3_agent group: neutron_l3_agent
service_name: neutron-vpn-agent service_name: neutron-vpn-agent
service_en: false service_en: false
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: vpnaas_agent.ini service_conf: vpnaas_agent.ini
service_rootwrap: rootwrap.d/vpnaas.filters service_rootwrap: rootwrap.d/vpnaas.filters
execstarts: "{{ neutron_bin }}/neutron-vpn-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/vpnaas_agent.ini" execstarts: "{{ neutron_bin }}/neutron-vpn-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/vpnaas_agent.ini"
@ -480,7 +481,7 @@ neutron_services:
group: neutron_sriov_nic_agent group: neutron_sriov_nic_agent
service_name: neutron-sriov-nic-agent service_name: neutron-sriov-nic-agent
service_en: "{{ 'ml2.sriov' in neutron_plugin_types }}" service_en: "{{ 'ml2.sriov' in neutron_plugin_types }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: plugins/ml2/sriov_nic_agent.ini service_conf: plugins/ml2/sriov_nic_agent.ini
execstarts: "{{ neutron_bin }}/neutron-sriov-nic-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/plugins/ml2/sriov_nic_agent.ini" execstarts: "{{ neutron_bin }}/neutron-sriov-nic-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/plugins/ml2/sriov_nic_agent.ini"
config_overrides: "{{ neutron_sriov_nic_agent_ini_overrides }}" config_overrides: "{{ neutron_sriov_nic_agent_ini_overrides }}"
@ -499,7 +500,7 @@ neutron_services:
systemd_group_name: root systemd_group_name: root
service_name: neutron-ovn-metadata-agent service_name: neutron-ovn-metadata-agent
service_en: "{{ neutron_plugin_type == 'ml2.ovn' }}" service_en: "{{ neutron_plugin_type == 'ml2.ovn' }}"
service_conf_path: "{{ neutron_conf_dir }}" service_conf_path: "{{ neutron_conf_version_dir }}"
service_conf: neutron_ovn_metadata_agent.ini service_conf: neutron_ovn_metadata_agent.ini
service_rootwrap: rootwrap.d/ovn-plugin.filters service_rootwrap: rootwrap.d/ovn-plugin.filters
execstarts: "{{ neutron_bin }}/neutron-ovn-metadata-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/neutron_ovn_metadata_agent.ini" execstarts: "{{ neutron_bin }}/neutron-ovn-metadata-agent --config-file {{ neutron_conf_dir }}/neutron.conf --config-file {{ neutron_conf_dir }}/plugins/ml2/ml2_conf.ini --config-file {{ neutron_conf_dir }}/neutron_ovn_metadata_agent.ini"
@ -543,11 +544,11 @@ neutron_role_project_group: neutron_all
neutron_core_files: neutron_core_files:
- tmp_f: "/tmp/api-paste.ini.original" - tmp_f: "/tmp/api-paste.ini.original"
target_f: "{{ neutron_conf_dir }}/api-paste.ini" target_f: "{{ neutron_conf_version_dir }}/api-paste.ini"
config_overrides: "{{ _neutron_api_paste_ini_overrides | combine(neutron_api_paste_ini_overrides, recursive=True) }}" config_overrides: "{{ _neutron_api_paste_ini_overrides | combine(neutron_api_paste_ini_overrides, recursive=True) }}"
config_type: "ini" config_type: "ini"
- tmp_f: "/tmp/rootwrap.conf.original" - tmp_f: "/tmp/rootwrap.conf.original"
target_f: "{{ neutron_conf_dir }}/rootwrap.conf" target_f: "{{ neutron_conf_version_dir }}/rootwrap.conf"
config_overrides: "{{ _neutron_rootwrap_conf_overrides | combine(neutron_rootwrap_conf_overrides, recursive=True) }}" config_overrides: "{{ _neutron_rootwrap_conf_overrides | combine(neutron_rootwrap_conf_overrides, recursive=True) }}"
config_type: "ini" config_type: "ini"
owner: "root" owner: "root"