Ansible Nginx Playbook

With the last post related to Ansible, I present a simple example of using templates and playbook.
The directory structure of Ansible Nginx playbook:

  - template/ 
  - tasks

Here’s the nginx-ubuntu.yml


- hosts: web-servers
  user: ubuntu 
  sudo: True

     #workers: use at template ansible_processor_count 
     connections : "1024" 

     is_10_up: "'$ansible_distribution_version'  >= '10.04'"
     is_ubuntu: "'$ansible_distribution' == 'Ubuntu'"

     # Note: these tasks can be written to a file 
     #       and include that file here to make it cleaner.
     - name: install python-software-properties
       action: apt pkg='python-software-properties' ensure=installed

     - name: "add nginx ppa if it ubuntu 10.04 and up"
       action: command /usr/bin/add-apt-repository -y ppa:nginx/stable
       only_if: '$is_ubuntu and $is_10_up'

     - name: update apt repo
       action: command /usr/bin/apt-get update

     - name: install nginx 
       action: apt pkg=nginx ensure=installed

     - name: write nginx.conf 
       action: template src=templates/nginx.j2 dest=/etc/nginx/nginx.conf
       - restart nginx

     - name: restart nginx
       action: service name=nginx state=restarted

Here, the template is using generated variable ansible_processor_count and a user-defined variable connections on playbook.
The template file: templates/nginx.j2

user www-data;
worker_processes {{ ansible_processor_count }};

pid /var/run/;

events {
	worker_connections {{ connections }} ;
	# multi_accept on;

http {

	# Basic Settings

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	# Logging Settings

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	# Gzip Settings

	gzip on;
	gzip_disable "msie6";

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

	# If HTTPS, then set a variable so it can be passed along.

	map $scheme $server_https {
		default off;
		https on;

	# Virtual Host Configs

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;

I run this against Ubuntu Oneiric.

(ansi_env) ansible-playbook nginx-ubuntu.yml -T 30 
PLAY [web-servers] ****************************

SETUP PHASE ****************************

ok: [15.185.123.x]

TASK: [install python-software-properties] *********

ok: [15.185.123.x] => apt pkg='python-software-properties' ensure=installed

TASK: [add nginx ppa if it ubuntu 10.04 and up] *********

ok: [15.185.123.x] => command /usr/bin/add-apt-repository -y ppa:nginx/stable

TASK: [update apt repo] *********

ok: [15.185.123.x] => command /usr/bin/apt-get update

TASK: [install nginx] *********

ok: [15.185.123.x] => apt pkg=nginx ensure=installed

TASK: [write nginx.conf] *********

ok: [15.185.123.x] => template src=/home/ubuntu/.ansible/tmp/ansible.pVJ9lH/source dest=/etc/nginx/nginx.conf

NOTIFIED: [restart nginx] **********

ok: [15.185.123.x] => service name=nginx state=restarted

PLAY RECAP **********************

15.185.123.x                 : ok=   7 changed=   4 unreachable=   0 failed=   0 

Although this prompts for error on the current devel branch of Ansible, there’s a minor fix for it.

That solves the Nginx restarts when the config file is updated. 🙂
Update: 05/04/2012 service path now fixed on devel branch.
Update: 05/07/2012 I’ve placed this playbook on my github.
Update: 06/14/2012 Added Fred’s Pedantically commented playbook example
Update: 07/10/2012 On version 0.5 service unable to get status

Related examples:
Fred Alger: Pedantically commented playbook example

Leave a Reply

Your email address will not be published. Required fields are marked *