As a system administrator, chances are that there are some tasks that you do repetitively every single day that takes up a lot of your time that could have been invested elsewhere. What if you could solve problems once and then automate your solutions going forward? That is what Ansible is good at and once you get to see its benefits, you will never look back again. Ansible is a simple, yet powerful IT automation engine that thousands of companies are using to drive complexity out of their environments and accelerate DevOps initiatives.

Be it the deployment of applications, routine maintenance of your servers, Configuration Management, Continuous Delivery, Orchestration or any repetitive work that you can describe, Ansible can handle it for you. To add beauty to this beast, AWX (Ansible Web eXecutable) provides a web-based user interface, REST API, and task engine built on top of Ansible. The AWX Project is an open source community project, sponsored by Red Hat, that enables users to better control their use of Ansible project in IT environments. AWX is the upstream project from which the Red Hat Ansible Tower offering is ultimately derived.

“Don’t wait. The time will never be just right.”

–Napoleon Hill

Prerequisites

Before you can run a deployment, you’ll need the following installed in your local environment

  • Ansible Version 2.8
  • A recent version of Docker
  • docker Python module
  • GNU Make
  • Git Version 1.8.4
  • Python 3.6
  • Node 10.x LTS version

We should be now ready to roll up our sleeves, put on our boots and get to work.

Step 1: Install Epel Release Repo and Dependencies

We need packages from Epel repository, so let us install it as follows:

sudo dnf -y install epel-release

AWX has some packages required as dependencies. We can have all of them installed by running the command below.

sudo dnf install -y git python3-pip curl ansible gcc nodejs gcc-c    gettext lvm2 device-mapper-persistent-data pwgen bzip2

Disable SELinux

This is optional if you can handle SELinux with ease. To disable it, run the command below and reboot your server.

sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

Step 2: Install Docker and Docker Compose

AWX is supported and can only be run as a containerized application using Docker images deployed to either an OpenShift cluster, a Kubernetes cluster, or docker-compose. We shall use Docker in this guide to get us AWX up and running.

First, download Docker repository file to /etc/yum.repos.d/docker-ce.repo and update RPM index cache before installing Docker.

sudo curl  https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sudo yum makecache 
sudo dnf -y  install docker-ce --nobest

Start and enable Docker Service to start at boot and check if it is running

$ sudo systemctl enable --now docker
$ systemctl status  docker

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-07-27 20:21:51 UTC; 5s ago
     Docs: https://docs.docker.com
 Main PID: 52836 (dockerd)
    Tasks: 22
   Memory: 49.8M
   CGroup: /system.slice/docker.service
           ├─52836 /usr/bin/dockerd -H fd://
           └─52843 containerd --config /var/run/docker/containerd/containerd.toml --log-level info

The docker group is created, but no users are added to the group. Add your user to this group to run docker commands without sudo.

sudo usermod -aG docker $USER

Find out more about Installing Docker and Docker Compose on CentOS 8 guide to get both Docker and docker-compose installed on your Cent0S 8 server.

Next, we shall use pip3 command to get docker-compose and docker python module installed as shown below.

sudo pip3 install -U docker docker-compose

Confirm installed version.

$ docker-compose version
 docker-compose version 1.26.2, build unknown     
 docker-py version: 4.2.2
 CPython version: 3.6.8
 OpenSSL version: OpenSSL 1.1.1c FIPS  28 May 2019

Step 3: Clone AWX from git

So far, we have covered all the prerequisites that AWX needs to breath. We can finally safely clone and install Ansible AWX. Let us get AWX’s files from Git using the command below.

cd ~
git clone --depth 50 https://github.com/ansible/awx.git

Change to installer directory

The installer directory has a config file we need to modify and execute, therefore, navigate into the directory.

cd ~/awx/installer/

Before we edit the inventory file, generate a secret encryption key we shall use by running the command below.

$ pwgen -N 1 -s 30
yBs76VurxRiBwtDHrrF2JJlLgVrcv3

Edit the inventory file and customize it to suit the needs of your environment.

$ vim inventory

