With the push to move our roles to Ansible Galaxy as much as possible, we needed to come up with a good way to test the roles as we write them. Up until now, we would build and test them completely within Ansible against the specific system type that we planned to run on. While this works ok against the focused roles that we were writing, it doesn’t work very well for generalized roles that are expected to run on the many different Linux distributions that we run at Blackbaud.
To solve this, we have come up with a Vagrant configuration that allows us to test against multiple OSs both locally (via VirtualBox or VMware) or in the cloud (AWS). You can check out code here. To get started, simple clone the project to you your local machine.
git clone email@example.com:MarsDominion/vagrant-ansible-testing.git
The Vagrantfile in the master branch provides three test environments: aws-linux, centos7, and ubuntu. The aws-linux role will build an Amazon Linux host in AWS while the CentOS and Ubuntu nodes environments are vmware_desktop based nodes that are pulled from Atlas. This gives me a way to test our roles against both cloud and local instances. If you don’t have VMware Fusion or Workstation, you can change the provider from vmware_desktop to virtualbox and they should work as well.
Before launching the instances, you need to download your ansible roles to run. This is done with the ansible-galaxy command.
% ansible-galaxy install blackbaud.linux-hardening
And then update your playbook to include the roles:
- hosts: all become: true roles: - blackbaud.linux-hardening
Finally, set some variables to be able to connect to your Amazon Environment:
AWS_ACCESS_KEY_ID=KIAI3XQCPIPKSDJHSVQ AWS_SECRET_ACCESS_KEY=onX5HfdsIpasdH6+E+JJCgNxIfzJWY1btZgU4LfQ AWS_KEYPAIR_NAME=test_key MY_PRIVATE_AWS_SSH_KEY_PATH=$HOME/.ssh/test_key.pem
Now we are ready to test the
vagrant up # Brings up all three instances and tests vagrant up <aws-linux|centos7|ubuntu> # Brings up the specified instance and tests
It will launch each instance and run through the the Ansible on each node and show you the results. It will jump right into the next node when it completes the previous one, so keep an eye on the output to see the results. When you are done, you can simply destroy the nodes.
vagrant destroy -f