From charlesreid1

 
(21 intermediate revisions by the same user not shown)
Line 1: Line 1:
=Example: Secure Nginx Server=
=Overview=


This page walks through a procedure resulting in the following files:
The Ansible documentation has a nice overview of playbooks: https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html


<pre>
==Brief Notes==
    playbooks/ansible.cfg
    playbooks/hosts
    playbooks/Vagrantfile
    playbooks/web-notls.yml
    playbooks/web-tls.yml
    playbooks/files/nginx.key
    playbooks/files/nginx.crt
    playbooks/files/nginx.conf
    playbooks/templates/index.html.j2
    playbooks/templates/nginx.conf.j2
</pre>


==Port configuration (Vagrantfile)==
===Playbooks===


We want to arrange the Vagrant machine so that we map the local port 8080 to the vagrant machine's port 80, and map the local port 8443 to the vagrant machine's port 443.
* playbooks are a way of executing commands on remote machines in a scripted way
* can orchestrate multiple ordered processes
* playbooks are written in YAML
* each playbook can contain one or more plays
* each play will target different servers (maybe all of them, maybe just web servers, maybe just db servers)
* user specifies hosts - remote machines on which Ansible will run commands
* users - the remote user is the user that Ansible will run the particular task as


The Vagrantfile is a Ruby file that specifies how to start up and set up the Vagrant boxes. The Vagrantfile should be modified as follows:
===Tasks===


<pre>
* each play has a list of tasks associated with it
VAGRANTFILE_API_VERSION = "2"
* tasks are executed in order on all machines that match the host pattern
* ansible completes the task on all remote machines before it moves on to the next task


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
===Handlers===
  config.vm.box = "ubuntu/xenial64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "forwarded_port", guest: 443, host: 8443
end
</pre>


Now instruct vagrant to reload from the Vagrantfile:
* handlers are "conditional tasks" - tasks that are triggered by other tasks
* the handlers are triggered once at the end of each block of tasks - this keeps them from being restarted over and over by a set of related tasks


<pre>
===Roles===
$ vagrant reload


==> default: Forwarding ports...
* Roles are just a way of automatically loading variables, tasks, and task handlers.
    default: 80 => 8080 (adapter 1)
* Roles use a known file structure to load appropriate vars/tasks/handlers
    default: 443 => 8443 (adapter 1)
* A given play will specify a list of roles in the playbook - this indicates that ansible should look for variables/tasks/handlers that match up with those roles, and add them to the play
    default: 22 => 2222 (adapter 1)
* Roles can be dependent on other roles (that's the purpose of the "meta" yaml file)
</pre>


==Simple playbook==
Example:
* the following playbook entry will automatically populate the play with a list of variables, tasks, and handlers from the roles subdirectory
* the roles subdirectory will contain two subdirectories, common and web, with files for those roles


Here is a simple playbook for our secure nginx server:
<pre>
---
# playbook.yml
- name: example play
  hosts: webservers
  roles:
  - common
  - web
</pre>


'''<code>web-notls.yml</code>:'''
===Tags===


<pre>
* Tags are a way of only running part of your playbook
- name: Configure webserver with nginx
* Think of tags as a filtering operation
  hosts: webservers
  become: True
  tasks:
    - name: install nginx
      apt: name=nginx update_cache=yes


    - name: copy nginx config file
===Idempotence===
      copy: src=files/nginx.conf dest=/etc/nginx/sites-available/default


    - name: enable configuration
* idempotent means you can run it multiple times with the same outcome as running it one time
      file: >
* modules should check whether the desired final state has already been achieved, and exit without doing anything if so
        dest=/etc/nginx/sites-enabled/default
        src=/etc/nginx/sites-available/default
        state=link


    - name: copy index.html
=Example: Secure Nginx Server=
      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html
        mode=0644


    - name: restart nginx
[[Ansible/Nginx Playbook]] - a page that walks through two example playbooks
      service: name=nginx state=restarted
</pre>


* [https://charlesreid1.com/wiki/Ansible/Nginx_Playbook#Ansible_Playbook_Example_1:_Nginx_Server_Playbook Example 1: nginx server playbook]
* [https://charlesreid1.com/wiki/Ansible/Nginx_Playbook#Ansible_Playbook_Example_2:_Secure_Nginx_Server_Playbook Example 2: secure nginx server playbook]


YAML truthy: <code>true, True, TRUE, yes, Yes, YES, on, On, ON, y, Y</code>
=Full Stack Example: Django Celery RabbitMQ Postgres=


YAML falsey: <code>false, False, FALSE, no, No, NO, off, Off, OFF, n, N</code>
[[Ansible/Full Stack Playbook]] - a page that walks through a playbook for a full stack example


=Flags=
=Flags=


[[Category:Ansible]]
{{AnsibleFlag}}
[[Category:Infrastructure]]
 
[[Category:Python]]
[[Category:Ansible Playbooks]]

Latest revision as of 17:00, 10 December 2018

Overview

The Ansible documentation has a nice overview of playbooks: https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html

Brief Notes

Playbooks

  • playbooks are a way of executing commands on remote machines in a scripted way
  • can orchestrate multiple ordered processes
  • playbooks are written in YAML
  • each playbook can contain one or more plays
  • each play will target different servers (maybe all of them, maybe just web servers, maybe just db servers)
  • user specifies hosts - remote machines on which Ansible will run commands
  • users - the remote user is the user that Ansible will run the particular task as

Tasks

  • each play has a list of tasks associated with it
  • tasks are executed in order on all machines that match the host pattern
  • ansible completes the task on all remote machines before it moves on to the next task

Handlers

  • handlers are "conditional tasks" - tasks that are triggered by other tasks
  • the handlers are triggered once at the end of each block of tasks - this keeps them from being restarted over and over by a set of related tasks

Roles

  • Roles are just a way of automatically loading variables, tasks, and task handlers.
  • Roles use a known file structure to load appropriate vars/tasks/handlers
  • A given play will specify a list of roles in the playbook - this indicates that ansible should look for variables/tasks/handlers that match up with those roles, and add them to the play
  • Roles can be dependent on other roles (that's the purpose of the "meta" yaml file)

Example:

  • the following playbook entry will automatically populate the play with a list of variables, tasks, and handlers from the roles subdirectory
  • the roles subdirectory will contain two subdirectories, common and web, with files for those roles
---
# playbook.yml
- name: example play
  hosts: webservers
  roles:
   - common
   - web

Tags

  • Tags are a way of only running part of your playbook
  • Think of tags as a filtering operation

Idempotence

  • idempotent means you can run it multiple times with the same outcome as running it one time
  • modules should check whether the desired final state has already been achieved, and exit without doing anything if so

Example: Secure Nginx Server

Ansible/Nginx Playbook - a page that walks through two example playbooks

Full Stack Example: Django Celery RabbitMQ Postgres

Ansible/Full Stack Playbook - a page that walks through a playbook for a full stack example

Flags