Full of Chocolatey Goodness

The one thing that nobody can deny Nix based OSes have down pat is the package manager.  The ability to install software on demand from trusted sources is without a doubt one of the coolest things I’ve experienced using Linux.  You need a media editing suite?  No problem!  A better text editor?  Take your pick! Whether it’s RPMs or ppa’s, via command line with yum and apt-get or in the GUI with Synaptic, that ability to install packages, updates and full software products is simply amazing!

In terms of configuration management this makes provisioning Linux from infrastructure as code tools like Ansible, Puppet and Chef insanely easy.  Unfortunately Windows does not have this feature.  Sure there is an app store similar to current smart phones in windows 10 (if there were any apps to download that is), but pretty much all CM solutions are geared towards server based environments so fully automated configuration management isn’t as simple as it would be with Centos or Ubuntu.

So how do we deal with installing software through CM on Windows?  One way is to package the software as part of the CM script.  If you version control those scripts in Git, you could feasibly include each software package as a submodule to git, but that means that you have to create a separate git repository for every package you use.  In some of the environments that I’m dealing with, there may be as many as 30 or 40 software dependencies on a whole environment so that means a lot of repos.  Tracking binaries with git is not really efficient either.  Every time you update the package, it snapshots those binaries so you can end up with massive repos for small software packages.  These take time to download and can slow the entire CM process down massively.

If only there was a decent package manager for windows like ppa or rpm…….

Well hold on to your socks guys because we are in luck.  There is a package manager for windows that works just like it’s Linux cousins.  It’s called Chocolatey and even though it’s early days for me and I’ve not had much exposure yet, it’s phreaking amazing!

I had a demonstration from Rob Reynolds and Mike at RealDimensions software and my jaw was hitting the floor through the whole presentation.  There is a public repository with so many applications available that it a desktop user can get pretty much whatever they want.  For the corporate environments there is the ability to host your own private repo in which you can create your own secure validated apps on.  Creating packages is extremely easy and all the options you need to change are clearly laid out in the configuration files.  There is a business option that allows you to create packages from a host of windows installers.

I am impressed with what I’ve seen so far.  I’ll certainly be blogging about my experience over the coming weeks.

The future of computing is Collaberative

Once, there used to be 2 camps in the world of computing.  Lets call them the Softies and the Nixies.

On the one side you had the Nixies in their carpet slippers, pointing their pipes and scowling at the Softies on the other side who in turn wearing their polo shirts and denim jeans shook their heads back at the Nixies and never the twain should meet.  That was the world of IT 20 years ago when I first cut my teeth.

The world has revolved, time has passed and today things have changed dramatically.  Once Microsoft was a monopolistic megalith seeking world domination on your desktops, servers and even the very web pages you hosted.  They succeeded in the first instance, certainly in the enterprise they rule on servers, but they never could make a decent dent into the internet.  Today the internet is everywhere, on everything and our lives are being dominated by trends, fads, the need for information and to stay connected to our ever growing list of peers.

How has this effected the 2 camps?  I can only speak from my own experience, but certainly, the Nixies are no longer so scowly and the Softies are not so head shaky and there is even the first tentative blooms of respect between them.  But what caused this change of paradigm?

Microsoft caused it.  What?  Did I really say that?  I did.  You heard that right out of my own, well, fingers.  I do indeed believe in my own opinion that Microsoft has had a great part in helping to bring IT together.

This is all my own opinion so please don’t take what I say as lore.  I think what we have seen certainly over the last 10 years is the power of culture and how changing culture can lead to dramatic and long felt effects.  Once the Culture in Microsoft was very much they were top dog, did the right things and would take over the world.  And those attitudes filtered down through the organisation to the customers and to a certain extent that cultural attitude is still prevalent in a lot of people today.  Likewise, Linux culture viewed open source as far superior with no hidden agendas and would lead the way to taking over the world.  Clearly neither side are ruling the world.  Each dominates their own sphere of computing influence, but there is no clear winner at either side.  So how exactly did Microsoft lead the change?

Leading on from my previous statement on culture, CEOs and CTOs have retired, been replaced or moved on to better places.  Those coming up behind them had alternative goals and started to change the culture from the top which has already filtered down the organisation substantially.  This change is already permeating further into Microsoft’s customers and people are becoming more open minded about what devices they used.  Some may say that the reason for the change is due to the failure of Windows 8 and windows devices with the unified interface.  This may be partially true, I don’t know, but I am certain that a change in direction from the top was instigated and will continue to ripple through MS’s sphere of influence for some time to come.

Remember the Microsoft Loves Linux presentation followed closely by the release of dot net core?  Earlier on this year we heard about SQL Server and the recent release of PowerShell that had me all excited yesterday.  These are all signs on the increasing cultural change in Microsoft towards a more collaborative stance in working with customers.  Gone are the days when they would say “All this is mine, and all that you have over there will be mine”.  Today the clear message from Microsoft is “We respect your choice, so let us help you have more of a choice” and they certainly are offering many good alternative solutions for those who don’t want to lock themselves into a Wintel or Linux only type infrastructure.

