Getting started with DevStack as OpenStack playground environment on Ubuntu

I was recently looking to deploy a minimal installation of OpenStack to use as a development environment and to minimise the complexity of installing a complete OpenStack environment where I can build and tear down the environment with minimal effort. This is where DevStack comes into play, as to quote:

DevStack is a series of extensible scripts used to quickly bring up a complete OpenStack environment based on the latest versions of everything from git master. It is used interactively as a development environment and as the basis for much of the OpenStack project’s functional testing.

For my minimal installation of DevStack I am using new installation of Ubuntu Server 16.10 (clean installation and isolated instance recommended due to significant changes to the system). In terms of hardware configuration, the following recommendations are provided. However, this will all be dependant on your use case for DevStack and what you require to achieve and DevStack may also be installed without satisfying the below criteria but you may experience performance/stability issues.

  • Processor – at least 2 cores
  • Memory – at least 8GB
  • Hard Drive – at least 60GB

First of all we will create a user account named ‘stack’ to install DevStack and grant the user sudo privileges with the no password parameter. It is important in this step that we do not complete the installation as the root user.

sudo adduser stack 
echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Now log out as the current user and reconnect as the ‘stack’ user created in the previous step and clone the repository to the current directory, in this example i am changing the directory to ‘/var’ to create my local copy.

cd /var 
sudo git clone git://github.com/openstack-dev/devstack.git

We will now need to create a configuration file (/var/local.conf) to specify user configuration variables to use when the installation script (/var/devstack/stack.sh) is executed in a subsequent step. The installation will complete without

The below example, contains only password variables so that you are not required to input the values at installation. For a more detailed configuration file containing additional parameters, check out the sample from the respoistory.

cd /var/devstack
sudo vi local.conf 
[[local|localrc]]
ADMIN_PASSWORD=openstack
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

Once the configuration file has been created, we can now execute the installation script (stack.sh). The installation process will take approximately 15-20 minutes to complete to which will receive console output. Once the installation has completed you will receive an installation summary, URLs, accounts and passwords.

./stack.sh

Once the installation has completed successfully you should be able to browse to the Horizon dashboard and authenticate with the admin credentials configured during installation, at http://{ip address}/dashboard.

horizon-login

If you need to remove the installation of DevStack there is a script included in the repository (./clean.sh) which will remove the installation of DevStack and dependancies and then cleanup the directories touched by the installation. For a detailed list of impacted files and directories during the installation refer to this link.

cd /var/devstack
./clean.sh
rm -rf /opt/stack
rm -rf /usr/local/bin

From my initial attempt at installation, I encountered a number of issues which appear to be permission related I believe this was due to not cloning the repository as the ‘stack’ user account used for the installation. In this case, to resolve you could run the below or alternatively clean-up your installation process and repeat the installation.

sudo chown -R stack:stack /var/devstack 
sudo chmod 770 /var/devstack

Windows 10 / Cisco WebEx – Invalid input or system error. Please try again or contact your site administrator’

Recently when trying to run Cisco WebEx and join a Live Meeting on Microsoft Windows 10, I received the following error message:

Invalid input or system error. Please try again or contact your site administrator

In order to provide a workaround to the issue, I was required to run Internet Explorer 11 in Developer Mode [F12] and use document mode ‘9’ and user agent string ‘Internet Explorer 9’ in emulation, to which I was able to run Cisco WebEx and join the Live Meeting.

The cause of the issue appears to be due to the parsing of the user agent string and should be resolved in T30.1 which will fully support the Microsoft Windows 10 operating system, whilst T29.13.40 provides partial support.

Windows Server 2012 virtual machines stop responding at splash screen

I recently discovered an issue on a restart of a virtual machine running the guest operating system Windows Server 2012 where following a restart the virtual machine would stop responding at the splash screen and required a manual shutdown and power on to restart the virtual machine. From investigation is a known issue caused by the following:

Startingwith Windows 8 / Windows 2012 Server, during its boot process the operating system will reset the TSC (TimeStampCounter, which increments by 1 for each passed cycle) on CPU0. It does not reset the TSC of the other vCPUs and the resulting discrepancy between two vCPUs’ TSC can result in the OS not booting past the Windows splash screen, and a full power off and on will fix it.

There is a workaround provided until this issue is resolved which requires the virtual machine configuration file to be modified so that the TSC for all vCPUs should be reset to zero on a soft reset of the machine, and not just CPU0. In order to apply the workaround, the virtual machine will be required to be in a powered off state to add the following line to the configuration file.

monitor_control.enable_softResetClearTSC = "TRUE"

In order to apply the configuration change to a number of virtual machines, I orchestrated a number of steps in a powershell script as follows:

