Refactor EDPM job

This patch looks huge, so let's split things in the following listing:

- rename role to match the naming convention
  - role name shouldn't get hyphen, so let's use underscores instead.
    Playbooks don't need to follow this rule.

This should make the role more portable in the future.

- modify role
  - "disable" the main.yml - we must call specific task file.
  - no more condioned deploy based on variables. Makes it easier to
    follow and maintain.
  - update how the edpm inventory is edited
    - use plain YAML
    - output plain YAML
    - this format is consistent with latest changes in tripleo-ansible[1]

These changes make the overall role easier to understand and maintain,
while ensuring the playbook is also easier to read. It may also make the
deploy a bit faster with the new way to run the various tasks.

- update playbook
  - boostrap both nodes in a 2-stages way (check comment as to why).
  - deploy compute from the undercloud (mimic what an operator would do)
  - validate the compute from the undercloud (no actual change here)
  - target specific task_file during the different stages. It's easier
    to understand what's going on in there

These changes should allow a better understanding of the overall playbook.

- update edpm deploy script to use an environment file instead of CLI
  params
  - this makes the script lighter and easier to understand
  - adding new parameters in the env file is easier
  - reading the env file for debugging is better

[1] https://review.opendev.org/c/openstack/tripleo-ansible/+/869357

Change-Id: I263f424a5a08214b9c46c5ea73b6b428709ad47b
This commit is contained in:
Cédric Jeanneret 2022-12-07 15:30:51 +01:00
parent 8c8d3d557a
commit 5c22039cd0
17 changed files with 162 additions and 141 deletions

View File

@ -1,45 +1,50 @@
---
# This playbook does:
# - On undercloud node
# + it bootstrap the node and deploy standalone
# + Generate 99 standalone vars and copy it to
# subnode-1
#
# First, deploy the undercloud. This will also ensure the inventory is properly
# populated with the subnode-1 host and all the needed data.
- hosts: undercloud
gather_facts: true
tags:
- standalone
vars:
deploy_standalone: true
tasks:
- name: Run External Data Plane management role
include_role:
name: external-data-plane-management
name: external_data_plane_management
tasks_from: prepare_node.yml
# On subnode-1
# It bootstrap the node and install required packages
# copy 99 standalone vars to tripleo inventory
# Deploy compute services
# Now that we have the updated inventory, we can get to subnode-1 using the
# correct data. Let's bootstrap it!
- hosts: subnode-1
gather_facts: true
tags:
- standalone
vars:
deploy_standalone: false
copy_inventory: true
target_host: subnode-1
tasks:
- name: Run External Data Plane management role
include_role:
name: external-data-plane-management
name: external_data_plane_management
tasks_from: prepare_node.yml
# On Controller node
# Run validate_external_compute.sh
# On undercloud:
# + Deploy standalone
# + Deploy the external compute from within the undercloud
# + Validate external compute
- hosts: undercloud
gather_facts: true
gather_facts: false
tags:
- standalone
tasks:
- include_role:
name: external-data-plane-management
- name: Deploy standalone
include_role:
name: external_data_plane_management
tasks_from: deploy_standalone.yml
- name: Deploy remote compute
vars:
target_host: 'subnode-1'
include_role:
name: external_data_plane_management
tasks_from: compute_services_on_target_host.yml
- name: Validate EDPM deploy
vars:
target_host: 'subnode-1'
include_role:
name: external_data_plane_management
tasks_from: validate_edpm.yml

View File

