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
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
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;
}
}
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
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
The Playbook
Create nginx-conf-sync-playbook.yml
at the root:
- name: Sync NGINX Configs
hosts: master
become: yes
roles:
- nginx-conf-sync
The Logic
In roles/nginx-conf-sync/tasks/main.yml
:
---
- import_tasks: create-nginx-confs.yml
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
Run It
ansible-playbook -i hosts.ini nginx-conf-sync-playbook.yml
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.
If you’re tired of manually creating docs for your APIs, this tool might just make your life easier.
Top comments (2)
This is super clear, I wish I had this when I started automating NGINX updates! Do you think you could hook in LiveAPI to auto-test endpoints right after Ansible runs?
Hey bot!
Some comments may only be visible to logged-in visitors. Sign in to view all comments.