Running Ansible on a Windows System
On my last conference talk (it was about Ansible and Docker at DevOpsCon in Berlin), I was asked what is the best way to run Ansible on a Windows system. Ansible itself requires a Linux-based system as the control machine. When I have to develop on a Windows machine, I install a Linux-based virtual machine to run the Ansible’s playbooks inside the virtual machine. I set up the virtual machine with Virtualbox and Vagrant. This tools allow me to share the playbooks easily between host and the virtual machine. so I can develop the playbook on the windows system and the virtual machine can have a headless setup. The next section shows you how to set up this tool chain.
Tool Chain Setup
At first, install VirtualBox and Vagrant on your machine. I additionally use Babun, a windows shell based on Cygwin and oh-my-zsh, for a better shell experience on Windows, but this isn’t necessary. Then, go to the directory (let’s called it ansible-workspace), where your Ansible’s playbooks are located. Create there a Vagrant configuration file with the command vagrant init:
ansible-workspace ├── inventories │ ├── production │ └── test ├── README.md ├── roles │ ├── deploy-on-tomcat │ │ ├── defaults │ │ │ └── main.yml │ │ └── tasks │ │ ├── cleanup-webapp.yml │ │ ├── deploy-webapp.yml │ │ ├── main.yml │ │ ├── start-tomcat.yml │ │ └── stop-tomcat.yml │ ├── jdk │ │ └── tasks │ │ └── main.yml │ └── tomcat8 │ ├── defaults │ │ └── main.yml │ ├── files │ │ └── init.d │ │ └── tomcat │ ├── tasks │ │ └── main.yml │ └── templates │ └── setenv.sh.j2 ├── demo-app-ansible-deploy-1.0-SNAPSHOT.war ├── deploy-demo.yml ├── inventories │ ├── production │ └── test ├── roles │ ├── deploy-on-tomcat │ │ ├── defaults │ │ │ └── main.yml │ │ └── tasks │ │ ├── cleanup-webapp.yml │ │ ├── deploy-webapp.yml │ │ ├── main.yml │ │ ├── start-tomcat.yml │ │ └── stop-tomcat.yml │ ├── jdk │ │ └── tasks │ │ └── main.yml │ └── tomcat8 │ ├── defaults │ │ └── main.yml │ ├── files │ │ └── init.d │ │ └── tomcat │ ├── tasks │ │ └── main.yml │ └── templates │ └── setenv.sh.j2 ├── setup-app-roles.yml ├── setup-app.yml └── Vagrantfile ├── setup-app-roles.yml ├── setup-app.yml └── Vagrantfile
Now, we have to choose a so-called Vagrant Box on Vagrant Cloud. A box is the package format for a Vagrant environment. It depends on the provider and the operation system that you choose to use. In our case, it is a Virtualbox VM image based on a minimal Ubuntu 18.04 system (box name is bento/ubuntu-18.04 ). This box will be configured in our Vagrantfile:
Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-18.04" end
The next step is to ensure that Ansible will be installed in the box. Thus, we use the shell provisioner of Vagrant. The Vagranfile will be extended by the provisioning code:
Vagrant.configure("2") do |config| # ... other Vagrant configuration config.vm.provision "shell", inline: <<-SHELL sudo apt-get update -y sudo apt-get install -y software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt-get update -y sudo apt-get install -y ansible # ... other Vagrant provision steps SHELL end end
The last step is to copy the SSH credential into the Vagrant box. Thus, we mark the SSH credential folder of the host system as a Shared folder, so that we can copy them to the SSH config folder inside the box.
Vagrant.configure("2") do |config| # ... other Vagrant configuration config.vm.synced_folder ".", "/vagrant" config.vm.synced_folder "path to your ssh config", "/home/vagrant/ssh-host" # ... other Vagrant configuration config.vm.provision "shell", inline: <<-SHELL # ... other Vagrant provision steps cp /home/vagrant/ssh-host/* /home/vagrant/.ssh/. SHELL end
On Github’s Gist you can found the whole Vagrantfile.
Workflow
After setting up the tool chain let’s have a look how to work with it. I write my Ansible playbook on the Windows system and run them from the Linux guest system against the remote hosts. For running the Ansible playbooks we have to start the Vagrant box.
> cd ansible-workspace > vagrant up
When the Vagrant box is ready to use, we can jump into the box with:
> vagrant ssh
You can find the Ansible playbooks inside the box in the folder /vagrant . In this folder run Ansible:
> cd" /vagrant > ansible-playbook -i inventories/test -u tekkie setup-db.yml
Outlook
Maybe on Windows 10 it’s possible to use Ansible natively, because of the Linux subsystem. But I don’t try it out. Some Docker fans would prefer a container instead of a virtual machine. But remember, before Windows 10 Docker runs on Windows in a virtual machine, so therefore, I don’t see a benefit for using Docker instead of a virtual machine. But of course with Windows 10 native container support a setup with Docker is a good alternative if Ansible doesn’t run on the Linux subsystem.
Do you another idea or approach? Let me know and write a comment.
Links
- VirtualBox
- Vagrant
- Whole Vagrantfile on Github.
Published on System Code Geeks with permission by Sandra Parsick, partner at our SCG program. See the original article here: Running Ansible on a Windows System Opinions expressed by System Code Geeks contributors are their own. |