Personal DevOps #3
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.


