While most of the prerequisites are met for my automated server setup I came across some issues when I started with my very first Ansible playbooks.
First Ansible Playbooks
First of all, I wanted to start with a quite simple ping playbook, to ensure the servers are reachable by Ansible.
# Playbook to ping all hosts --- - hosts: all gather_facts: false tasks: - ping:
When I run this script I was immediately confronted with the very first error. I really love when such things happen. Nothing can motivate one more than immediate failures like the following.
FAILED! => { "changed": false, "module_stderr": "Shared connection to xxx.xxx.xxx.xxx closed.\r\n", "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127 }
As I started with a minimal Ubuntu 18.04 LTS installation, there is simply no Python 2 installed. However, to run the Ansible tasks on the node, Python is required. I made use of the raw task in Ansible to update the package lists as well as install the package python-minimal. In addition, I added the package python2.7-apt in this bootstraper as it is needed later on. Once Python has been installed the ping playbook worked without any problems.
# Bootstrap playbook to install python 2 and python-apt # It checks first so no unecessary apt updates are performed --- - hosts: all gather_facts: False tasks: - name: install python 2 raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) - name: install python-apt raw: test -e /usr/lib/python2.7/dist-packages/apt || (apt install -y python2.7-apt)
For both packages, I test for the corresponding directories on the node to avoid unnecessary updates.
Note: When testing for a directory on the shell the following line became very handy:
> [ -e /usr/lib/python2.7/dist-packages/apt ] && echo "Found" || echo "Not found"
At a second step, I created a maintenance playbook to update and upgrade the packages on my node.
# Playbook to update Ubuntu packages --- - hosts: all gather_facts: false tasks: - name: update and upgrade apt packages become: true apt: upgrade: yes update_cache: yes cache_valid_time: 86400
Before including the pyhton-apt package to the bootstraper, I got the following error when dry running the playbook.
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"changed": false, "msg": "python-apt must be installed to use check mode. If run normally this module can auto-install it."}
Conclusion
While this is not any rocket science for sure, I now have a few essential scripts to bring my server to a base level I can start working with.