Server automation now plays an essential role in systems administration, due to the disposable nature of modern application environments. Configuration management tools such as Ansible are typically used to streamline the process of automating server setup by establishing standard procedures for new servers while also reducing human error associated with manual setups.
Ansible offers a simple architecture that doesn’t require special software to be installed on nodes. It also provides
This guide explains how to use Ansible to automate the steps contained in our guide on How To Install and Use Docker on Ubuntu 18.04. Docker is an application that simplifies the process of managing containers, resource-isolated processes that behave in a similar way to virtual machines, but are more portable, more resource-friendly, and depend more heavily on the host operating system.
This Ansible playbook provides an alternative to manually running through the procedure outlined in our guide on How To Install and Use Docker on Ubuntu 18.04.
Running this playbook will perform the following actions on your Ansible hosts:
aptitude
, which is preferred by Ansible as an alternative to the apt
package manager.apt
sources.pip
.default_container_image
from Docker Hub.create_containers
variable, each using the image defined by default_container_image
, and execute the command defined in default_container_command
in each new container.Once the playbook has finished running, you will have a number of containers created based on the options you defined within your configuration variables.
The first thing we need to do is obtain the Docker playbook and its dependencies from the do-community/ansible-playbooks repository. We need to clone this repository to a local folder inside the Ansible Control Node.
In case you have cloned this repository before while following a different guide, access your existing ansible-playbooks
copy and run a git pull
command to make sure you have updated contents:
cd ~/ansible-playbooks
git pull
If this is your first time using the do-community/ansible-playbooks
repository, you should start by cloning the repository to your home folder with:
cd ~
git clone https://github.com/do-community/ansible-playbooks.git
cd ansible-playbooks
The files we’re interested in are located inside the docker_ubuntu1804
folder, which has the following structure:
docker_ubuntu1804
├── vars
│ └── default.yml
├── playbook.yml
└── readme.md
Here is what each of these files are:
vars/default.yml
: Variable file for customizing playbook settings.playbook.yml
: The playbook file, containing the tasks to be executed on the remote server(s).readme.md
: A text file containing information about this playbook.We’ll edit the playbook’s variable file to customize our Docker setup. Access the docker_ubuntu1804
directory and open the vars/default.yml
file using your command line editor of choice:
cd docker_ubuntu1804
nano vars/default.yml
This file contains a few variables that require your attention:
---
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
The following list contains a brief explanation of each of these variables and how you might want to change them:
create_containers
: The number of containers to create.default_container_name
: Default container name.default_container_image
: Default Docker image to be used when creating containers.default_container_command
: Default command to run on new containers.Once you’re done updating the variables inside vars/default.yml
, save and close this file. If you used nano
, do so by pressing CTRL + X
, Y
, then ENTER
.
You’re now ready to run this playbook on one or more servers. Most playbooks are configured to be executed on every server in your inventory, by default. We can use the -l
flag to make sure that only a subset of servers, or a single server, is affected by the playbook. We can also use the -u
flag to specify which user on the remote server we’re using to connect and execute the playbook commands on the remote hosts.
To execute the playbook only on server1
, connecting as root
, you can use the following command:
ansible-playbook playbook.yml -l server1 -u root
You will get output similar to this:
Output...
TASK [Add Docker GPG apt Key] ********************************************************************************************************************
changed: [server1]
TASK [Add Docker Repository] *********************************************************************************************************************
changed: [server1]
TASK [Update apt and install docker-ce] **********************************************************************************************************
changed: [server1]
TASK [Install Docker Module for Python] **********************************************************************************************************
changed: [server1]
TASK [Pull default Docker image] *****************************************************************************************************************
changed: [server1]
TASK [Create default containers] *****************************************************************************************************************
changed: [server1] => (item=1)
changed: [server1] => (item=2)
changed: [server1] => (item=3)
changed: [server1] => (item=4)
PLAY RECAP ***************************************************************************************************************************************
server1 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
When the playbook is finished running, log in via SSH to the server provisioned by Ansible and run docker ps -a
to check if the containers were successfully created:
sudo docker ps -a
You should see output similar to this:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3fe9bfb89cf ubuntu "sleep 1d" 5 minutes ago Created docker4
8799c16cde1e ubuntu "sleep 1d" 5 minutes ago Created docker3
ad0c2123b183 ubuntu "sleep 1d" 5 minutes ago Created docker2
b9350916ffd8 ubuntu "sleep 1d" 5 minutes ago Created docker1
This means the containers defined in the playbook were created successfully. Since this was the last task in the playbook, it also confirms that the playbook was fully executed on this server.
You can find the Docker server setup featured in this tutorial in the docker_ubuntu1804
folder inside the DigitalOcean Community Playbooks repository. To copy or download the script contents directly, click the Raw button towards the top of each script.
The full contents of the playbook as well as its associated files are also included here for your convenience.
The default.yml
variable file contains values that will be used when setting up Docker on your server.
---
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
The playbook.yml
file is where all tasks from this setup are defined. It starts by defining the group of servers that should be the target of this setup (all
), after which it uses become: true
to define that tasks should be executed with privilege escalation (sudo
) by default. Then, it includes the vars/default.yml
variable file to load configuration options.
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install aptitude using apt
apt: name=aptitude state=latest update_cache=yes force_apt_get=yes
- name: Install required system packages
apt: name={{ item }} state=latest update_cache=yes
loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: Update apt and install docker-ce
apt: update_cache=yes name=docker-ce state=latest
- name: Install Docker Module for Python
pip:
name: docker
- name: Pull default Docker image
docker_image:
name: "{{ default_container_image }}"
source: pull
# Creates the number of containers defined by the variable create_containers, using values from vars file
- name: Create default containers
docker_container:
name: "{{ default_container_name }}{{ item }}"
image: "{{ default_container_image }}"
command: "{{ default_container_command }}"
state: present
with_sequence: count={{ create_containers }}
Feel free to modify this playbook to best suit your individual needs within your own workflow. For example, you could use the docker_image
module to push images to Docker Hub or the docker_container
module to set up container networks.
Automating your infrastructure setup can not only save you time, but it also helps to ensure that your servers will follow a standard configuration that can be customized to your needs. With the distributed nature of modern applications and the need for consistency between different staging environments, automation like this has become a central component in many teams’ development processes.
In this guide, we demonstrated how to use Ansible to automate the process of installing and setting up Docker on a remote server. Because each individual typically has different needs when working with containers, we encourage you to check out the official Ansible documentation for more information and use cases of the docker_container
Ansible module.
Originally published by Erika Heidi at https://www.digitalocean.com
#Docker #Ubuntu #Ansible #DevOps