Browse Source

Initial commit

Jan Sušnik 7 years ago
commit
57218694fd
3 changed files with 867 additions and 0 deletions
  1. 402 0
      README.md
  2. 222 0
      packstack_ironic_ipmi.txt
  3. 243 0
      packstack_ironic_vbox.txt

File diff suppressed because it is too large
+ 402 - 0
README.md


+ 222 - 0
packstack_ironic_ipmi.txt

@@ -0,0 +1,222 @@
+# Base Install
+sudo yum install -y git
+git clone https://git.susnik.work/jan/packstack_ironic_ocata.git
+cd packstack_ironic_ocata
+sudo bash run_setup.sh ironic eno2
+
+# Source OpenStack credentials
+. keystonerc_admin
+
+NODE_HOSTNAME="baremetal"
+ironic node-create -n "$NODE_HOSTNAME" -d pxe_ipmitool -i ipmi_address='10.0.0.2' -i ipmi_username='user' -i ipmi_password='password'
+ironic node-update a378e5f9-8e44-44ae-9ba1-1f5b973a6b36 add driver_info/ipmi_protocol_version='1.5'
+ironic port-create -n a378e5f9-8e44-44ae-9ba1-1f5b973a6b36 -a 00:12:34:56:78:90
+# Check if connection to machine works
+ironic node-set-power-state baremetal on
+# Check if machine was successfully powered on
+ipmipower -h 10.0.0.2 -u root -p ironic --stat
+# When you'll be sure connection works as expected
+ironic node-set-power-state baremetal off
+
+# Create TFTP directory and place all required files into it
+# https://docs.openstack.org/project-install-guide/baremetal/draft/setup-drivers.html
+mkdir -p /tftpboot
+chown -R ironic /tftpboot
+yum install -y tftp-server syslinux-tftpboot xinetd
+
+# Edit file /etc/xinetd.d/tftp and replace it's service contents with
+service tftp
+{
+  protocol        = udp
+  port            = 69
+  socket_type     = dgram
+  wait            = yes
+  user            = root
+  server          = /usr/sbin/in.tftpd
+  server_args     = -v -v -v -v -v --map-file /tftpboot/map-file /tftpboot
+  disable         = no
+  # This is a workaround for Fedora, where TFTP will listen only on
+  # IPv6 endpoint, if IPv4 flag is not used.
+  flags           = IPv4
+}
+
+systemctl restart xinetd
+cp /usr/share/syslinux/{pxelinux.0,chain.c32} /tftpboot/
+echo 're ^(/tftpboot/) /tftpboot/\2' > /tftpboot/map-file
+echo 're ^/tftpboot/ /tftpboot/' >> /tftpboot/map-file
+echo 're ^(^/) /tftpboot/\1' >> /tftpboot/map-file
+echo 're ^([^/]) /tftpboot/\1' >> /tftpboot/map-file
+chcon -R -t tftpdir_rw_t /tftpboot
+
+# Enable web console - works only with IPMI 2.0
+yum install -y epel-release
+yum --enablerepo=epel install -y shellinabox
+
+# Uncomment following lines in /etc/ironic/ironic.conf for TFTP/PXE ...
+# my_ip = 10.0.0.1
+# tftp_server = $my_ip
+# tftp_root = /tftpboot
+# pxe_bootfile_name = pxelinux.0
+
+# ... and change following line to:
+# pxe_append_params = nofb nomodeset vga=normal console=tty0 console=ttyS0,115200n8
+
+systemctl restart openstack-ironic-conductor
+
+# Update node to support web console
+ironic node-update a378e5f9-8e44-44ae-9ba1-1f5b973a6b36 add driver_info/ipmi_terminal_port=8023
+ironic node-set-console-mode a378e5f9-8e44-44ae-9ba1-1f5b973a6b36 true
+
+# Configure Ironic
+# https://docs.openstack.org/developer/openstack-ansible-os_ironic/ocata/configure-ironic.html
+
+neutron net-create ironic-net --shared --provider:network_type flat --provider:physical_network physnet1
+neutron subnet-create ironic-net 10.1.2.176/28 --name ironic-subnet --ip-version=4 --allocation-pool start=10.1.2.178,end=10.1.2.190 --gateway 10.1.2.1 --enable-dhcp --dns-nameservers list=true 8.8.4.4 8.8.8.8
+
+# Change /etc/neutron/plugins/ml2/ml2_conf.ini to ...
+# [ml2_type_vlan]
+# network_vlan_ranges = physnet1
+
+systemctl restart neutron-{openvswitch-agent,server}
+
+# We also need to update cleaning network in /etc/ironic/ironic.conf now
+# cleaning_network = ironic-net
+
+systemctl restart openstack-ironic-conductor
+
+# https://docs.openstack.org/developer/diskimage-builder/user_guide/installation.html
+yum install -y python-pip
+pip install --upgrade pip
+pip install diskimage-builder
+
+# Generate disk image for booting on node
+IMAGE_NAME="fedora"
+mkdir "$IMAGE_NAME" && cd "$IMAGE_NAME"
+disk-image-create fedora iso -o "$IMAGE_NAME" ironic-agent
+glance image-create --name "${IMAGE_NAME}.kernel" --visibility public --disk-format aki --property hypervisor_type=baremetal --protected=True --container-format aki < "${IMAGE_NAME}.kernel"
+glance image-create --name "${IMAGE_NAME}.initramfs" --visibility public --disk-format ari --property hypervisor_type=baremetal --protected=True --container-format ari < "${IMAGE_NAME}.initramfs"
+IMAGE_SOURCE=$(openstack image create "$IMAGE_NAME" --public --disk-format=iso --container-format=bare < "${IMAGE_NAME}.iso" -f value -c id)
+
+# Create flavor
+FLAVOR_NAME="$IMAGE_NAME"
+FLAVOR_ID=auto
+FLAVOR_RAM=8192
+FLAVOR_DISK=230
+FLAVOR_CPU=4
+nova flavor-create ${FLAVOR_NAME} ${FLAVOR_ID} ${FLAVOR_RAM} ${FLAVOR_DISK} ${FLAVOR_CPU}
+nova flavor-key ${FLAVOR_NAME} set cpu_arch=x86_64
+nova flavor-key ${FLAVOR_NAME} set capabilities:boot_option="local"
+
+# Update node info
+KERNEL_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.kernel/ {print \$2}")
+INITRAMFS_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.initramfs/ {print \$2}")
+ROOT_DISK_SIZE_GB="$FLAVOR_DISK"
+ironic node-update "$NODE_HOSTNAME" add \
+    driver_info/deploy_kernel=$KERNEL_IMAGE \
+    driver_info/deploy_ramdisk=$INITRAMFS_IMAGE \
+    instance_info/kernel=$KERNEL_IMAGE \
+    instance_info/ramdisk=$INITRAMFS_IMAGE \
+    instance_info/root_gb=${ROOT_DISK_SIZE_GB} \
+    instance_info/image_source=${IMAGE_SOURCE}
+ironic node-update "$NODE_HOSTNAME" add \
+    properties/cpus="$FLAVOR_CPU" \
+    properties/memory_mb="$FLAVOR_RAM" \
+    properties/local_gb="$ROOT_DISK_SIZE_GB" \
+    properties/size=3600 \
+    properties/cpu_arch=x86_64 \
+    properties/capabilities=memory_mb:"$FLAVOR_RAM",local_gb:"$ROOT_DISK_SIZE_GB",cpu_arch:x86_64,cpus:"$FLAVOR_CPU",boot_option:local
+
+# Add SSH keypair
+nova keypair-add --pub-key ~/.ssh/id_rsa.pub admin
+
+# Check if keystone authentication config in /etc/nova/nova.conf is correct or change part with all values below (those values are usually already written at the end of config block, but are most probably wrong - that's why openstack-nova-compute service is inactive)
+# [ironic]
+# username=ironic
+# password=<ironic-password>
+# auth_plugin=password
+# admin_username=ironic
+# admin_password=<ironic-password>
+# admin_url=http://127.0.0.1:35357/
+# admin_tenant_name=services
+
+# Restart Nova Compute to apply changed config
+systemctl restart openstack-nova-compute
+
+# Make sure we have available hosts
+nova-manage cell_v2 discover_hosts
+
+# Make services available to Ironic network
+iptables -I INPUT -p udp --dport 67 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p udp --dport 69 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p tcp --dport 3260 -s 10.1.2.0/24 -j ACCEPT
+service iptables save
+service iptables restart
+
+# Boot node with generated image
+nova boot --flavor "$FLAVOR_NAME" --image "$IMAGE_NAME" --key-name admin "$NODE_HOSTNAME" --nic net-name=ironic-net
+
+# (Warning: Don't perform this step until you tried to boot node!) In case that status of node is Error, we need to change RAM allocation value to a bit more then currently (usually this is 1.0), so we open /etc/nova/nova.conf and set
+# ram_allocation_ratio=3.0
+
+# And restart Nova Compute & Nova Conductor to apply changes
+systemctl restart openstack-nova-{compute,conductor}
+
+#############################
+
+#echo 'linux-image-generic-lts-xenial:' > /usr/share/diskimage-builder/elements/ubuntu/package-installs.yaml
+echo 'linux-image-generic-lts-xenial:' > /usr/lib/python2.7/site-packages/diskimage_builder/elements/ubuntu/package-installs.yaml
+IMAGE_NAME=ubuntu-xenial
+disk-image-create ironic-agent ubuntu -o ${IMAGE_NAME}
+glance image-create --name ${IMAGE_NAME}.kernel --visibility public --disk-format aki --container-format aki < ${IMAGE_NAME}.kernel
+glance image-create --name ${IMAGE_NAME}.initramfs --visibility public --disk-format ari --container-format ari < ${IMAGE_NAME}.initramfs
+pip install tripleo-image-elements
+export ELEMENTS_PATH=/usr/share/tripleo-image-elements
+disk-image-create ubuntu baremetal localboot local-config dhcp-all-interfaces grub2 -o ${IMAGE_NAME}
+VMLINUZ_UUID="$(glance image-create --name ${IMAGE_NAME}.vmlinuz --visibility public --disk-format aki --container-format aki  < ${IMAGE_NAME}.vmlinuz | awk '/\| id/ {print $4}')"
+INITRD_UUID="$(glance image-create --name ${IMAGE_NAME}.initrd --visibility public --disk-format ari --container-format ari  < ${IMAGE_NAME}.initrd | awk '/\| id/ {print $4}')"
+glance image-create --name ${IMAGE_NAME} --visibility public --disk-format qcow2 --container-format bare --property kernel_id=${VMLINUZ_UUID} --property ramdisk_id=${INITRD_UUID} < ${IMAGE_NAME}.qcow2
+
+FLAVOR_NAME="$IMAGE_NAME"
+FLAVOR_ID=auto
+FLAVOR_RAM=1512
+FLAVOR_DISK=5
+FLAVOR_CPU=1
+nova flavor-create ${FLAVOR_NAME} ${FLAVOR_ID} ${FLAVOR_RAM} ${FLAVOR_DISK} ${FLAVOR_CPU}
+nova flavor-key ${FLAVOR_NAME} set cpu_arch=x86_64
+nova flavor-key ${FLAVOR_NAME} set capabilities:boot_option="local"
+
+NODE_HOSTNAME="baremetal"
+KERNEL_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.kernel/ {print \$2}")
+INITRAMFS_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.initramfs/ {print \$2}")
+ROOT_DISK_SIZE_GB="$FLAVOR_DISK"
+ironic node-update "$NODE_HOSTNAME" add \
+    driver_info/kernel=$KERNEL_IMAGE \
+    driver_info/ramdisk=$INITRAMFS_IMAGE \
+    instance_info/kernel=$KERNEL_IMAGE \
+    instance_info/ramdisk=$INITRAMFS_IMAGE \
+    instance_info/root_gb=${ROOT_DISK_SIZE_GB} \
+    instance_info/image_source=${IMAGE_NAME}
+ironic node-update "$NODE_HOSTNAME" add \
+    properties/cpus="$FLAVOR_CPU" \
+    properties/memory_mb="$FLAVOR_RAM" \
+    properties/local_gb="$ROOT_DISK_SIZE_GB" \
+    properties/size=3600 \
+    properties/cpu_arch=x86_64 \
+    properties/capabilities=memory_mb:"$FLAVOR_RAM",local_gb:"$ROOT_DISK_SIZE_GB",cpu_arch:x86_64,cpus:"$FLAVOR_CPU",boot_option:local
+
+nova keypair-add --pub-key ~/.ssh/id_rsa.pub admin
+
+# change username & password + ram allocation to 3.0 for [ironic] in /etc/nova/nova.conf
+nova-manage cell_v2 discover_hosts
+chcon -R -t tftpdir_rw_t /tftpboot
+iptables -I INPUT -p udp --dport 67 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p udp --dport 69 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p tcp --dport 3260 -s 10.1.2.0/24 -j ACCEPT
+service iptables save
+service iptables restart
+
+# nova compute install + systemctl enable openstack-nova-compute + api in nova/nova.conf for ironic, cleaning net ironic, chcon /tftpboot, iptables dhcp + tftp
+nova boot --flavor ${FLAVOR_NAME} --image ${IMAGE_NAME} --key-name admin ${NODE_HOSTNAME} --nic net-name=ironic-net
+
+# nova boot --flavor ubuntu-xenial --image ubuntu-xenial --key-name admin baremetal --nic net-name=ironic-net
+# dnsmasq with --no-daemon && without bind-interfaces

