Tag: os-collect-config

  • OpenStack Heat and os-collect-config

    OpenStack-logo

    os-collect-config

    os-collect-config is a tool that starts up via systemd when a system boots. It initially runs at boot time, but continues to run looking for changes in heat metadata. In a nutshell,  os-collect-config is responsible for monitoring and downloading metadata from the Heat API.

    When data changes, os-collect-config makes a call to os-refresh-config. This data provides the node with all of the information it needs to make configuration changes to the host – this data will be node specific.

    Os-collect-config polls for data from sources (nova-metadata and heat) and stores them in /var/lib/os-collect-config/.

    Example of the contents of the directory above.

    -rw——-. 1 root root 42412 Jul 23 14:40 ComputeAllNodesDeployment.json
    -rw——-. 1 root root 42412 Jun 4 20:56 ComputeAllNodesDeployment.json.last
    -rw——-. 1 root root 35447 Feb 20 2017 ComputeAllNodesDeployment.json.orig
    -rw——-. 1 root root 23852 Jul 23 14:40 ComputeHostsDeployment.json
    -rw——-. 1 root root 23852 Jun 4 20:07 ComputeHostsDeployment.json.last
    -rw——-. 1 root root 8074 Feb 20 2017 ComputeHostsDeployment.json.orig
    -rw——-. 1 root root 1071 Jul 23 14:40 ec2.json
    -rw——-. 1 root root 1071 Feb 20 2017 ec2.json.last
    -rw——-. 1 root root 1071 Feb 20 2017 ec2.json.orig
    -rw——-. 1 root root 441 Feb 20 2017 heat_local.json
    -rw——-. 1 root root 441 Feb 20 2017 heat_local.json.last
    -rw——-. 1 root root 441 Feb 20 2017 heat_local.json.orig
    -rw——-. 1 root root 2635 Jul 23 14:40 NetworkDeployment.json
    -rw——-. 1 root root 2635 Mar 1 2017 NetworkDeployment.json.last
    -rw——-. 1 root root 2636 Feb 20 2017 NetworkDeployment.json.orig
    -rw——-. 1 root root 13259 Jul 23 14:40 NovaComputeDeployment.json
    -rw——-. 1 root root 13259 Jan 16 2018 NovaComputeDeployment.json.last
    -rw——-. 1 root root 11069 Feb 20 2017 NovaComputeDeployment.json.orig
    -rw——-. 1 root root 311 Jun 4 22:02 os_config_files.json
    -rw——-. 1 root root 252762 Jul 23 14:40 request.json
    -rw——-. 1 root root 252762 Jun 4 22:07 request.json.last
    -rw——-. 1 root root 23440 Feb 20 2017 request.json.orig

    Example of the contents of the directory above. You will usually find 3 versions of each config. Current, original, and last (previous).

    You can view this metadata, using python, as shown below.

    # python -m json.tool ComputeAllNodesDeployment.json
    {
    “hiera”: {
    “datafiles”: {
    “all_nodes”: {
    “mapped_data”: {
    “ca_certs_enabled”: “true”,
    “ca_certs_short_node_names”: [

    …trunc…

    os-refresh-config

    os-refresh-config is called by os-collect-config once it recognizes that metadata has changed within the Heat API for that specific node.

    The important steps that os-refresh-config take are shown below

    1) Apply systemctl configurables
    2) Run os-apply-config (see below)
    3) Configure the networking for the host
    4) Download and set the hieradata files for puppet parameters
    5) Configure /etc/hosts
    6) Deploy software configuration with Heat

    os-apply-config

    os-apply-config is called by os-refresh-config to sets up configuration files on specific nodes. It is called via ‘/usr/libexec/os-refresh-config/configure.d/20-os-apply-config‘.

    As is does with the undercloud deploy, os-refresh-config executes scripts under /usr/libexec/os-refresh-config/ in a specific order based on numbering.

    First scripts within thje  pre-configure.d/ directory are run, then configure.d/ scripts are applied, and finally scripts in post-configure.d/.

    It is within these scripts that the metadata downloaded by os-collect-config will be acted upon.

    Any call to os-apply-config uses the files in /var/lib/os-collect-config as its configuration source.

    The appropriate script files for doing so are as follows:

    overcloud$ ll /usr/libexec/os-refresh-config/configure.d/
    total 32
    -rwxr-xr-x. 1 root root 396 Aug 5 07:31 10-sysctl-apply-config
    -rwxr-xr-x. 1 root root 42 Aug 5 07:31 20-os-apply-config
    -rwxr-xr-x. 1 root root 189 Aug 5 07:31 20-os-net-config
    -rwxr-xr-x. 1 root root 629 Aug 5 07:31 25-set-network-gateway
    -rwxr-xr-x. 1 root root 2265 Aug 5 07:31 40-hiera-datafiles
    -rwxr-xr-x. 1 root root 1387 Aug 5 07:31 51-hosts
    -rwxr-xr-x. 1 root root 5784 Aug 5 07:31 55-heat-config

    If we run os-apply-config manually, we can see that it does the following:

    overcloud$ sudo sh /usr/libexec/os-refresh-config/configure.d/20-os-apply-config
    [2015/08/07 01:17:40 PM] [INFO] writing /etc/os-net-config/config.json
    [2015/08/07 01:17:40 PM] [INFO] writing /var/run/heat-config/heat-config
    [2015/08/07 01:17:40 PM] [INFO] writing /etc/puppet/hiera.yaml
    [2015/08/07 01:17:40 PM] [INFO] writing /etc/os-collect-config.conf
    [2015/08/07 01:17:40 PM] [INFO] success

     

    os-net-config

    The directory /os/net-config/ holds the config.json file that is used to modify the networking configuration on each host. The config found in this file is derived from the os-collect-config data in /var/lib/os-collect-config/.

    Again you can use this file to review your networking configuration and compare and contrast to your templates. Formatting is off in the file below, but you get the point.
    # python -m json.tool config.json
    {
    “network_config”: [
    {
    “addresses”: [
    {
    “ip_netmask”: “172.20.4.113/24”
    }
    ],
    “dns_servers”: [
    “96.239.250.57”,
    “96.239.250.58”
    ],
    “name”: “em3”,
    “routes”: [
    {
    “ip_netmask”: “169.254.169.254/32”,
    “next_hop”: “172.20.4.20”
    }
    ],
    “type”: “interface”,
    “use_dhcp”: false
    },
    {
    “members”: [
    {
    “bonding_options”: “mode=4 lacp_rate=1 updelay=1000 miimon=50”,
    “members”: [
    {
    “mtu”: 9216,
    “name”: “em1”,
    “primary”: true,
    “type”: “interface”
    },
    {
    “mtu”: 9216,
    “name”: “em2”,
    “type”: “interface”
    }
    ],
    “mtu”: 9216,
    “name”: “bond1”,
    “type”: “linux_bond”
    },
    {
    “addresses”: [
    {
    “ip_netmask”: “172.20.3.30/24”
    }
    ],
    “device”: “bond1”,
    “mtu”: 9000,
    “type”: “vlan”,
    “vlan_id”: 52