@ -1,61 +0,0 @@
---
# It contains following tasks:
# - Set hostname for target node
# - Run repo-setup role to enable specific release files
# - Build depends-on changes using build-test-packages and enable gating repo
# to install built packages from gating repo
# - Install tripleo-ansible and its required dependencies
# - Copy standalone env vars to subnode-1
# - Change localhost to target hostname
# - Deploy compute services.
- name: Install Required packages
become: true
package:
name:
- ansible-collection-containers-podman
- python3-tenacity
- tripleo-ansible
- ansible-role-chrony
state: present
- name: Copy 99 standalone var from controller to compute node
copy:
src: "/home/{{ ansible_user }}/99-standalone-vars"
dest: "/usr/share/ansible/tripleo-inventory/99-standalone-vars"
become: true
when: copy_inventory | default('false') | bool
- name: Change localhost name to target host
become: true
lineinfile:
path: "/usr/share/ansible/tripleo-inventory/02-computes"
search_string: 'localhost:'
# 4 spaces is added to place at proper hostname position
# TODO(chkumar): Explore inifile module to manipulate yaml
# file later.
line: " {{ target_host }}:"
- name: Rename the host_vars file to target host
become: true
copy:
src: "/usr/share/ansible/tripleo-inventory/host_vars/localhost"
dest: "/usr/share/ansible/tripleo-inventory/host_vars/{{ target_host }}"
- name: Remove the old file
become: true
file:
path: "/usr/share/ansible/tripleo-inventory/host_vars/localhost"
state: absent
- name: Generate deploy_compute.sh script
template:
src: deploy_compute.sh.j2
dest: "{{ working_dir }}/deploy_compute.sh"
mode: 0755
- name: Run deploy_compute.sh script
shell: >
set -o pipefail &&
{{ working_dir }}/deploy_compute.sh
2>&1 {{ timestamper_cmd }} > {{ working_dir }}/deploy_compute.log

View File

@ -1,24 +0,0 @@
---
# This Playbook does the following things in order
# prepare_node.yml
# * It will run on both controller and compute node.
# - Add the host to tripleo-inventory
# - Run undercloud-setup
- import_tasks: prepare_node.yml
# deploy_standalone.yml
# * It will run on controller node
# - Deploy Standalone
# - Generate 99 standalone vars
- import_tasks: deploy_standalone.yml
when: deploy_standalone | bool
# compute_services_on_target_host.yml
# * It will run on target node.
# - Install the tripleo-ansible dependencies on target node
# - Copy 99 standalone vars from controller to
# compute node inventory
# - Deploy compute services on target node
- import_tasks: compute_services_on_target_host.yml
when: not deploy_standalone | bool

View File

@ -1,19 +0,0 @@
sudo ansible-playbook -i /usr/share/ansible/tripleo-inventory \
-e tripleo_iscsid_image={{ tripleo_iscsid_image }} \
-e tripleo_logrotate_crond_image={{ tripleo_logrotate_crond_image }} \
-e tripleo_nova_compute_container_image={{ tripleo_nova_compute_container_image }} \
-e tripleo_nova_libvirt_container_image={{ tripleo_nova_libvirt_container_image }} \
-e tripleo_ovn_controller_image={{ tripleo_ovn_controller_image }} \
-e tripleo_selinux_mode={{ tripleo_selinux_mode }} \
-e neutron_public_interface_name={{ neutron_public_interface_name }} \
-e tripleo_network_config_template={{ tripleo_network_config_template }} \
-e '{ctlplane_dns_nameservers: {{ ctlplane_dns_nameservers }}}' \
-e '{tripleo_container_registry_insecure_registries: {{ tripleo_container_registry_insecure_registries }}}' \
-e '{tripleo_hosts_entries_overcloud_hosts_entries: {{ tripleo_hosts_entries_overcloud_hosts_entries|to_json }}}' \
{% if not copy_inventory | bool %}
-e '{dns_search_domains: {{ dns_search_domains }}}' \
-e '{tripleo_ovn_dbs: {{ tripleo_ovn_dbs }}}' \
{% else %}
-e ctlplane_ip={{ ctlplane_ip }} \
{% endif %}
/usr/share/ansible/tripleo-playbooks/deploy-overcloud-compute.yml

View File