+ 243 - 0
packstack_ironic_vbox.txt

@@ -0,0 +1,243 @@
+# Base Install
+sudo yum install -y git
+git clone https://git.susnik.work/jan/packstack_ironic_ocata.git
+cd packstack_ironic_ocata
+sudo bash run_setup.sh ironic enp0s8
+
+# Ironic + VirtualBox (pxe_vbox is not supported anymore as of OpenStack Ocata release)
+
+# On VBox node:
+VBoxManage setproperty websrvauthlibrary null
+vboxwebsrv --host 172.16.1.5 --port 1234
+
+# For Newton:
+yum -y install https://rdo.fedorapeople.org/rdo-release.rpm
+yum -y install git python-setuptools
+yum -y update
+yum install -y python-crypto python-devel libffi-devel openssl-devel gcc-c++
+pip install docutils pbr pyopenssl pyyaml
+
+yum install -y python-pip
+pip install --upgrade pip
+pip install pyremotevbox
+ironic node-create -n baremetal -d pxe_vbox -i virtualbox_host=172.16.1.5 -i virtualbox_port=1234 -i virtualbox_vmname=baremetal
+####
+
+# Edit /etc/ironic/ironic.conf and change ...
+# enabled_drivers = pxe_ssh
+systemctl restart openstack-ironic-conductor
+
+. keystonerc_admin
+
+NODE_HOSTNAME="baremetal"
+ironic node-create -n "$NODE_HOSTNAME" -d pxe_ssh -i ssh_address=172.16.1.5 -i ssh_username=jan -i ssh_virt_type=vbox -i ssh_key_contents="$(cat private.key)"
+ironic port-create -n 95a45f0a-f8f3-4080-a06d-c46d89640ed0 -a 00:12:34:56:78:90
+# Check if connection to VirtualBox works
+ironic node-set-power-state baremetal on
+# When you'll prompted for boot image click Cancel and afterwards stop ironic node
+ironic node-set-power-state baremetal off
+
+# Create TFTP directory and place all required files into it
+# https://docs.openstack.org/project-install-guide/baremetal/draft/setup-drivers.html
+mkdir -p /tftpboot
+chown -R ironic /tftpboot
+yum install -y tftp-server syslinux-tftpboot xinetd
+
+# Edit file /etc/xinetd.d/tftp and replace it's service contents with
+service tftp
+{
+  protocol        = udp
+  port            = 69
+  socket_type     = dgram
+  wait            = yes
+  user            = root
+  server          = /usr/sbin/in.tftpd
+  server_args     = -v -v -v -v -v --map-file /tftpboot/map-file /tftpboot
+  disable         = no
+  # This is a workaround for Fedora, where TFTP will listen only on
+  # IPv6 endpoint, if IPv4 flag is not used.
+  flags           = IPv4
+}
+
+systemctl restart xinetd
+cp /usr/share/syslinux/{pxelinux.0,chain.c32} /tftpboot/
+echo 're ^(/tftpboot/) /tftpboot/\2' > /tftpboot/map-file
+echo 're ^/tftpboot/ /tftpboot/' >> /tftpboot/map-file
+echo 're ^(^/) /tftpboot/\1' >> /tftpboot/map-file
+echo 're ^([^/]) /tftpboot/\1' >> /tftpboot/map-file
+chcon -R -t tftpdir_rw_t /tftpboot
+
+# Enable web console
+yum install -y epel-release
+yum install -y shellinabox
+
+# Uncomment following lines in /etc/ironic/ironic.conf for TFTP/PXE ...
+# tftp_server = $my_ip
+# tftp_root = /tftpboot
+# pxe_bootfile_name = pxelinux.0
+
+# ... and change following line to:
+# pxe_append_params = nofb nomodeset vga=normal console=tty0 console=ttyS0,115200n8
+
+systemctl restart openstack-ironic-conductor
+
+# Update node to support web console
+ironic node-update 95a45f0a-f8f3-4080-a06d-c46d89640ed0 add driver_info/ssh_terminal_port=8023
+ironic node-set-console-mode 95a45f0a-f8f3-4080-a06d-c46d89640ed0 true
+
+# Configure Ironic
+# https://docs.openstack.org/developer/openstack-ansible-os_ironic/ocata/configure-ironic.html
+
+neutron net-create ironic-net --shared --provider:network_type flat --provider:physical_network physnet1
+neutron subnet-create ironic-net 172.16.1.176/28 --name ironic-subnet --ip-version=4 --allocation-pool start=172.16.1.178,end=172.16.1.190 --gateway 172.16.1.50 --enable-dhcp --dns-nameservers list=true 8.8.4.4 8.8.8.8
+
+# SET GATEWAY TO 10.1.2.1 !!!
+# neutron subnet-create ironic-net 10.1.2.176/28 --name ironic-subnet --ip-version=4 --allocation-pool start=10.1.2.178,end=10.1.2.190 --gateway 10.1.2.1 --enable-dhcp --dns-nameservers list=true 8.8.4.4 8.8.8.8
+
+# Change /etc/neutron/plugins/ml2/ml2_conf.ini to ...
+# [ml2_type_vlan]
+# network_vlan_ranges = physnet1
+
+systemctl restart neutron-{openvswitch-agent,server}
+
+# We also need to update cleaning network in /etc/ironic/ironic.conf now
+# cleaning_network = ironic-net
+
+systemctl restart openstack-ironic-conductor
+
+# https://docs.openstack.org/developer/diskimage-builder/user_guide/installation.html
+yum install -y python-pip
+pip install --upgrade pip
+pip install diskimage-builder
+
+# Generate disk image for booting on node
+IMAGE_NAME="fedora"
+mkdir "$IMAGE_NAME" && cd "$IMAGE_NAME"
+disk-image-create fedora iso -o "$IMAGE_NAME" ironic-agent
+glance image-create --name "${IMAGE_NAME}.kernel" --visibility public --disk-format aki --property hypervisor_type=baremetal --protected=True --container-format aki < "${IMAGE_NAME}.kernel"
+glance image-create --name "${IMAGE_NAME}.initramfs" --visibility public --disk-format ari --property hypervisor_type=baremetal --protected=True --container-format ari < "${IMAGE_NAME}.initramfs"
+IMAGE_SOURCE=$(openstack image create "$IMAGE_NAME" --public --disk-format=iso --container-format=bare < "${IMAGE_NAME}.iso" -f value -c id)
+
+# Create flavor
+FLAVOR_NAME="$IMAGE_NAME"
+FLAVOR_ID=auto
+FLAVOR_RAM=2048
+FLAVOR_DISK=10
+FLAVOR_CPU=1
+nova flavor-create ${FLAVOR_NAME} ${FLAVOR_ID} ${FLAVOR_RAM} ${FLAVOR_DISK} ${FLAVOR_CPU}
+nova flavor-key ${FLAVOR_NAME} set cpu_arch=x86_64
+nova flavor-key ${FLAVOR_NAME} set capabilities:boot_option="local"
+
+# Update node info
+KERNEL_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.kernel/ {print \$2}")
+INITRAMFS_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.initramfs/ {print \$2}")
+ROOT_DISK_SIZE_GB="$FLAVOR_DISK"
+ironic node-update "$NODE_HOSTNAME" add \
+    driver_info/deploy_kernel=$KERNEL_IMAGE \
+    driver_info/deploy_ramdisk=$INITRAMFS_IMAGE \
+    instance_info/kernel=$KERNEL_IMAGE \
+    instance_info/ramdisk=$INITRAMFS_IMAGE \
+    instance_info/root_gb=${ROOT_DISK_SIZE_GB} \
+    instance_info/image_source=${IMAGE_SOURCE}
+ironic node-update "$NODE_HOSTNAME" add \
+    properties/cpus="$FLAVOR_CPU" \
+    properties/memory_mb="$FLAVOR_RAM" \
+    properties/local_gb="$ROOT_DISK_SIZE_GB" \
+    properties/size=3600 \
+    properties/cpu_arch=x86_64 \
+    properties/capabilities=memory_mb:"$FLAVOR_RAM",local_gb:"$ROOT_DISK_SIZE_GB",cpu_arch:x86_64,cpus:"$FLAVOR_CPU",boot_option:local
+
+# Add SSH keypair
+nova keypair-add --pub-key ~/.ssh/id_rsa.pub admin
+
+# Check if keystone authentication config in /etc/nova/nova.conf is correct or change part with all values below (those values are usually already written at the end of config block, but are most probably wrong - that's why openstack-nova-compute service is inactive)
+# [ironic]
+# username=ironic
+# password=<ironic-password>
+# auth_plugin=password
+# admin_username=ironic
+# admin_password=<ironic-password>
+# admin_url=http://127.0.0.1:35357/
+# admin_tenant_name=services
+
+# Restart Nova Compute to apply changed config
+systemctl restart openstack-nova-compute
+
+# Make sure we have available hosts
+nova-manage cell_v2 discover_hosts
+
+# Make services available to Ironic network
+iptables -I INPUT -p udp --dport 67 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p udp --dport 69 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p tcp --dport 3260 -s 10.1.2.0/24 -j ACCEPT
+service iptables save
+service iptables restart
+
+# Boot node with generated image
+nova boot --flavor "$FLAVOR_NAME" --image "$IMAGE_NAME" --key-name admin "$NODE_HOSTNAME" --nic net-name=ironic-net
+
+# (Warning: Don't perform this step until you tried to boot node!) In case that status of node is Error, we need to change RAM allocation value to a bit more then currently (usually this is 1.0), so we open /etc/nova/nova.conf and set
+# ram_allocation_ratio=3.0
+
+# And restart Nova Compute & Nova Conductor to apply changes
+systemctl restart openstack-nova-{compute,conductor}
+
+#############################
+
+#echo 'linux-image-generic-lts-xenial:' > /usr/share/diskimage-builder/elements/ubuntu/package-installs.yaml
+echo 'linux-image-generic-lts-xenial:' > /usr/lib/python2.7/site-packages/diskimage_builder/elements/ubuntu/package-installs.yaml
+IMAGE_NAME=ubuntu-xenial
+disk-image-create ironic-agent ubuntu -o ${IMAGE_NAME}
+glance image-create --name ${IMAGE_NAME}.kernel --visibility public --disk-format aki --container-format aki < ${IMAGE_NAME}.kernel
+glance image-create --name ${IMAGE_NAME}.initramfs --visibility public --disk-format ari --container-format ari < ${IMAGE_NAME}.initramfs
+pip install tripleo-image-elements
+export ELEMENTS_PATH=/usr/share/tripleo-image-elements
+disk-image-create ubuntu baremetal localboot local-config dhcp-all-interfaces grub2 -o ${IMAGE_NAME}
+VMLINUZ_UUID="$(glance image-create --name ${IMAGE_NAME}.vmlinuz --visibility public --disk-format aki --container-format aki  < ${IMAGE_NAME}.vmlinuz | awk '/\| id/ {print $4}')"
+INITRD_UUID="$(glance image-create --name ${IMAGE_NAME}.initrd --visibility public --disk-format ari --container-format ari  < ${IMAGE_NAME}.initrd | awk '/\| id/ {print $4}')"
+glance image-create --name ${IMAGE_NAME} --visibility public --disk-format qcow2 --container-format bare --property kernel_id=${VMLINUZ_UUID} --property ramdisk_id=${INITRD_UUID} < ${IMAGE_NAME}.qcow2
+
+FLAVOR_NAME="$IMAGE_NAME"
+FLAVOR_ID=auto
+FLAVOR_RAM=1512
+FLAVOR_DISK=5
+FLAVOR_CPU=1
+nova flavor-create ${FLAVOR_NAME} ${FLAVOR_ID} ${FLAVOR_RAM} ${FLAVOR_DISK} ${FLAVOR_CPU}
+nova flavor-key ${FLAVOR_NAME} set cpu_arch=x86_64
+nova flavor-key ${FLAVOR_NAME} set capabilities:boot_option="local"
+
+NODE_HOSTNAME="baremetal"
+KERNEL_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.kernel/ {print \$2}")
+INITRAMFS_IMAGE=$(glance image-list | awk "/${IMAGE_NAME}.initramfs/ {print \$2}")
+ROOT_DISK_SIZE_GB="$FLAVOR_DISK"
+ironic node-update "$NODE_HOSTNAME" add \
+    driver_info/kernel=$KERNEL_IMAGE \
+    driver_info/ramdisk=$INITRAMFS_IMAGE \
+    instance_info/kernel=$KERNEL_IMAGE \
+    instance_info/ramdisk=$INITRAMFS_IMAGE \
+    instance_info/root_gb=${ROOT_DISK_SIZE_GB} \
+    instance_info/image_source=${IMAGE_NAME}
+ironic node-update "$NODE_HOSTNAME" add \
+    properties/cpus="$FLAVOR_CPU" \
+    properties/memory_mb="$FLAVOR_RAM" \
+    properties/local_gb="$ROOT_DISK_SIZE_GB" \
+    properties/size=3600 \
+    properties/cpu_arch=x86_64 \
+    properties/capabilities=memory_mb:"$FLAVOR_RAM",local_gb:"$ROOT_DISK_SIZE_GB",cpu_arch:x86_64,cpus:"$FLAVOR_CPU",boot_option:local
+
+nova keypair-add --pub-key ~/.ssh/id_rsa.pub admin
+
+# change username & password + ram allocation to 3.0 for [ironic] in /etc/nova/nova.conf
+nova-manage cell_v2 discover_hosts
+chcon -R -t tftpdir_rw_t /tftpboot
+iptables -I INPUT -p udp --dport 67 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p udp --dport 69 -s 10.1.2.0/24 -j ACCEPT
+iptables -I INPUT -p tcp --dport 3260 -s 10.1.2.0/24 -j ACCEPT
+service iptables save
+service iptables restart
+
+# nova compute install + systemctl enable openstack-nova-compute + api in nova/nova.conf for ironic, cleaning net ironic, chcon /tftpboot, iptables dhcp + tftp
+nova boot --flavor ${FLAVOR_NAME} --image ${IMAGE_NAME} --key-name admin ${NODE_HOSTNAME} --nic net-name=ironic-net
+
+# nova boot --flavor ubuntu-xenial --image ubuntu-xenial --key-name admin baremetal --nic net-name=ironic-net
+# dnsmasq with --no-daemon && without bind-interfaces