[all:vars]
dockerhub_base=ansible
awx_task_hostname=awx
awx_web_hostname=awxweb
postgres_data_dir="~/.awx/pgdocker"
host_port=80
host_port_ssl=443
docker_compose_dir="~/.awx/awxcompose"
pg_username=awx
pg_password=awxpass
pg_database=awx
pg_port=5432
admin_user=admin
admin_password=SuperSecret
create_preload_data=True
awx_alternate_dns_servers="8.8.8.8,8.8.4.4"
secret_key=yBs76VurxRiBwtDHrrF2JJlLgVrcv3
awx_official=true

Alter Firewall Rules

In case you have Firewalld running, add-masquerade and allow http and https services. This is very important, do not skip it. In case you changed the port in the previous inventory file, allow it in your firewall as well.

sudo firewall-cmd --zone=public --add-masquerade --permanent
sudo firewall-cmd --permanent --add-service={http,https}
sudo firewall-cmd --reload

Execute playbook

Run the install Ansible Playbook to deploy the AWX docker containers. Run ansible-playbook command followed by option -i which tells it the inventory file to use. The name of the playbook file is install.yml.

sudo ansible-playbook -i inventory install.yml
<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-output.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="492" src="data:image/svg xml,” width=”931″>

The above command will take some time to complete. After it is done you can then check created docker containers and their status using the docker ps command.

$ docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                  NAMES       
feb21b5e6c62        ansible/awx:13.0.0   "tini -- /usr/bin/la…"   3 minutes ago       Up 24 seconds       8052/tcp               awx_task    
423d8c6e4550        ansible/awx:13.0.0   "tini -- /bin/sh -c …"   3 minutes ago       Up 22 seconds       0.0.0.0:80->8052/tcp   awx_web     
11d2953d4f67        postgres:10          "docker-entrypoint.s…"   3 minutes ago       Up 22 seconds       5432/tcp               awx_postgres
724d5c4f8162        redis                "docker-entrypoint.s…"   3 minutes ago       Up 25 seconds       6379/tcp               awx_redis   

Step 4: Access AWX Web Interface

To have access to AWX web console, point your browser to your Ansible’s AWX server IP: http://your-server-ip-address. In case you changed the port configuration in the inventory file, then point your browser to http://your-server-ip-address:

You should be welcomed to a Login page well illustrated below.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-login-page-1.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="626" src="data:image/svg xml,” width=”913″>

Once open, enter the admin username and admin_password password that you specified in the inventory file. Once the authentication is successful, you’ll get to AWX administration dashboard. Therein, there is a lot of stuff to do and we shall cover just a few. Along the left side of the Dashboard is the navigation menu, where you can quickly navigate to your Projects, Inventories, Job Templates, and Jobs

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-login-dashboard-2-1024×523.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="472" src="data:image/svg xml,” width=”925″>

Step 5: Create User and Team

AWX provides a default user called admin that you can use to do your tests. But if you are need a different user, you can create another one.

To add a new user apart from the admin one you find by default, click on Users tab found on the left menu. A new page will be displayed where you can add a new user. Click on the green icon then fill in the details of the new user to be added.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-1-Create-a-new-user-to-add-to-organization-1-1024×519.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="468" src="data:image/svg xml,” width=”924″>

After you are done, click “Save“.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-Create-a-new-user-to-add-to-organization-1024×520.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="471" src="data:image/svg xml,” width=”928″>

The same applies for creating a new Team. Click on “Teams” tab found on the left menu. A new page will be displayed where you can add a new team. Click on the green icon then fill in the details of the new team to be added.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-1-Create-a-new-Team-to-add-to-organization-1024×520.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="470" src="data:image/svg xml,” width=”926″>

After you are done, click “Save“.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-2-Create-a-new-Team-to-add-to-organization-1024×520.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="467" src="data:image/svg xml,” width=”920″>

Step 6: Create an Organization

An organization is a logical collection of users, teams, projects, and inventories. It is the highest level object in the AWX object hierarchy. From the left navigation bar, click the Organizations icon. You will find that a default organization has been automatically created and is available to all users of Ansible AWX.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-dashboard-organization-3-1024×526.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="479" src="data:image/svg xml,” width=”933″>

