Chapter 13. Controlling Node Placement The default behavior for the director is to randomly select nodes for each role, usually based on their profile tag. However, the director provides the ability to define specific node placement. This is a useful method to: Assign specific node IDs e.g. controller-0 , controller-1 , etc Assign custom hostnames Assign specific IP addresses Assign specific Virtual IP addresses Note Manually setting predictable IP addresses, virtual IP addresses, and ports for a network alleviates the need for allocation pools. However, it is recommended to retain allocation pools for each network to ease with scaling new nodes. Make sure that any statically defined IP addresses fall outside the allocation pools. For more information on setting allocation pools, see Section 10.7, "Custom network environment file" . 13.1. Assigning Specific Node IDs This procedure assigns node ID to specific nodes. Examples of node IDs include controller-0 , controller-1 , compute-0 , compute-1 , and so forth. The first step is to assign the ID as a per-node capability that the Compute scheduler matches on deployment. For example: This assigns the capability node:controller-0 to the node. Repeat this pattern using a unique continuous index, starting from 0, for all nodes. Make sure all nodes for a given role (Controller, Compute, or each of the storage roles) are tagged in the same way or else the Compute scheduler will not match the capabilities correctly. The step is to create a Heat environment file (for example, scheduler_hints_env.yaml ) that uses scheduler hints to match the capabilities for each node. For example: To use these scheduler hints, include the ` scheduler_hints_env.yaml` environment file with the overcloud deploy command during overcloud creation. The same approach is possible for each role via these parameters: ControllerSchedulerHints for Controller nodes. ComputeSchedulerHints for Compute nodes. BlockStorageSchedulerHints for Block Storage nodes. ObjectStorageSchedulerHints for Object Storage nodes. CephStorageSchedulerHints for Ceph Storage nodes. [ROLE]SchedulerHints for custom roles. Replace [ROLE] with the role name. Note Node placement takes priority over profile matching. To avoid scheduling failures, use the default baremetal flavor for deployment and not the flavors designed for profile matching ( compute , control , etc). For example: 13.2. Assigning Custom Hostnames In combination with the node ID configuration in Section 13.1, "Assigning Specific Node IDs" , the director can also assign a specific custom hostname to each node. This is useful when you need to define where a system is located (e.g. rack2-row12 ), match an inventory identifier, or other situations where a custom hostname is desired. To customize node hostnames, use the HostnameMap parameter in an environment file, such as the ` scheduler_hints_env.yaml` file from Section 13.1, "Assigning Specific Node IDs" . For example: Define the HostnameMap in the parameter_defaults section, and set each mapping as the original hostname that Heat defines using HostnameFormat parameters (e.g. overcloud-controller-0 ) and the second value is the desired custom hostname for that node (e.g. overcloud-controller-prod-123-0 ). Using this method in combination with the node ID placement ensures each node has a custom hostname. 13.3. Assigning Predictable IPs For further control over the resulting environment, director can assign overcloud nodes with specific IPs on each network. Create an environment file to define the predictive IP addressing: Create a parameter_defaults section in the ~/templates/predictive_ips.yaml file and use the following syntax to define predictive IP addressing for each node on each network: Each node role has a unique parameter. Replace <role_name>IPs with the relevant parameter: ControllerIPs for Controller nodes. ComputeIPs for Compute nodes. CephStorageIPs for Ceph Storage nodes. BlockStorageIPs for Block Storage nodes. SwiftStorageIPs for Object Storage nodes. [ROLE]IPs for custom roles. Replace [ROLE] with the role name. Each parameter is a map of network names to a list of addresses. Each network type must have at least as many addresses as there will be nodes on that network. Director assigns addresses in order. The first node of each type receives the first address on each respective list, the second node receives the second address on each respective lists, and so forth. For example, if an overcloud will contain three Ceph Storage nodes, the CephStorageIPs parameter might look like: The first Ceph Storage node receives two addresses: 172.16.1.100 and 172.16.3.100. The second receives 172.16.1.101 and 172.16.3.101, and the third receives 172.16.1.102 and 172.16.3.102. The same pattern applies to the other node types. To configure predictable IP addresses on the control plane, copy the /usr/share/openstack-tripleo-heat-templates/environments/ips-from-pool-ctlplane.yaml file to the templates directory of the stack user: Configure the new ips-from-pool-ctlplane.yaml file with the following parameter example. You can combine the control plane IP address declarations with the IP address declarations for other networks and use only one file to declare the IP addresses for all networks on all roles. You can also use predictable IP addresses for spine/leaf. Each node must have IP addresses from the correct subnet. Ensure that the IP addresses that you choose fall outside the allocation pools for each network that you define in your network environment file (see Section 10.7, "Custom network environment file" ). For example, ensure that the internal_api assignments fall outside of the InternalApiAllocationPools range to avoid conflicts with any IPs chosen automatically. Likewise, ensure that the IP assignments do not conflict with the VIP configuration, either for standard predictable VIP placement (see Section 13.4, "Assigning Predictable Virtual IPs" ) or external load balancing (see Section 23.2, "Configuring External Load Balancing" ). Important If an overcloud node is deleted, do not remove its entries in the IP lists. The IP list is based on the underlying Heat indices, which do not change even if you delete nodes. To indicate a given entry in the list is no longer used, replace the IP value with a value such as DELETED or UNUSED . Entries should never be removed from the IP lists, only changed or added. To apply this configuration during a deployment, include the predictive_ips.yaml environment file with the openstack overcloud deploy command. Important If using network isolation, include the predictive_ips.yaml file after the network-isolation.yaml file. For example: 13.4. Assigning Predictable Virtual IPs In addition to defining predictable IP addresses for each node, the director also provides a similar ability to define predictable Virtual IPs (VIPs) for clustered services. To accomplish this, edit the network environment file from Section 10.7, "Custom network environment file" and add the VIP parameters in the parameter_defaults section: Select these IPs from outside of their respective allocation pool ranges. For example, select an IP address for InternalApiVirtualFixedIPs that is not within the InternalApiAllocationPools range. This step is only for overclouds using the default internal load balancing configuration. If assigning VIPs with an external load balancer, use the procedure in the dedicated External Load Balancing for the Overcloud guide.

