Syndicated content! Check the original "Ansible I: Concepts and Installation" @ hectormartinez.dev
With this post we start a series about Ansible, the IT automation tool. This first article introduces the basic concepts of Ansible and its installation. Also we will install Docker which will help us to practice Ansible in a more realistic scenario without exiting our computer.
By the end of this article you will have:
- Learned the basic concepts of Ansible about tasks and nodes
- Installed the WSL and Ubuntu on Windows
- Installed Ansible
- Installed Docker on your computer
Note: This series is focused in Ansible on Windows but the commands can be easily ported to Linux. Ask if you have any doubt or problem!
Ansible is an automation tool that can run actions (aka commands or tasks) in machines directly from your computer, without any special setup. To write the actions we use YAML which lowers the barrier for newcomers, since it is easy to read. Ansible has a large community and RedHat behind it so it grows more and more every day, improving the Windows support each day (which is nice for me since I work in a Windows environment).
With Ansible you can run actions from your computer in other machines. Technically you should call Control Node to your computer and Managed Nodes to the other machines. Your computer control machines and those machines are managed by you, pretty straightforward. However here we will use the word hosts to call the Managed Hosts, since that word is too long (the community use the word hosts too, probably for the same reason).
Modules need parameters to do their job. For example
copy needs to know where the file that we want to copy (on your machine) and where will be copied (in the remote hosts). We can provide those using
dest. For example:
# Welcome to YAML, use two spaces to ident copy: # Module name src: instructions.pdf # Parameter, idented dest: some/remote/folder/instructions.pdf # Parameter, idented
This alone will not work, as we should use modules inside tasks. Those basically give them a name for better comprehension, but also can be used to control the flow of execution. For example:
name: distribute PDF with instructions to all machines # Give them an meaningful name! copy: # Module name src: instructions.pdf # Parameter, idented dest: some/remote/folder/instructions.pdf # Parameter, idented
Tasks should run inside another bigger thing called playbook. It contains tasks in a certain order and defines in which hosts those tasks will be used. An example of a playbook:
# YAML files start with three dashes, weird but true --- # Playbooks are lists, so use a dash before the name of the playbook - name: Playbook Name hosts: all # We want to run against all hosts # Tasks is also a list, so use a dashe before each task tasks: - name: distribute PDF with instructions to all machines # Task name copy: # Module name src: instructions.pdf # Parameter, idented dest: instructions.pdf # Parameter, idented - name: notify everyone # Task name slack: # Module name channel: event-X # Parameter, idented msg: Instructions are in your computers! # Parameter, idented
This playbook will run the
copy module, which will copy the
instructions.pdf from our computer to the managed nodes and then will call the
slack module to notify a channel about it.
So how our computer knows which are the managed nodes? Ansible has the inventory. The inventory is a file in
ini format that contains a list of managed nodes. Remember that
hosts: all from the playbook? You can group them! For example:
[all] managed-01.company.com managed-02.company.com 10.120.240.240 [windows] managed-01.company.com [debian] managed-02.company.com 10.120.240.240
So you could run your playbooks using
hosts: windows or
hosts: debian instead of
hosts:all if you want to.
We can not install Ansible directly into Windows, but it works inside the Windows Subsystem for Linux (WSL from now on), which is kind of an "embeded" Linux inside Windows.
The WSL is a feature, so we can activate it using the interface. However we will use PowerShell to activate it. Open a PowerShell prompt with administrator rights and run:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
After rebooting your computer you can install a Linux distribution from the Windows Store. I personally use Ubuntu, since I am familiar with it. Here I will be using the Ubuntu package manager, but you can find similar commands for all the package managers from other distributions.
After install the distribution, type "Ubuntu" in the Search bar and open the application. The first time you will have to configure the user and the password, but it is straightforward to do it.
Many of the commands from now will be run inside the WSL, so be careful! If you see a
bash flag over the code, it means that is run inside the WSL, as we will use bash there. If the flag is
powershell we will be running in Windows
Note: Remember to run inside the distribution
Ansible runs with Python, so you will need to have Python installed. If you selected the Ubuntu distribution you will have
python3 installed. If that is not the case, check how to install Python in your distribution. Then try to run:
python3 -m venv venv
This will create a virtual environment that we will use to install Ansible. Using it we will maintain our Ansible installation isolated from the global packages installed, which is nice when there are conflicting dependencies. In Ubuntu this will fail with the following error:
The virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command. apt-get install python3-venv You may need to use sudo with that command. After installing the python3-venv package, recreate your virtual environment. Failing command: ['/home/hector/venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']
sudo apt-get y install python3-venv and accept the installation of the proposed packages. After that you should be able run the command without problem:
python3 -m venv ansible-venv
Activate the virtual environment and install Ansible:
. ansible-venv/bin/activate pip install ansible ansible --help
This should return the Ansible command line help. If it worked, Ansible will probably run without problem.
So now another installation before we can start playing with Ansible. Docker is a tool that use containers which isolate an environment on top of the operative system. Think about those containers as real ship containers, their contents are isolated from one another, they are inside a ship (a computer) and they are standardized.
Here the paths will diverge a little depending of your flavour of Windows. If you have Windows 10 Home you will need to install Docker Toolbox. If you have Windows 10 Pro, Education or Enterprise you will need to install Docker Desktop. If you have Linux, check the Docker Installation guide for your distribution.
Why this difference? The Docker for Windows run over Hyper-V, a Windows feature that is not avaiable in Windows 10 Home. Docker Toolbox run over VirtualBox, which can be installed without problem in any Windows 10 flavour.
The Docker installers will do the hard work for you, be sure to check the troubleshoot section in the guides if have any problem. After installing, you should be able to run the
docker run hello-world that they put in the guides.
Note: We will use Docker (
docker command) from the Windows side, not the Windows Subsystem for Linux. In Linux use it in the terminal, same as ansible commands.
So now you are ready to start playing with Ansible and some Docker containers. You can check the getting started guides of both tools to grasp more basic concepts and get a better idea on how to use them.
In the following article we will spin up some Docker containers and configure Ansible to run playbooks against them.