It can be used as is or edited as needed. Let us edit it by changing its name and adding users, permissions and more.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-dashboard-organization-edit-4-1024×529.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="466" src="data:image/svg xml,” width=”904″>

Click on the “Users” tab and add a new user. I had not created a new user before, so admin default user appears. But you can create other users as shared in Step 5.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-dashboard-organization-add-user-5-1024×510.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="460" src="data:image/svg xml,” width=”924″>

If you had other users, they would be populated therein

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-dashboard-organization-add-user-6-1.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="471" src="data:image/svg xml,” width=”920″>

Clicking on Users displays all the Users associated with this Organization. A User is someone with access to Ansible AWX with associated roles and Credentials. Adding a user to an organization adds them as a member only, specifying a role for the user can be done in the the Permissions tab, as shown in the example below:

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Awx-ansible-dashboard-organization-add-permissions-7.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="631" src="data:image/svg xml,” width=”920″>

Step 7: Create credentials

In order for Ansible to log in and execute tasks, it will need credentials to access the remote hosts. AWX provides this feature for us. Click on “Credentials” on the left menu and then click the green to add a new server credential.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-1-Create-a-new-Credential-to-add-to-organization-1024×522.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="463" src="data:image/svg xml,” width=”909″>

Fill in the name, description, organization, username, password and the type of credential which is a long list. We shall choose machine since we intend to configure a single host in this example. You can add your ssh keys in case you prefer key-based authentication mechanism. Also add privilege escalation below to sudo.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-2-Create-a-new-Credential-to-add-to-organization-1024×603.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="539" src="data:image/svg xml,” width=”916″>

Click “Save” once done.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-3-Create-a-new-Credential-to-add-to-organization-done-1024×467.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="408" src="data:image/svg xml,” width=”895″>

Step 8: Create a new Inventory and add it to the Organization

An inventory is a collection of hosts managed by Ansible. Inventories are assigned to organizations, while permissions to launch playbooks against inventories are controlled at the user and/or team level.

To create and review existing inventories click the Inventories icon from the left navigation bar. To create a new inventory, click the add ( ) button and select Inventory from the drop-down menu list.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-1-Create-a-new-Inventory-to-add-to-organization-1024×527.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="460" src="data:image/svg xml,” width=”896″>

Enter the name and Organization that this Inventory will belong to. Click “Save” so that the other tabs can be activated.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-2-Create-a-new-Inventory-to-add-to-organization-1-1024×494.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="441" src="data:image/svg xml,” width=”915″>

For this example, we are going to add one host but know that you can create a group that contains one or more hosts you would wish to execute something on them simultaneously. Click on “Hosts” tab and click on to add a new host.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-3-Create-a-new-Inventory-host-to-add-to-organization-1024×480.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="431" src="data:image/svg xml,” width=”920″>

On the new page loaded, add an IP or resolvable hostname and a description. We are going to install nginx on the given host in this example thus the intuitive name.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-4-Create-a-new-Inventory-host-to-add-to-organization-1024×419.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="372" src="data:image/svg xml,” width=”911″>

Click “Save” once done and the new Inventory should be created.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-5-Click-on-the-new-Inventory-host-1024×510.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="454" src="data:image/svg xml,” width=”912″>

The concept of Groups and Hosts

Note that inventories are divided into groups and hosts. A group might represent a particular environment (e.g. “Datacenter 1” or “Testing Bed”), a server type (e.g. “Web Servers” or “DB Servers”), or any other representation of your environment.

Step 9: Setting up a Project

A Project is a logical collection of Ansible playbooks, represented in Ansible AWX. You can manage playbooks and playbook directories by either placing them manually under the Project Base Path on your Tower server, or by placing your playbooks into a source code management (SCM) system supported by Ansible AWX, including Git, Subversion, and Mercurial.

To create a new project, follow the same procedure as the rest we have seen thus far. Click on the “Projects” tab on the left menu and then click on add( ) to create a new project.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-1-Create-a-new-project-for-our-organization-1024×495.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="436" src="data:image/svg xml,” width=”902″>

