After creating my Jenkins container I thought it would be fun to run Ansible Tower in a container so I created a simple Dockerfile. First you need find out the latest Ansible Tower version: https://releases.ansible.com/ansible-tower/setup/ and update the version variable in the Dockerfile.
Here is my Dockerfile:
... ARG ANSIBLE_TOWER_VER=3.3.1-1 ...
The passwords can be changed in the inventory file:
... [all:vars] admin_password='<-your-password->' ... pg_password='<-your-password->' ... rabbitmq_password='<-your-password->' ...
Let’s start by building the container:
git clone https://github.com/berndonline/ansible-tower-docker.git && cd ansible-tower-docker/ docker build -t berndonline/ansible-tower .
The docker build will take a few minutes, just wait and look out for errors you might have in the build:
berndonline@lab:~$ git clone https://github.com/berndonline/ansible-tower-docker.git Cloning into 'ansible-tower-docker'... remote: Enumerating objects: 17, done. remote: Counting objects: 100% (17/17), done. remote: Compressing objects: 100% (11/11), done. remote: Total 17 (delta 4), reused 14 (delta 4), pack-reused 0 Unpacking objects: 100% (17/17), done. berndonline@lab:~$ cd ansible-tower-docker/ berndonline@lab:~/ansible-tower-docker$ docker build -t berndonline/ansible-tower . Sending build context to Docker daemon 87.04kB Step 1/31 : FROM ubuntu:16.04 16.04: Pulling from library/ubuntu 7b8b6451c85f: Pull complete ab4d1096d9ba: Pull complete e6797d1788ac: Pull complete e25c5c290bde: Pull complete Digest: sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39 Status: Downloaded newer image for ubuntu:16.04 ---> a51debf7e1eb Step 2/31 : USER root ---> Running in cf5d606130cc Removing intermediate container cf5d606130cc ---> d5b11ed84885 Step 3/31 : WORKDIR /opt ---> Running in 1e6703cec6db Removing intermediate container 1e6703cec6db ---> 045cf04ebc1d Step 4/31 : ARG ANSIBLE_TOWER_VER=3.3.1-1 ---> Running in 6d65bfe370d4 Removing intermediate container 6d65bfe370d4 ---> d75c246c3a5c Step 5/31 : ARG PG_DATA=/var/lib/postgresql/9.6/main ---> Running in e8856051aa92 Removing intermediate container e8856051aa92 ---> 02e6d7593df8 ... PLAY [Install Tower isolated node(s)] ****************************************** skipping: no hosts matched PLAY RECAP ********************************************************************* localhost : ok=125 changed=64 unreachable=0 failed=0 The setup process completed successfully. Setup log saved to /var/log/tower/setup-2018-11-21-20:21:37.log Removing intermediate container ad6401292444 ---> 8f1eb28f16cb Step 27/31 : ADD entrypoint.sh /entrypoint.sh ---> 8503e666ce9c Step 28/31 : RUN chmod +x /entrypoint.sh ---> Running in 8b5ca24a320a Removing intermediate container 8b5ca24a320a ---> 60810dc2a4e3 Step 29/31 : VOLUME ["${PG_DATA}", "${AWX_PROJECTS}","/certs"] ---> Running in d836e5455bd5 Removing intermediate container d836e5455bd5 ---> 3968430a1814 Step 30/31 : EXPOSE 80 ---> Running in 9a72815e365b Removing intermediate container 9a72815e365b ---> 3613ced2a80c Step 31/31 : ENTRYPOINT ["/entrypoint.sh", "ansible-tower"] ---> Running in 4611a90aff1a Removing intermediate container 4611a90aff1a ---> ce89ea0753d4 Successfully built ce89ea0753d4 Successfully tagged berndonline/ansible-tower:latest
Continue to create a Docker Volume container to store the Postgres database:
sudo docker create -v /var/lib/postgresql/9.6/main --name tower-data berndonline/ansible-tower /bin/true
Start the Ansible Tower Docker container:
sudo docker run -d -p 32456:80 --volumes-from tower-data --name ansible-tower --privileged --restart berndonline/ansible-tower
Afterwards you can connect to http://<your-ip-address>:32456/ and import your Tower license. Ansible provides a free 10 node license which you can request here: https://www.ansible.com/license.
The Ansible Tower playbook installs an Nginx reverse proxy and you can enable SSL by setting the variable nginx_disable_https to false in the inventory file, and publish the container via 443 instead of 80.
Please share your feedback and leave a comment.