Skip to content
StrongLinux

Documentation

Cloud operations guide

This guide is for people who run a StrongLinux cloud already deployed with strongctl (Server edition). Installation is covered in the installation guide, and version updates in the upgrade guide.

Every command runs as root on the host where strongctl was initialized (the first controller). The cloud configuration lives in /etc/strongctl/.

1. Everyday commands

CommandPurpose
strongctl statusLists the inventory groups and the nodes in each
strongctl verifyChecks the health of the whole cloud (see section 2)
strongctl deployApplies the configuration to every node; idempotent
strongctl deploy --role <role>Only the nodes of one role: controller, compute, network or storage
strongctl secrets show <name>Shows a secret from the vault (e.g. keystone_admin)
strongctl tempestOfficial OpenStack tests against the cloud (smoke; --suite full for all)
strongctl upgradeRolling bug-fix update
strongctl <command> --checkDry run, changes nothing

To use the openstack client as administrator:

source /root/admin-openrc.sh
openstack server list --all-projects

2. Cloud health

strongctl verify checks, node by node:

Run verify after any change and before an upgrade (which requires a green verify).

Published APIs

HAProxy publishes the APIs with TLS on the controller address (or on the VIP, with HA):

ServicePort
Keystone (identity)5000
Glance (images)9292
Placement8778
Nova (compute)8774
Neutron (networking)9696
Cinder (volumes)8776
Heat (orchestration)8004 and 8000 (CloudFormation)
Barbican (secrets)9311
StrongStack API Server9999
Horizon (dashboard)443, at /dashboard (port 80 redirects)

Behind HAProxy, each API listens only on the internal address (127.0.0.1 on an all-in-one). Nova metadata (8775) and the noVNC console (6080) are internal.

Logs

WhereWhat
/var/log/<service>/The log of each OpenStack service (keystone, nova, neutron, cinder…)
journalctl -u <unit>Start, stop and errors of the systemd units
/var/log/strongstack/StrongStack API Server
/var/log/haproxy.logAPI access
journalctl -k | grep apparmorAppArmor denials (section 8)
/var/log/sudo.logsudo usage

3. Credentials and secrets

4. Adding and maintaining nodes

Add a compute or storage node

  1. Install the node from the ISO (Compute or Storage option) or with the stronglinux-1.0-openstack-cloud-amd64.qcow2 image.
  2. Authorize the controller's root SSH key on the new node (/root/.ssh/authorized_keys).
  3. Add the node to /etc/strongctl/inventory.yml: the address under all.hosts and the name in the role's group.
    all:
      hosts:
        cmp3: {ansible_host: 10.0.0.23, mgmt_ip: 10.0.0.23}
      children:
        compute:
          hosts:
            cmp3:
  4. Prepare the base and deploy:
    strongctl bootstrap
    strongctl deploy
    strongctl verify

Use the full deploy, without --role: it only changes the new node, but it also runs the compute registration in Nova (nova-manage cell_v2 discover_hosts), which lives on the first controller and does not run with --role compute.

Take a compute node out of service for maintenance

openstack compute service set --disable --disable-reason "maintenance" <host> nova-compute
openstack server list --all-projects --host <host>
openstack server migrate --live-migration <vm>     # or shut down the host's VMs

After the maintenance: openstack compute service set --enable <host> nova-compute.

Restarting a controller with high availability

Restart one controller at a time and check with strongctl verify before moving to the next. Galera, RabbitMQ and OVN rejoin the cluster on their own. If all three went down at the same time, follow the Galera recovery in the high availability guide.

5. Backups

strongctl does not make automatic backups. Keep, outside the cloud:

WhatHow
Configuration and vaulttar czf strongctl-$(date +%F).tgz -C /etc strongctl (includes the CA in tls/)
Databasesmariadb-dump --all-databases --single-transaction --routines --events | gzip > databases-$(date +%F).sql.gz (with Galera, on one controller only)
Keystone keystar czf keystone-keys-$(date +%F).tgz -C /etc/keystone fernet-keys credential-keys
Glance images/var/lib/glance/images/ (local storage)
Volumesopenstack volume backup create <volume> (posix backend in /var/lib/cinder/backup)

The services' configuration files (/etc/<service>/) do not need a copy: strongctl deploy regenerates them all from /etc/strongctl/.

To restore on a new controller: install the system, restore /etc/strongctl/ and the Keystone keys, run strongctl bootstrap, import the databases (zcat databases.sql.gz | mariadb) and run strongctl deploy and strongctl verify.

6. Token key rotation (fernet)

Keystone tokens are encrypted with fernet keys in /etc/keystone/fernet-keys/. Rotate the keys periodically, for example once a week. On the first controller:

runuser -u keystone -- keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone
strongctl deploy --role controller      # with HA: copies the new keys to the other controllers

Keystone keeps 3 active keys, so tokens already issued remain valid. With a single controller, the first command is enough.

7. TLS certificates

8. Day-to-day security

9. Common problems

SymptomLikely causeWhat to do
strongctl verify fails on a portService stopped or certificate expiredjournalctl -u <unit>; certificate expiry (section 7)
HTTP 401 between services (e.g. Nova → Neutron)Service user without the service role, or a password changed by handstrongctl deploy (restores the roles and passwords from the vault)
VM without an IP or metadataOVN agent stopped on the compute, or a chassis name different from Nova's hostsystemctl status neutron-ovn-agent; ovs-vsctl get open . external-ids:hostname must match host in nova.conf
VM goes to ERROR on creationNo compute available, or a new compute not registeredopenstack compute service list; run strongctl deploy (it runs discover_hosts)
Volume does not attachiSCSI unavailable (e.g. in a container) or tgt stoppedsystemctl status tgt iscsid on the storage and compute nodes
Too many connections in the databaseToo many workers, or a low max_connectionsstrongctl bootstrap reapplies MariaDB's max_connections (mariadb_max_connections in globals.yml)
Galera does not start after a full outageAll three controllers stoppedRecovery in the high availability guide
A service does not start right after an updateAppArmor denialjournalctl -k | grep DENIED (section 8)

If the problem persists, open an issue with the output of strongctl verify and the service logs (without passwords). See the support page.