Likewise, companies like Redhat are also striving to improve tools such as Ansible which were always considered to be Linux only tools by adding Windows support.  Times have changed and it is clearer than ever that through working together with Customers, not against them, Microsoft is altering direction.  What is next?  Who knows! But I can’t wait to find out!

These are indeed interesting and exciting times we’re living in!

Microsoft Open sources Powershell for Linux and Mac OS

An amazing announcement from Microsoft landed today in this video :

Yes you have read that right, PowerShell is going to be available for Linux and MacOS based platforms.  Now you might wonder why I would get so excited about this, what with me preferring Linux as my core OS.  Surely bash is better?  And with bash being released on Windows 10, isn’t this pointless?

There is a lot to be excited about with this news.  I’ve not had much exposure to PowerShell until I started on this project but so far from what I’ve seen, PS is not half bad.  Is it better than Bash?  I can’t really answer that.  It’s like comparing a screw driver and a hammer.  Which is better?  It depends on what you’re doing with it.

To me this means that it will soon be possible to manage mixed environment infrastructure with a unified toolset. And there is choice in which tools to use.  Bash on Windows or PowerShell on Linux, each have their unique and wonderful features, and each will find their niche use I’m sure.  I don’t think that we will suddenly see Linux based infrastructure suddenly sprouting PS or Wintel houses jumping on Bash, but I do see that companies who use a mix of both will be able to use the best tool for their need across all these environments considerably reducing the technical debt that these types of work environments inevitably gain.

This is nothing but good news for everyone.

Ansible Tower and vSphere : Talking to a Windows Server 2012 with no IP address

So far this week has been very productive and exciting.  There are still many things up in the air right now, but my priority for this week is to integrate Ansible Tower with the vCenter, create spin up and provision a windows 2012R2 server.

I started the week by upgrading Tower from 2.4.5 to 3.0.1.  Running the ./setup.sh took it right through without a hitch.  Logging into the tower front end I was pleased with the cleaner more professional dashboard and icons.  Not just that but the layouts of some of the forms are far better than in previous versions.  Well done RedHat!

Ops gave me my own vCenter to play with last week and with only 11 days left of my tower license I felt it prudent to get cracking.  As I have come to expect from Ansible, the documentation was clear enough with good examples that I could copy and paste into a playbook.  Edited in Atom and pushed into the git repository I was good to go.

The tower project has already been set up  to point to a locally hosted bitbucket SCM and when I created my first test playbook to create the vcenter guest, it pulled those changes and I was able to select the playbook in the job template.

To generate the right amount of dynamic information for the vSphere guest I have added fields to the custom survey.  Some already filled in but available to edit.  But on my first run, I hit a snag.  It told me I had to install pysphere.

pip install pysphere

Run again and now it’s cooking.  After about 5 minutes, it passed and going into my vSphere client it had indeed created the guest VM from the predefined template Ops put there.

This is a successful first stage but still a ways to go.  I still have to provision the guest!

Initially the Guest is sitting there with no network connectivity.  The vCenter resides in a server VLAN which does not have access to a DHCP server.  So the box automatically picks a 169 address.  How do you get an IP address onto a guest VM which can’t be connected to directly from Ansible Tower?

Some emails to redhat and googling brought me up with the wonderful module vmware_vm_shell.  Ok!  Now we’re talking.   I now have a way to interface with the guest through vCenter direct to it’s shell.

Before I continue, I will mention another dependancy.  vmware_vm_shell uses pyVmomi so you will have to install that.

pip install pyvmomi

We can now access PowerShell and set the IP address through that with this handy role and one liner :

- name: Configure IP address
  local_action:
    module: vmware_vm_shell
    hostname:"{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    datacenter: "{{ vcenter_datacenter }}"
    vm_id: "{{ vguest_name }}"
    vm_username: {{ vguest_admin }}
    vm_password: {{ vguest_password  }}
    vm_shell: "C:\Windows\System32\WindowsPowershell\1.0\powershell.exe"
    vm_shell_args: " -command (Get-NetAdapter -Name Ethernet |New-NetIPAddress -InterfaceAlias Ethernet -AddressFamily IPv4 -IPAddress {{ vguest_ipv4 }} -PrefixLength {{ vguest_mask }} -DefaultGateway {{ vguest_gateway}} )-and (Set-DnsClientServerAddress -InterfaceAlias Ethernet -ServerAddresses {{ vguest_dns }})"
    vm_shell_cwd: "C:\Windows\Temp"

Now we have an IP address on the Windows server, Ansible can talk to it.  Or can it?

In my earlier experiments with vagrant and ansible, one of the first things I did in the provisioning shell command was to run a WinRM PowerSHell script to enable PowerShell remoting.  And we hit another hurdle.  The vCenter I’m developing against does not have access to the domain, so I’m stuck for accessing any network resources.  But I have to run a powershell script on the guest, which is in the playbook assets on the tower server.

It’s a multiple line shell script so I can’t just pass it through the args on vm_shell.  Or can I?

Turns out I can.  Placing the ConfigureRemotingForAnsible.ps1 script into the $role/files directory makes it available to the role for funky things like I’m about to do.