Once there, fill the details to suit your needs. On the Source Control Manager (SCM) type, you can create a git repo that has all of your playbooks or create a local folder on your server as advised when you choose manual under SCM type. I preferred adding a git repo in this example. Note that we are still referring to the Organization of your choice in case you have several.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-2-Create-a-new-project-for-our-organization-1024×482.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="432" src="data:image/svg xml,” width=”918″>

Enter all the details then click “Save“. The file created on the git repo (nginx.yml) has the following:

---
- hosts: all
  gather_facts: true
  become: true
  become_user: root
  tasks:
    - apt:
        name: nginx
      when: ansible_os_family == "Debian"

Attached screenshot below:

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Nginx-Git-yaml.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="410" src="data:image/svg xml,” width=”751″>

Step 10: Setting up a template and launching it

Thus far, we have done a lot and what remains is putting it all together into a template. A job template combines an Ansible playbook from a project and the settings required to launch it. Create a new job template by clicking on “Templates” tab on the left navigation menu. Click on he green add ( ) to add a new template just like the others. When the window opens, it is just a matter of picking the Inventory, Project, Credential and Playbook we had already configured in the previous steps. Give your template a name and an optional description as well.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-7-Add-a-new-template-details-1024×488.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="444" src="data:image/svg xml,” width=”933″>

When done scroll down and hit “Save“. Once you save, you can “Launch” it as a job immediately.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/AWX-8-Add-a-new-template-details-save-and-launch-1024×516.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="467" src="data:image/svg xml,” width=”929″>

Once you hit Launch you will be redirected to the “Jobs” page where you will see it executing live with output being displayed as it happens.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Nginx-Playbook-running-1024×521.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="473" src="data:image/svg xml,” width=”930″>

If everything goes well, the playbook should be run successfully by Ansible behind the scenes. All errors encountered along the way will be displayed on the right side.

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Nginx-Playbook-successful-1024×459.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="421" src="data:image/svg xml,” width=”941″>

Login to the server being tested on and check if nginx was installed successfully

<img alt="" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/Nginx-in-debian10-running.png" data-ez ezimgfmt="rs rscb8 src ng ngcb8 srcset" height="492" src="data:image/svg xml,” width=”808″>

Amazing stuff, Ansible AWX installation is officially setup and running properly.

More about Ansible Tower | AWX can be found on RedHat’s Ansible Tower Quick Start Guide.

Ansible Learning courses:


<img alt="Ansible for the Absolute Beginner – Hands-On – DevOps" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/1209412_842c_6.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>

<img data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/icon_udemy-com.png5f22b4672c476.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>Udemy.com


<img alt="Ansible Advanced – Hands-On – DevOps" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/1313828_b0ab_2.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>

<img data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/icon_udemy-com.png5f22b4672c476.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>Udemy.com


<img alt="Master DevOps with Docker, Kubernetes and Azure DevOps" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/2813427_cc60_2.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>

<img data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/icon_udemy-com.png5f22b4672c476.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>Udemy.com


<img alt="DevOps Project: CI/CD with Jenkins Ansible Docker Kubernetes" data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/2499720_13da_14.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>

<img data-ezsrc="https://kirelos.com/wp-content/uploads/2020/07/echo/icon_udemy-com.png5f22b4672c476.jpg" ezimgfmt="rs rscb8 src ng ngcb8" src="data:image/svg xml,”>Udemy.com

Ansible can change the way you d your day to day administration tasks and it can offload a lot of manual work from your hands and gift you with ample time for other tasks. Leverage this technology as your innovation engine, and deliver your applications faster and win big.

Other electrifying guides you might enjoy include:

Manage Users and Groups on Linux using Ansible

How To Generate Linux User Encrypted Password for Ansible

Install Apache Tomcat 9 on Debian 10 With Ansible

How To Install Ansible AWX on Debian 10 (Buster)

Set up Ansible AWX on Ubuntu Linux

Deploy Kubernetes Cluster with Ansible & Kubespray