@ -5,13 +5,11 @@ tripleo_logrotate_crond_image: "{{ docker_registry_host }}/{{ docker_registry_na
tripleo_nova_compute_container_image: "{{ docker_registry_host }}/{{ docker_registry_namespace }}/openstack-nova-compute:{{ docker_image_tag }}"
tripleo_nova_libvirt_container_image: "{{ docker_registry_host }}/{{ docker_registry_namespace }}/openstack-nova-libvirt:{{ docker_image_tag }}"
tripleo_ovn_controller_image: "{{ docker_registry_host }}/{{ docker_registry_namespace }}/openstack-ovn-controller:{{ docker_image_tag }}"
deploy_standalone: false
# tripleo-standalone-vars script related vars
tripleo_standalone_vars: "/home/{{ ansible_user }}/src/opendev.org/openstack/tripleo-ansible/scripts/tripleo-standalone-vars"
config_download_dir: "/home/{{ ansible_user }}/tripleo-deploy"
role_type: "Standalone"
copy_inventory: false
target_host: undercloud
timestamper_cmd: >-

View File

@ -0,0 +1,96 @@
---
# It contains following tasks:
# - Set hostname for target node
# - Copy standalone env vars to subnode-1
# - Change localhost to target hostname
# - Deploy compute services.
- name: Copy id_rsa key to working_dir
become: true
copy:
src: /etc/nodepool/id_rsa
dest: "{{ working_dir }}/.ssh/edpm_rsa"
owner: "{{ ansible_user }}"
mode: 0600
- name: Copy tripleo-inventory as EDPM env
become: true
copy:
src: /usr/share/ansible/tripleo-inventory/
dest: "{{ working_dir }}/tripleo-deploy/edpm-inventory/"
remote_src: true
directory_mode: 0755
owner: "{{ ansible_user }}"
- name: Copy 99 standalone var into EDPM inventory
copy:
src: "{{ working_dir }}/99-standalone-vars"
dest: "{{ working_dir }}/tripleo-deploy/edpm-inventory/99-standalone-vars"
remote_src: true
- name: Manipulate inventory
block:
- name: Get subnode IP
register: subnode_ip
slurp:
path: /etc/nodepool/sub_nodes
- name: Get inventory content
register: original_inventory
slurp:
path: "{{ working_dir }}/tripleo-deploy/edpm-inventory/02-computes"
- name: Set inventory host content
set_fact:
inventory_hosts: |
{
hosts: {
{{ target_host }}: {
ansible_host: "{{ subnode_ip['content']|b64decode|trim }}",
ansible_ssh_private_key_file: '{{ working_dir }}/.ssh/edpm_rsa',
ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
}
}
}
- name: Update inventory content
set_fact:
updated_inventory: >-
{%- set _inventory = original_inventory['content']|b64decode|from_yaml %}
{%- set _hosts = inventory_hosts |from_yaml %}
{%- set _ = _inventory['Compute'].update( _hosts ) %}
{{ _inventory }}
- name: Output new inventory as clean yaml
copy:
dest: "{{ working_dir }}/tripleo-deploy/edpm-inventory/02-computes"
content: "{{ updated_inventory | from_yaml | to_nice_yaml }}"
- name: Rename the host_vars file to target host
copy:
src: "{{ working_dir }}/tripleo-deploy/edpm-inventory/host_vars/localhost"
dest: "{{ working_dir }}/tripleo-deploy/edpm-inventory/host_vars/{{ target_host }}"
remote_src: true
- name: Remove the old file
file:
path: "{{ working_dir }}/tripleo-deploy/edpm-inventory/host_vars/localhost"
state: absent
- name: Generate parameter file for deploy_compute task
template:
src: compute-parameter.yaml.j2
dest: "{{ working_dir }}/edpm-compute-parameter.yaml"
mode: 0644
- name: Generate deploy_compute.sh script
template:
src: deploy_compute.sh.j2
dest: "{{ working_dir }}/deploy_compute.sh"
mode: 0755
- name: Run deploy_compute.sh script
shell: >
set -o pipefail &&
{{ working_dir }}/deploy_compute.sh
2>&1 {{ timestamper_cmd }} > {{ working_dir }}/deploy_compute.log

View File

