Imagine you work on an application on a development server for several months until it is time to deploy it to a production system for the first time. Chances are, there are several necessary configuration tasks just waiting to be forgotten: firewall permissions, specific software libraries, file permissions and so on.
Ansible offers a reproducible and automatable way to take care of these configurational changes for you – and the beauty is: it does not depend on a specific Linux flavour and it works both for single-machine deployments and distributed systems.
If you were never wondering why your application exits with an HTTP error until you have noticed that the cache folder did not have the correct permissions, stop reading; if you have never forgotten which libraries you had to apt-get install
before the Makefile finally completed without errors, this is not the guide for you. Otherwise, see how a simple 50 line yml file can take care of your deployment challenges.
tl;dr – the Ansible Script
This script demonstrates how to fetch and build Kismet (as explained in Install Kismet on Ubuntu 19.04 from Source).
--- - name: Deploy hosts: localhost tasks: - name: Install necessary tools and libraries apt: name: "{{ packages }}" vars: packages: - git - build-essential - libmicrohttpd-dev - pkg-config - zlib1g-dev - libnl-3-dev - python-protobuf - python-requests - librtlsdr0 - python-usb - python-paho-mqtt - libusb-1.0-0-dev - libsqlite3-dev - protobuf-compiler - protobuf-c-compiler - libsensors4-dev - python - python-setuptools - libnl-genl-3-dev - libcap-dev - libpcap-dev - libnm-dev - libdw-dev - libprotobuf-dev - libprotobuf-c-dev - net-tools become: yes - name: Download source files from github git: repo: https://github.com/kismetwireless/kismet.git dest: /tmp/kismet - name: Configure command: ./configure args: chdir: /tmp/kismet - name: Run make as root make: chdir: /tmp/kismet become: yes - name: Run make with target suidinstall make: chdir: /tmp/kismet become: yes target: suidinstall
Running it will generate the following output:
admin@instance-1:~$ ansible-playbook deploy.yml [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' [WARNING]: Ignoring invalid attribute: target PLAY [Deploy] ************************************************************************************************************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************************************************************************************************************************************************************************************************************** ok: [localhost] TASK [Install necessary tools and libraries] ******************************************************************************************************************************************************************************************************************************************************************************************* ok: [localhost] TASK [Download source files from github] *********************************************************************************************************************************************************************************************************************************************************************************************** ok: [localhost] TASK [Configure] *********************************************************************************************************************************************************************************************************************************************************************************************************************** changed: [localhost] TASK [Run make as root] **************************************************************************************************************************************************************************************************************************************************************************************************************** changed: [localhost] TASK [Run make with target suidinstall] ************************************************************************************************************************************************************************************************************************************************************************************************ changed: [localhost] PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************************************************************************************** localhost : ok=6 changed=3 unreachable=0 failed=0
Explanation
There are five steps in the ansible playbook:
- Install the necessary tools and libraries for the build process
- Fetch the sources from git
- Run configure
- Run make
- Run make suidinstall
Since ansible is idempotent, the playbook can be run multiple times and each step will guarantee a valid outcome (e.g., if the libraries are already installed, nothing will happen).
Use this ansible script as a starting point to create your own deployment pipeline and create an application server from scratch with your exact specifications in a matter of minutes.
Leave a Reply