Firstly, I wanted to write the progress of the orchestration to both the console session and a log file, to which I have previously discussed the creation of this function here.

$LogFile = "softResetClearTSC_11022014.log"

$Path = [System.IO.Path]::Combine($env:USERPROFILE,$LogFile)
$FileMode = [System.IO.FileMode]::Append
$FileAccess = [System.IO.FileAccess]::Write
$FileShare = [IO.FileShare]::Read
$FileStream = New-Object IO.FileStream($Path, $FileMode, $FileAccess, $FileShare)
$StreamWriter = New-Object System.IO.StreamWriter($FileStream)


Function Log($Event)
{
   Write-Host $Event
   $StreamWriter.WriteLine($Event)
}

Now we will connect to the vCenter System System and retrieve a collection of virtual machines to which the configuration change will be applied.

Connect-VIServer deanvc1.dean.local 
$VMS = "deanvm1","deanvm2","deanvm3"

For each object retrieved from the collection I will orchestrate the following steps:

  • Perform a shutdown of the guest operating system (requires VMware Tools to be installed) and wait until the Power State is returned as ‘PoweredOff’.
  • Add the key value pair ‘monitor_control.enable_softResetClearTSC = “TRUE”‘ to the virtual machine configuration file.
  • Power on the virtual machine.
ForEach ($VM in $VMS) 
    { 
    Try
        { 
        Log ("" + (Get-Date -Format s) + ": INFORMATION: Preparing guest operating system for shutdown for virtual machine " + $VM + ".") 
        Shutdown-VMGuest $VM -Confirm:$False | Out-Null 
        Do 
            { 
            Start-Sleep -Seconds 5 
            } 
        Until ((Get-VM $VM).PowerState -eq "PoweredOff")
        } 
    Catch [System.Exception]
        { 
        Log ("" + (Get-Date -Format s) + ": ERROR: Failed to shutdown the virtual machine " + $VM + ".") 
        Log $Error.Exception
        $Error.Clear() 
        Break
        } 
    Log ("" + (Get-Date -Format s) + ": INFORMATION: Successfully shutdown virtual machine " + $VM + ".") 
    Try
        { 
        Log ("" + (Get-Date -Format s) + ": INFORMATION: Modifying configuration file for the virtual machine " + $VM + ".") 
        $View = Get-VM $VM | Get-View
        $Config = New-Object VMware.Vim.VirtualMachineConfigSpec
        $Config.ExtraConfig += New-Object VMware.Vim.OptionValue
        $Config.extraConfig[0].key = "monitor_control.enable_softResetClearTSC"
        $Config.extraConfig[0].value = "TRUE"
        ($View).ReconfigVM_Task($Config) | Out-Null
        } 
    Catch [System.Exception]
        {
        Log ("" + (Get-Date -Format s) + ": ERROR: Failed to modify the configuration file for the virtual machine " + $VM + ".") 
        Log $Error.Exception
        $Error.Clear() 
        Break
        }
    Log ("" + (Get-Date -Format s) + ": INFORMATION: Successfully added the key monitor_control.enable_softResetClearTSC to the virtual machine " + $VM + ".") 
    Try
        {
        Log ("" + (Get-Date -Format s) + ": INFORMATION: Powering on the virtual machine " + $VM + ".") 
        Start-VM $VM -Confirm:$False | Out-Null 
        }
    Catch [System.Exception] 
        {
        Log ("" + (Get-Date -Format s) + ": ERROR: Failed to power on the virtual machine " + $VM + ".") 
        Log $Error.Exception
        $Error.Clear() 
        Break
        }
    Log ("" + (Get-Date -Format s) + ": INFORMATION: Succesfully powered on the virtual machine " + $VM + ".") 
    } 

Finally, we will dispose of the StreamWriter and FileStream classes used for the log function to write the progress to the console session and the log file.

$StreamWriter.Dispose()
$FileStream.Dispose()

The above script can be downloaded from https://github.com/dean1609/scripts/blob/master/Set-softResetClearTSC.ps1.

Group Policy Error 0x8007000d

Recently on applying all computer group policy settings on a client, I was receiving the following error message:

 

The client-side extension could not remove computer policy settings for 'Group Policy Object Name{Unique ID}' because it failed with error code '0x8007000d The data is invalid.' See trace file for more details.

 

The cause of the error would appear to be due to a corruption in the local group policy cache and can be resolved by removing the all subfolders in the local group policy cache location at ‘C:\ProgramData\Microsoft\Group Policy\History‘ and then running ‘gpupdate /force‘ to confirm this has resolved the issue.

 

A very important patch for Windows 8.1 and Server 2012 R2