So as not to duplicate the above block I added a with_items and moved the shell_args I’d written earlier into the list to join it’s siblings :

  vm_shell_args: {{ item }}
  vm_shell_cwd: "C:\Windows\Temp"
 with_items:
  - " -command (Get-NetAdapter -Name........"
  - " -command @'

 lookup('file', 'files/ConfigureRemotingForAnsble.ps1') '@ | Set-Content ConfigureRemotingForAnsible.ps1"
  - " -File ConfigureRemotingForAnsible.ps1"

Lets talk about what I’ve done here and why the 2nd command looks so odd.  You’ll notice that I’m using something called a Here-String (which is what the @’ ‘@ is all about.  This allows you to insert formatted multi line text into a variable.  But why the double line feed?

Ansible tower should be running on a Centos 7 box.  If you managed to get it running on Ubuntu then well done you, but I didn’t have the time to figure it out so Centos 7 is what I’m working on.  Windows and Linux handle line feeds and carriage returns differently so this is why you get all kinds of odd behaviour opening up some files in Notepad that look fine in other editors.

The Here-String requires you to start the text block on a new line (at least on 2012R2 it does) but because of the LR/LF discrepancy, a single feed to windows would be classed as the same line.  So double feed and you now have a Here-String that is piped into Set-Content and stored in a .ps1 in the C:\Windows\Temp folder.

The 3rd line then runs that file, setting up the PowerShell remoting.  It sounds easy, but believe me, it took me the better half of the day to get this figured out.

Final step was to prove that Ansible could provision the Guest environment.  Again not a straight forward task, but with a very easy solution.  The simplest method of provisioning is to add a feature.  There is already an IIS example on win_feature so I copied it into a new role and added the role to the create playbook.  But this is not going to work.  This is because currently the playbook is using Hosts: localhost but we need to point it to the guest for the next stage of provisioning.

This is how my top level playbook looks :

---
- hosts {{ target_host }} # set to localhost
  gather_facts: no

  roles:
  - vsphere
  - networking
  - gather_facts

- hosts: virtual

  roles:
    install_iis

Did I just change hosts in the middle of a playbook? I done did!  Yes you can change hosts in the middle of the playbook.  But where does it get the virutal hosts from?

See the 3rd role in the 1st block?  Gather_facts.  There’s a neat trick I did here.

- vsphere_guest:
    vcenter_hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    guest: "{{ vguest_name }}"
    vmware_guest_facts: yes

- name: Add Guest to virtual host group
  add_host: name="{{hw_eth0.ipaddresses[0]}}" groups="virtual"

Using the same vsphere_guest module, I got facts about the guest, and used those facts to add it dynamically to the virtual host group.  Theoretically I could have gotten it from the variable {{ vguest_ipv4 }} but this way looks a lot more awesome.

We’re not out of the woods yet though.  Simply trying to add the guest to the virtual group won’t get you a connection. It will try to connect, but with ssh.  We need to remind Ansible that this is a winrm connection.  The best way to do that is with group_vars.  Create a new $projectroot/group_vars/virtual.yml and add this option

---
ansible_ssh_connection: winrm

No further configuration needed after that and ansible tower connects to the guest via winrm over IP and without as much as breaking a sweat added via the win_feature module an IIS server.

- name: Install IIS
  win_feature:
    name: "Web-Server"
    state: present
    restart: yes
    include_sub_features: yes
    include_management_tools: yes

So in summary I now have :

  • Ansible tower running on a Linux Centos 7 server
  • Communicating to a vmware vcenter hypervisor
  • Pulling playbooks for a locally hosted bitbucket (stash)
  • Spinning up a Guest VM from an existing template
  • Setting up the IP credentials
  • Enabling powershell remoting
  • Adding features

All with a few clicks of a mouse button.  I would say that today has been a good day

Hello world!

Supposedly the first post in your blog is the most important.  Capture the audience, state your intentions, introduce yourself yadda yadda yadda.  Sounds so easy until you sit there for half an hour with out a clue what to type.

Who am I, what am I, what do I do?  Existential dilemma aside all valid questions.

Those who know me well, know that I am a self certified Linux fan boy.  I love Linux! I use it as much as I can!  It’s been my main OS for nearly a decade and it has filled a major part of my career to date, so it may come as a surprise to many to find out that my current contract has almost no Linux technology.  My client is an entirely Windows based house with MSDN subscriptions to everything, yet they have employed me in the position as a DevOps consultant to analyse and implement improvements to their current development environments and software delivery processes.

There are many out there who think that DevOps is not something that can be successfully implemented into a windows based environment, but even though I come from the dark side of the force, I am going to take the challenge and prove that DevOps is not limited by technology, tools or operating systems, but is truly about the attitudes and willingness of people who want to improve their software development and delivery environments.

This blog is to help me keep track of my journey into implementing the processes, methodologies and some of the tools I’ve used in previous Linux based organisations into this Wintel house.  To talk about many of the challenges I face, the compromises I have had to and will have to make, and how I will bring about what is considered the impossible.