The procedure below has been used to create a 3-node OPNFV install using Intel NUC i7 nodes with 16GB RAM, 250MB SSD, and 1 TB HDD. The install uses one NUC for the Jumphost, and one each for the controller (OpenStack + ODL) and the compute nodes. ==== Jumphost Installation and OPNFV Deployment ==== * Includes instructions from http://artifacts.opnfv.org/genesis/foreman/docs/installation-instructions.html * install Centos 7 x86_64 minimal server: CentOS-7-x86_64-Minimal-1503-01.iso * during install, add user opnfv * once active, login to opnfv account from console ip addr * note IP address of enp0s25 - will set it in ifcfg-enp0s25 per the notes below * add opnfv account to sudoers after "root ALL=(ALL) ALL" su visudo opnfv ALL=(ALL) ALL * update sudo yum -y update * reboot and select updated kernel so correct kernel headers can be obtained in virtualbox setup sudo shutdown -r 0 * Select boot option: CentOS Linux (3.10.0-229.14.1.e17.x86_64) 7 (Core) * configure hostname sudo vi /etc/hostname jumphost1.opnfv.org * Disable NetworkManager sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager * configure single NIC as static per IP assigned during install sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s25 TYPE="Ethernet" BOOTPROTO="static" IPADDR=192.168.1.201 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 NM_CONTROLLED="no" (rest as-is) * Restart networking sudo service network restart sudo setenforce 0 * Edit /etc/resolv.conf and add a nameserver sudo vi /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 * Disable selinux: sudo setenforce 0 sudo sed -i 's/SELINUX=.*/SELINUX=permissive/' /etc/selinux/config * Disable firewalld: sudo systemctl stop firewalld sudo systemctl disable firewalld * install and start ntp sudo yum -y install ntp sudo systemctl start ntpd date * verify time is correct * Set NUCs to PXE boot on wake-on-lan * https://help.ubuntu.com/community/WakeOnLan * In BIOS options (F2), Power tab, set "Wake on LAN from S4/S5" to "Power On - PXE Boot" and save (F10) * Boot NUCs and note MAC addresses, so they can be included in the wakenodes.sh script referenced below * install ether-wake if needed to test of wakenodes.sh sudo yum -y install net-tools * install git sudo yum -y install git cd ~ * clone genesis git clone https://blsaws@gerrit.opnfv.org/gerrit/genesis * (for testing, downloaded trozet's patch fork snapshot from https://gerrit.opnfv.org/gerrit/gitweb?p=genesis.git;a=commit;h=756ee8c81cfac9a69e8f67811429e63da9af6480 curl "https://gerrit.opnfv.org/gerrit/gitweb?p=genesis.git;a=snapshot;h=756ee8c81cfac9a69e8f67811429e63da9af6480;sf=tgz" -o genesis-756ee8c.tar.gz gzip -d genesis-756ee8c.tar.gz tar -xvf genesis-756ee8c.tar * modify to clone khaleesi from my fork (trozet=>blsaws) per the patches below * note: if you want to use the wakenodes.sh script, you will need to fork my repo and mod wakenodes.sh for your MACs vi ~/genesis-756ee8c/foreman/ci/bootstrap.sh if ! git clone -b opnfv https://github.com/blsaws/khaleesi.git; then * modify ~/genesis-756ee8c/foreman/ci/opnfv_ksgen_settings_no_HA.yml for my specific config vi ~/genesis-756ee8c/foreman/ci/opnfv_ksgen_settings_no_HA.yml # Jumphost1: # (for compute1:) name: oscompute1.{{ domain_name }} hostname: oscompute1.{{ domain_name }} short_name: oscompute1 mac_address: "" # (for controller1:) name: oscontroller1.{{ domain_name }} hostname: oscontroller1.{{ domain_name }} short_name: oscontroller1 mac_address: "" private_mac: "" # Jumphost2: # (for compute1:) name: oscompute1.{{ domain_name }} hostname: oscompute1.{{ domain_name }} short_name: oscompute1 mac_address: "" # (for controller1:) name: oscontroller1.{{ domain_name }} hostname: oscontroller1.{{ domain_name }} short_name: oscontroller1 mac_address: "" private_mac: "" * clone my fork of trozet's khaleesi, updated with patches * it will later be cloned by the foreman vm, so these patches will be available in the foreman vm cd /opt sudo git clone -b opnfv https://github.com/blsaws/khaleesi.git * during initial debugging, the patches were manually created as below; later they were pulled from the repo fork after being committed * patch 1: add wakenodes.sh to root of khaleesi repo * alternative is to manually power-on the nodes, which will go into PXE-boot mode sudo vi /opt/khaleesi/wakenodes.sh # !/bin/bash yum -y install net-tools ether-wake ether-wake * During initial debugging wakenodes.sh was copied to the shared folder for the foreman vm and later copied to the root of the cloned repo in the foreman vm. * (in jumphost) sudo cp /opt/khaleesi/wakenodes.sh /var/opt/opnfv/foreman_vm * (after foreman vm is up) * su; cd /var/opt/opnfv/foreman_vm; vagrant ssh; cp /vagrant/wakenodes.sh /opt/khaleesi/wakenodes.sh * patch 2: in main.yml add call to wakenodes.sh script as shown in http://docs.ansible.com/ansible/script_module.html * In khaleesi/roles/get_nodes/foreman/tasks/main.yml add call to node wakeup script after block "- name: Provision nodes" sudo vi /opt/khaleesi/roles/get_nodes/foreman/tasks/main.yml - script: /opt/khaleesi/wakenodes.sh * During initial debugging main.yml was copied to the shared folder for the foreman vm and later copied to the cloned repo in the foreman vm. * (in jumphost) sudo cp /opt/khaleesi/roles/get_nodes/foreman/tasks/main.yml /var/opt/opnfv/foreman_vm/main.yml * (after foreman vm is up) * su; cd /var/opt/opnfv/foreman_vm; vagrant ssh; cp /vagrant/main.yml /opt/khaleesi/roles/get_nodes/foreman/tasks/main.yml * patch 3: in foreman.py skip IPMI related code in node bringup * In khaleesi/library/foreman.py exit early to avoid IPMI code * change "elif ipmi_host is None:" to "if ipmi_host is None:" and add module.exit before i sudo vi /opt/khaleesi/library/foreman.py # bryan_att modified to skip IPMI stuff module.exit_json(changed=True, msg="Rebuilding Node") # change elif to if so the module.exit is outside the previous if block if ipmi_host is None: * During initial debugging foreman.py was copied to the shared folder and then to the foreman VM as above. * (in jumphost) sudo cp /opt/khaleesi/library/foreman.py /var/opt/opnfv/foreman_vm/ * (after foreman vm is up) * su; cd /var/opt/opnfv/foreman_vm; vagrant ssh; cp /vagrant/foreman.py /opt/khaleesi/library/foreman.py * kickoff deploy.sh cd ~/genesis-756ee8c/foreman/ci/ sudo ./deploy.sh -single_baremetal_nic enp0s25 -base_config /home/opnfv/genesis-756ee8c/foreman/ci/opnfv_ksgen_settings_no_HA.yml * if errors, before retrying wipe using clean.sh or su cd /var/opt/opnfv/foreman_vm vagrant destroy -f cd - rm -rf /var/opt/opnfv exit rm /home/opnfv/.ssh/known_hosts * when you see "PASSED", login to controller node and setup bridge to external network for VMs (manual tasks needed for non-HA single NIC installs. for HA single-NIC installs this is handled already). vi /etc/neutron/plugin.ini # add to end [ovs] bridge_mappings = physnet1:br-ex # comment out "flat_networks =*" and add under it flat_networks = physnet1 * Restart Neutron openstack-service restart neutron * Create /etc/sysconfig/network-scripts/ifcfg-br-ex with https://github.com/trozet/puppet-trystack/blob/quickstack/templates/br_ex.erb as template. * Note: the following assumes that Foreman assigned IP 192.168.1.204 to controller1. If different, use the IP assigned for the system you are installing, here and below. vi /etc/sysconfig/network-scripts/ifcfg-br-ex DEVICE=br-ex DEVICETYPE=ovs IPADDR=192.168.1.204 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 BOOTPROTO=static ONBOOT=yes TYPE=OVSBridge PROMISC=yes PEERDNS=no * Verify ovs is setup correctly [root@oscontroller1 ~]# ovs-vsctl show 22ba4760-889c-4341-b8d6-445c53ac5aaa Manager "tcp:192.168.1.204:6640" is_connected: true Bridge br-ex Controller "tcp:192.168.1.204:6633" is_connected: true Port "enp0s25" Interface "enp0s25" Port br-ex Interface br-ex type: internal Bridge br-int Controller "tcp:192.168.1.204:6633" is_connected: true fail_mode: secure Port br-int Interface br-int ovs_version: "2.3.1" * Modify /etc/sysconfig/network-scripts/ifcfg-enp0s25 vi /etc/sysconfig/network-scripts/ifcfg-enp0s25 NAME="enp0s25" DEVICE="enp0s25" ONBOOT=yes NETBOOT=yes (leave UUID line as is, replace rest with the below) BOOTPROTO=static TYPE=OVSPort OVS_BRIDGE=br-ex PROMISC=yes IPV4_FAILURE_FATAL=no PEERDNS=no PEERROUTES=yes * Restart networking systemctl restart network * On the jumphost, from Horizon / Project / Compute / Access & Security / API Access select "Download OpenStack RC file, transfer to the controller root home directory, then execute it. vi admin-openrc.sh (paste contents) source admin-openrc.sh * Create external network and subnet using Neutron CLI neutron net-create external1 -- --router:external=true --provider:network_type=flat --provider:physical_network=physnet1 Created a new network: +---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | True | | id | d7868a94-47ec-4ec7-93cc-645d3bc45898 | | name | external1 | | provider:network_type | flat | | provider:physical_network | physnet1 | | provider:segmentation_id | | | router:external | True | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | c3b15e900f0f4c7ab01576bb28d34f10 | +---------------------------+--------------------------------------+ neutron subnet-create --disable-dhcp external1 192.168.1.0/24 Created a new subnet: +-------------------+--------------------------------------------------+ | Field | Value | +-------------------+--------------------------------------------------+ | allocation_pools | {"start": "192.168.1.2", "end": "192.168.1.254"} | | cidr | 192.168.1.0/24 | | dns_nameservers | | | enable_dhcp | False | | gateway_ip | 192.168.1.1 | | host_routes | | | id | 2a6a6be2-2ea2-4a38-84cd-3a2e9e3197e8 | | ip_version | 4 | | ipv6_address_mode | | | ipv6_ra_mode | | | name | | | network_id | d7868a94-47ec-4ec7-93cc-645d3bc45898 | | tenant_id | c3b15e900f0f4c7ab01576bb28d34f10 | +-------------------+--------------------------------------------------+ ===== What install success looks like ===== * when the process has finished, succcess is indicated by this type of information in the jumphost terminal (the details e.g. addresses shown here may vary from that above... sometimes installs resulted in different assigned addresses) ==> default: ==> default: TASK: [get_nodes/foreman | make a list] *************************************** ==> default: [[ previous task time: 0:00:00.015421 = 0.02s / 1597.81s ]] ==> default: ok: [localhost] ==> default: ==> default: TASK: [get_nodes/foreman | debug var=nodes_list] ****************************** ==> default: [[ previous task time: 0:00:00.008785 = 0.01s / 1597.81s ]] ==> default: ok: [localhost] => { ==> default: "var": { ==> default: "nodes_list": [ ==> default: "oscontroller1.opnfv.com", ==> default: "oscompute1.opnfv.com" ==> default: ] ==> default: } ==> default: } ==> default: ==> default: TASK: [get_nodes/foreman | Wait for puppet to complete] *********************** ==> default: [[ previous task time: 0:00:00.008461 = 0.01s / 1597.82s ]] ==> default: changed: [localhost] ==> default: ==> default: msg: ==> default: Nodes are Active ==> default: ==> default: TASK: [get_nodes/foreman | Print host openstack network type (nova/neutron)] *** ==> default: [[ previous task time: 0:12:01.201807 = 721.20s / 2319.02s ]] ==> default: ok: [localhost] => { ==> default: "var": { ==> default: "provisioner.network.type": "nova" ==> default: } ==> default: } ==> default: ==> default: TASK: [get_nodes/foreman | debug var=nodes_created] *************************** ==> default: [[ previous task time: 0:00:00.010205 = 0.01s / 2319.03s ]] ==> default: skipping: [localhost] ==> default: ==> default: TASK: [get_nodes/foreman | debug var=hostvars] ******************************** ==> default: [[ previous task time: 0:00:00.023453 = 0.02s / 2319.06s ]] ==> default: skipping: [localhost] ==> default: ==> default: PLAY RECAP ******************************************************************** ==> default: localhost : ok=60 changed=41 unreachable=0 failed=0 ==> default: [[ previous task time: 0:00:00.032833 = 0.03s / 2319.09s ]] ==> default: [[ previous play time: 0:26:37.803885 = 1597.80s / 2319.09s ]] ==> default: [[ previous playbook time: 0:38:39.090976 = 2319.09s / 2319.09s ]] ==> default: [[ previous total time: 0:38:39.091181 = 2319.09s / 0.00s ]] ==> default: Exit cleanup ... init.print_result ==> default: running: init.print_result ==> default: ./run.sh: PASSED ==> default: Running provisioner: shell... default: Running: /tmp/vagrant-shell20150920-11687-22sn6.sh ==> default: Resizing physical volume ==> default: Physical volume "/dev/sda2" changed ==> default: 1 physical volume(s) resized / 0 physical volume(s) not resized ==> default: New physical volume size: 39 ==> default: Resizing logical volume ==> default: Extending logical volume root to 38.48 GiB ==> default: Logical volume root successfully resized ==> default: Filesystem resized to: 39G Foreman VM is up! [opnfv@jumphost2 ci]$