It would appear that Microsoft Windows 8.1 and Server 2012 R2 are only thirty days away from not receiving security updates, or more precisely from the beginning of patch Tuesday in May 2014 .

Well that is not entirely true, but instances running these operating systems are required to have installed KB2919355 (http://support.microsoft.com/kb/2919355) before the above date to continue to receive security updates.

According to Microsoft, this update was released to simplify servicing across both Windows Server 2012 R2, Windows 8.1 RT and Windows 8.1 and that his update will be considered as a new servicing/support baseline.

The new baseline only exists for Windows 8.1 and Windows Server 2012 R2, so those currently with Windows 8 and Windows Server 2012 operating systems will be unaffected. 

For more information on the above:

http://blogs.technet.com/b/gladiatormsft/archive/2014/04/12/information-regarding-the-latest-update-for-windows-8-1.aspx.

Happy patching!

Retrieving Disk Number and SCSI ID for volumes using the Windows Powershell storage module

I was recently looking at obtaining volume information to include the volume name, capacity, free space, disk number and SCSI ID and to include information for both volumes that contained a drive letter or a folder path.

For instances running Windows 8 or Windows Server 2012 I was able to do this using a combination of retrieving WMI objects and using the Get-Partition cmdlet which is included in the storage module within these operating systems and then to export to a comma-separated values (CSV) file.

The requirement was to invoke the above agaisnt a collection of servers names, in this example I will be using a text file containing server names and loop through each one.

$Servers = Get-Content -Path "C:\Collection\Servers.txt" 
$Storage = ForEach ($Server in $Servers)
   {

I will then invoke, the Get-WMIObject cmdlet to query the Win32_Volume class to retrieve all local disks where the label is not equal to ‘System Reserved’.

$Volumes = Get-WmiObject  Win32_Volume -ComputerName $Server | Where-Object {$_.DriveType -eq "3" -and $_.Label -ne "System Reserved"}

For each volume returned I will loop through each volume to retrieve the volume information and select  the computer name, caption,  capacity and free space, to include in the output:

ForEach ($Volume in $Volumes)
   { 
   ""  | Select-Object -Property  @{N="Name";E={$Volume.PSComputerName}},
   @{N="Caption";E={$Volume.Caption}},
   @{N="Capacity (KB)";E={$Volume.Capacity}},
   @{N="Free Space (KB)";E={$Volume.FreeSpace}},

As I am initially using  the Win32_Volume to retrieve the volume information, I will not be able to return the disk number. In order to provide this information I used the Get-Partition cmdlet to compare the volume caption value returned and to filter the partitions retrieved by using the conditional operator function to return a match where the access path value was like the caption value.

@{N="Disk";E={Invoke-Command -ComputerName $Server -ScriptBlock {(Get-Partition | Where-Object {$_.AccessPaths -like $Using:Volume.Caption}).DiskNumber}}},

The final requirement is to include the SCSI ID by returning both the SCSI Port and TargetID of the volume. Again this information is not available from the Win32_volume class so as per the previous item, I will be able to return this information by retrieving the disk number using the Get-Partition cmdlet and then passing the disk number value returned to the Get-WMIObject to query the Win32_DiskDrive class and to return object where the Index value is equal to the disk number and then join both the SCSI Port and Target ID values.

@{N="SCSI Id";E={Invoke-Command -ComputerName $Server -ScriptBlock {
$Disk = (Get-Partition | Where-Object {$_.AccessPaths -like $Using:Volume.Caption}).DiskNumber
$SCSI = Get-WmiObject -Class Win32_DiskDrive | Where-Object {$_.Index -eq $Disk}
"$($SCSI.SCSIPort):$($SCSI.SCSITargetID)"}}}

Finally, I will export the information for all servers in the collections to a comma-separated values (CSV) file.

   {
{
$Storage | Export-Csv -NoTypeInformation -UseCulture -Path "C:\Output\VolumeInformation.csv"

Switch between Server Core and GUI on Windows Server 2012

With the release of Windows Server 2012 it is now possible to switch between the GUI and Server Core installations using the GUI and Powershell cmdlets, with only a restart required to apply the changes.

The default installation of Windows Server 2012 is now available as Server Core, if you require to switch to the GUI installation of the operating system you can do using the following powershell cmdlets;

Install-WindowsFeature Server-Gui-Shell, Server-Gui-Mgmt-Infra -Restart

If you have a Windows Server 2012 GUI installation, you can switch to a Server Core installation, either by using the GUI to remove the Graphical Management Tools Infrastructure and Server Graphical components of the User Interfaces and Infrastructure feature or the powershell cmdlets.

Uninstall-WindowsFeature Server-Gui-Shell, Server-Gui-Mgmt-Infras -Restart