@ -0,0 +1,4 @@
---
- name: Do not do anything
fail:
msg: "This role doesn't do anything unless you include a specific task file"

View File

@ -6,7 +6,7 @@
include_role:
name: tripleo-inventory
- name: Prepare the node for installation
- name: Prepare nodes with repositories and custom builds
include_role:
name: undercloud-setup

View File

@ -5,7 +5,7 @@
dest: "{{ working_dir }}/validate_external_compute.sh"
mode: 0755
- name: Run deploy_compute.sh script
- name: Run validate_external_compute.sh script
shell: >
set -o pipefail &&
{{ working_dir }}/validate_external_compute.sh

View File

@ -0,0 +1,18 @@
---
# Parameter file for the deploy-overcloud-compute.yml playbook
ctlplane_ip: "{{ ctlplane_ip }}"
tripleo_iscsid_image: "{{ tripleo_iscsid_image }}"
tripleo_logrotate_crond_image: "{{ tripleo_logrotate_crond_image }}"
tripleo_nova_compute_container_image: "{{ tripleo_nova_compute_container_image }}"
tripleo_nova_libvirt_container_image: "{{ tripleo_nova_libvirt_container_image }}"
tripleo_ovn_controller_image: "{{ tripleo_ovn_controller_image }}"
tripleo_selinux_mode: "{{ tripleo_selinux_mode }}"
neutron_public_interface_name: "{{ neutron_public_interface_name }}"
tripleo_network_config_template: "{{ tripleo_network_config_template }}"
ctlplane_dns_nameservers: {{ ctlplane_dns_nameservers }}
tripleo_container_registry_insecure_registries: {{ tripleo_container_registry_insecure_registries }}
tripleo_hosts_entries_overcloud_hosts_entries: {{ tripleo_hosts_entries_overcloud_hosts_entries|to_json }}
# For now, don't load firewall
deploy_tripleo_openstack_run_firewall: false
tripleo_sshd_configure_firewall: true

View File

@ -0,0 +1,3 @@
sudo ansible-playbook -i {{ working_dir }}/tripleo-deploy/edpm-inventory \
-e @{{ working_dir }}/edpm-compute-parameter.yaml \
/usr/share/ansible/tripleo-playbooks/deploy-overcloud-compute.yml

View File

@ -1,5 +1,5 @@
#!/bin/bash
# {{ target_host }}
set -eux
# Discover new compute nodes
@ -8,6 +8,16 @@ sudo podman exec -it nova_api nova-manage cell_v2 discover_hosts --verbose
# Export standalone cloud
export OS_CLOUD=standalone
# Export some needed variables
export GATEWAY='{{ tempest_cidr|nthhost(1) }}'
export PUBLIC_NETWORK_CIDR='{{ tempest_cidr }}'
export PRIVATE_NETWORK_CIDR=192.168.74.0/28
export PUBLIC_NET_START='{{ tempest_cidr|nthhost(150) }}'
export PUBLIC_NET_END='{{ tempest_cidr|nthhost(200) }}'
export DNS_SERVER=1.1.1.1
export HYPER='{{ hostvars[target_host].ansible_fqdn }}'
export INSTANCE_NAME=myserver-$HYPER
# List Available Zones
openstack availability zone list
@ -25,15 +35,6 @@ openstack network agent list
# Steps to validate host
# copied from https://github.com/fultonj/zed/blob/main/standalone/verify.sh
export GATEWAY='{{ tempest_cidr|nthhost(1) }}'
export PUBLIC_NETWORK_CIDR='{{ tempest_cidr }}'
export PRIVATE_NETWORK_CIDR=192.168.74.0/28
export PUBLIC_NET_START='{{ tempest_cidr|nthhost(150) }}'
export PUBLIC_NET_END='{{ tempest_cidr|nthhost(200) }}'
export DNS_SERVER=1.1.1.1
export HYPER='{{ hostvars['subnode-1'].ansible_fqdn }}'
export INSTANCE_NAME=myserver-$HYPER
openstack keypair create --private-key ~/test_key default
openstack keypair list