Commands:
openstack baremetal node set --property capabilities='node:controller-0,boot_option:local' <id>
parameter_defaults: ControllerSchedulerHints: 'capabilities:node': 'controller-%index%'
openstack overcloud deploy ... --control-flavor baremetal --compute-flavor baremetal
parameter_defaults: ControllerSchedulerHints: 'capabilities:node': 'controller-%index%' ComputeSchedulerHints: 'capabilities:node': 'compute-%index%' HostnameMap: overcloud-controller-0: overcloud-controller-prod-123-0 overcloud-controller-1: overcloud-controller-prod-456-0 overcloud-controller-2: overcloud-controller-prod-789-0 overcloud-compute-0: overcloud-compute-prod-abc-0
touch ~/templates/predictive_ips.yaml
parameter_defaults: <role_name>IPs: <network>: - <IP_address> <network>: - <IP_address>
parameter_defaults: CephStorageIPs: storage: - 172.16.1.100 - 172.16.1.101 - 172.16.1.102 storage_mgmt: - 172.16.3.100 - 172.16.3.101 - 172.16.3.102
cp /usr/share/openstack-tripleo-heat-templates/environments/ips-from-pool-ctlplane.yaml ~/templates/.
parameter_defaults: ControllerIPs: ctlplane: - 192.168.24.10 - 192.168.24.11 - 192.168.24.12 internal_api: - 172.16.1.20 - 172.16.1.21 - 172.16.1.22 external: - 10.0.0.40 - 10.0.0.57 - 10.0.0.104 ComputeLeaf1IPs: ctlplane: - 192.168.25.100 - 192.168.25.101 internal_api: - 172.16.2.100 - 172.16.2.101 ComputeLeaf2IPs: ctlplane: - 192.168.26.100 - 192.168.26.101 internal_api: - 172.16.3.100 - 172.16.3.101
openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml -e ~/templates/predictive_ips.yaml [OTHER OPTIONS]
parameter_defaults: # Predictable VIPs ControlFixedIPs: [{'ip_address':'192.168.201.101'}] InternalApiVirtualFixedIPs: [{'ip_address':'172.16.0.9'}] PublicVirtualFixedIPs: [{'ip_address':'10.1.1.9'}] StorageVirtualFixedIPs: [{'ip_address':'172.18.0.9'}] StorageMgmtVirtualFixedIPs: [{'ip_address':'172.19.0.9'}] RedisVirtualFixedIPs: [{'ip_address':'172.16.0.8'}]