Sync NGINX Configs with Ansible
Athreya aka Maneshwar

Athreya aka Maneshwar @lovestaco

About: Technical Writer | 200k+ Reads | i3 x Mint | Learning, building, improving, writing :)

Joined:
Jan 5, 2023

Sync NGINX Configs with Ansible

Publish Date: Jun 7
11 3

Hi there! I'm Maneshwar. Right now, I’m building LiveAPI, a first-of-its-kind tool for helping you automatically index API endpoints across all your repositories. LiveAPI helps you discover, understand, and use APIs in large tech infrastructures with ease.


You know the pain: updating NGINX config files on a remote server, reloading NGINX, making sure you didn't fat-finger anything... and repeating it across environments. Let’s automate that away with Ansible.

Project Structure

Start by initializing a role:

ansible-galaxy init roles/nginx-conf-sync
Enter fullscreen mode Exit fullscreen mode

Here’s the resulting layout:

hex-ansible
├─ README.md
├─ hosts.ini 
├─ nginx-conf-sync-playbook.yml
├─ nginx-purge-playbook.yml
└─ roles
   └─ nginx-conf-sync
      ├─ defaults/main.yml
      ├─ files/
      │  ├─ blog.dev.to
      │  ├─ dev.to
      │  └─ api.dev.to
      ├─ handlers/main.yml
      ├─ meta/main.yml
      ├─ tasks/main.yml
      ├─ tasks/create-nginx-confs.yml
      ├─ templates/
      ├─ tests/
      │  ├─ inventory
      │  └─ test.yml
      └─ vars/main.yml
Enter fullscreen mode Exit fullscreen mode

Put your actual NGINX site config files inside the files/ folder. Example file: files/blog.dev.to:

server {
    listen 80;
    server_name blog.dev.to;

    access_log  /var/log/nginx/nginx_access.log;
    error_log   /var/log/nginx/nginx_error.log  debug;

    location / {
        include proxy_params;
        proxy_pass http://127.1.22.71:9080;
    }
}
Enter fullscreen mode Exit fullscreen mode

The Inventory File

This is your hosts.ini:

[master]
master ansible_host=128.122.213.172 ansible_user=root ansible_ssh_private_key_file=~/.ssh/secret.txt
Enter fullscreen mode Exit fullscreen mode

Make sure you can SSH into the machine using that key.

defaults/main.yml

This lets you declare which config files to sync:

---
nginx_conf_domains:
  - blog.dev.to
  - dev.to
  - api.dev.to
Enter fullscreen mode Exit fullscreen mode

The Playbook

Create nginx-conf-sync-playbook.yml at the root:

- name: Sync NGINX Configs
  hosts: master
  become: yes
  roles:
    - nginx-conf-sync
Enter fullscreen mode Exit fullscreen mode

The Logic

In roles/nginx-conf-sync/tasks/main.yml:

---
- import_tasks: create-nginx-confs.yml
Enter fullscreen mode Exit fullscreen mode

And the real deal in create-nginx-confs.yml:

---
- name: Ensure NGINX config directory exists
  file:
    path: "/etc/nginx/sites-available"
    state: directory

- name: Ensure NGINX enabled directory exists
  file:
    path: "/etc/nginx/sites-enabled"
    state: directory

- name: Create .htpasswd file for basic auth
  copy:
    dest: /etc/nginx/.htpasswd
    content: |
      hexmos:$apr1$v5j1xXVg$i6XGv4RoQGT2FwqpKsJcs0
    owner: root
    group: root
    mode: "0640"

- name: Sync nginx conf files
  copy:
    src: "{{ item }}"
    dest: "/etc/nginx/sites-available/{{ item }}"
  with_items: "{{ nginx_conf_domains }}"

- name: Create symlinks in sites-enabled
  file:
    src: "/etc/nginx/sites-available/{{ item }}"
    dest: "/etc/nginx/sites-enabled/{{ item }}"
    state: link
    force: yes
  with_items: "{{ nginx_conf_domains }}"

- name: Reload nginx
  service:
    name: nginx
    state: reloaded
Enter fullscreen mode Exit fullscreen mode

Run It

ansible-playbook -i hosts.ini nginx-conf-sync-playbook.yml
Enter fullscreen mode Exit fullscreen mode

Boom. Your NGINX configs are in place, symlinked, and NGINX is reloaded.

TL;DR

Ansible makes syncing NGINX config files effortless and repeatable. Dump your config files in the role, declare them in defaults, run the playbook, and you’re good to go.


LiveAPI helps you get all your backend APIs documented in a few minutes

With LiveAPI, you can quickly generate interactive API documentation that allows users to search and execute APIs directly from the browser.

Image description

If you’re tired of manually creating docs for your APIs, this tool might just make your life easier.

Comments 3 total

Add comment