heat_template_version: rocky description: Sets up MPIO and udev rules on all nodes parameters: servers: type: json EndpointMap: default: {} type: json description: Mapping of service endpoint -> protocol. Typically set via parameter_defaults in the resource registry. resources: PureSetup: type: OS::Heat::SoftwareConfig properties: group: script config: | #!/bin/bash sudo yum install -y libstoragemgmt-udev cat </tmp/90-scsi-ua.rules # Add SCSI Unit Attention rescan for resize ACTION=="change", SUBSYSTEM=="scsi", ENV{SDEV_UA}=="CAPACITY_DATA_HAS_CHANGED", TEST=="rescan", ATTR{rescan}="x" EOF sudo grep -q "CAPACITY_DATA_HAS_CHANGED" /etc/udev/rules.d/90-scsi-ua.rules if [[ $? != 0 ]]; then cat /tmp/90-scsi-ua.rules >>/etc/udev/rules.d/90-scsi-ua.rules fi sudo mpathconf --enable --with_multipathd yes cat <>/tmp/multipath.conf defaults { polling_interval 10 skip_kpartx yes } devices { device { vendor "PURE" product "FlashArray" path_selector "service-time 0" hardware_handler "1 alua" path_grouping_policy group_by_prio prio alua failback immediate path_checker tur fast_io_fail_tmo 10 user_friendly_names no no_path_retry 0 features 0 dev_loss_tmo 600 } } EOF sudo grep -q "PURE" /etc/multipath.conf if [[ $? != 0 ]]; then sudo cat /tmp/multipath.conf >>/etc/multipath.conf sudo systemctl start multipathd sudo systemctl enable multipathd fi cat <>/tmp/99-pure-storage.rules # Recommended settings for Pure Storage FlashArray. # Use noop scheduler for high-performance solid-state storage for SCSI devices ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{queue/scheduler}="none" ACTION=="add|change", KERNEL=="dm-[0-9]*", SUBSYSTEM=="block", ENV{DM_NAME}=="3624a937*", ATTR{queue/scheduler}="none" # Reduce CPU overhead due to entropy collection ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{queue/add_random}="0" ACTION=="add|change", KERNEL=="dm-[0-9]*", SUBSYSTEM=="block", ENV{DM_NAME}=="3624a937*", ATTR{queue/add_random}="0" # Spread CPU load by redirecting completions to originating CPU ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{queue/rq_affinity}="2" ACTION=="add|change", KERNEL=="dm-[0-9]*", SUBSYSTEM=="block", ENV{DM_NAME}=="3624a937*", ATTR{queue/rq_affinity}="2" # Set the HBA timeout to 60 seconds ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{device/timeout}="60" EOF sudo cp /tmp/99-pure-storage.rules /etc/udev/rules.d/99-pure-storage.rules sudo /sbin/udevadm control --reload-rules sudo /sbin/udevadm trigger --type=devices --action=change ExtraDeployment: type: OS::Heat::SoftwareDeploymentGroup properties: servers: {get_param: servers} config: {get_resource: PureSetup} actions: [CREATE,UPDATE]