Top Banner
RACKSPACE® HOSTING | WWW.RACKSPACE.COM [email protected]. uk Brown bag - Crash course Automation makes IT better @soldasimo simonesoldatesc hi
66

Ansible - Crash course

Aug 27, 2014

Download

Software

Ansible and Configuration Management basics.
How to use and write inventory file and simple playbooks to deploy basic LAMP stack.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Brown bag - Crash courseAutomation makes IT better

@soldasimo

simonesoldateschi

Page 2: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Agenda

● Presentation (20’)o The basicso Playbookso Sharing code

● Q&A (5’)● Quiz (5’)

Page 3: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

The basics

Installation on management host:

$ pip install ansible

That’s it!

Page 4: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

The basics

Installing agent onmanaged hosts:

Page 5: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

The basics

Can be as simple as:

mail.example.comor:

10.1.157.183

Create an inventory file

Page 6: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

The basics

Is host alive?

$ ansible -i ~/etc/hosts all -m ping

Ansible - Quickstart

ss-dfw-00 | success >> { "changed": false, "ping": "pong"}

Page 7: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

The basics

Tons of servers to run commands on?$ ansible -i ~/etc/hosts all -m shell -a 'df -h'

Ansible - Quickstart

ss-dfw-00 | success | rc=0 >>Filesystem Size Used Avail Use% Mounted onrootfs 20G 1.6G 18G 9% /udev 10M 0 10M 0% /dev...

Page 8: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

A few facts about Ansible

Page 9: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

A few facts about Ansible● open-source

● free-software (GPL v3)

● written in Python

● agent-less

● push model ← K.I.S.S.

● commercial version

...OK, SSH is an agent ;)

● enterprise support, SLA, …

Page 10: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Why use ansible?

Automate repetitive tasks

Page 11: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory

Page 12: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts and Groupsmail.example.com10.1.157.183[webservers]foo.example.combar.example.com

[dbservers]one.example.comtwo.example.comthree.example.com

$ ansible -i /path/to/inventory \GROUP_NAME …

Page 13: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts and Groups

ss-dfw-0010.182.37.244

$ ansible -i ~/etc/hosts all --sudo -m command -a 'aptitude update' ss-dfw-00 | success | rc=0 >>Get: 1 http://mirror.rackspace.com wheezy Release.gpg [1672 B]Get: 2 http://mirror.rackspace.com wheezy/updates Release.gpg [836 B]Get: 3 http://mirror.rackspace.com wheezy-backports Release.gpg [836 B]…

Page 14: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts and Groups

[webservers]foo.example.combar.example.com

[dbservers]one.example.comtwo.example.comthree.example.com

Page 15: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts and Groups

$ ansible -i hosts webserver -f10 \-m command \-a ‘aptitude install apache2’

[webservers]foo.example.combar.example.com

[dbservers]one.example.comtwo.example.comthree.example.com$ ansible -i hosts dbserver -f10 \

-m command \-a ‘aptitude install mysql’

Page 16: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts and Groups

[webservers]foo.example.combar.example.com

[dbservers]foo.example.com

Page 17: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts and Groups

[webservers]www[01:10].example.combar.example.com

[dbservers]db-[a:f].example.com

Page 18: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Inventory - Hosts variables

[atlanta]host1 http_port=80 maxRequestsPerChild=808host2 http_port=303 maxRequestsPerChild=909

Page 19: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

ModulesWhat can modules do?

● run commands● transfer files● install packages● manage daemons● manage users and groups

● gather facts● deploy software with SCM● manage DBs (MySQL,

PostgreSQL, MongoDB, Redis, …)

● manage Cloud devices

See:http://docs.ansible.com/modules_by_category.html

Page 20: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Desired State

Go live!

Page 21: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Desired state

Write code to tell the computerhow to set up itself!

Page 22: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Agenda

● Presentation (20’)o The basicso Playbookso Sharing code

● Q&A (5’)● Quiz (5’)

Page 23: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks● Contain one or more plays● Written in YAML

○ declarative config○ not code

● Executed in the order it is written (aka Imperative)

Page 24: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks---

- name: deploy web server user: foouser sudo: True hosts: all

tasks: - name: install apache apt: pkg=apache2-mpm-prefork state=latest

Page 25: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks---

- name: deploy web server user: foouser sudo: True hosts: all

tasks: - name: install apache apt: pkg=apache2-mpm-prefork state=latest

Page 26: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks---

- name: deploy web server user: foouser sudo: True hosts: all

tasks: - name: install apache apt: pkg=apache2-mpm-prefork state=latest

Inventory

Page 27: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks---

- name: deploy web server user: foouser sudo: True hosts: all

tasks: - name: install apache apt: pkg=apache2-mpm-prefork state=latest

Page 28: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks---

- name: deploy web server user: foouser sudo: True hosts: all

tasks: - name: install apache apt: pkg=apache2-mpm-prefork state=latest

DocumentationArguments

Module

Page 29: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - output$ ansible-playbook -i ~/etc/hosts main.yml

PLAY [deploy web server] ******************************************************

GATHERING FACTS *************************************************************** ok: [ss-dfw-00]

TASK: [install apache] ******************************************************** changed: [ss-dfw-00]

PLAY RECAP ******************************************************************** ss-dfw-00 : ok=2 changed=1 unreachable=0 failed=0

foouser@ss-dfw-00:~$ sudo netstat -putan | grep 80 tcp6 0 0 :::80 :::* LISTEN 11306/apache2

Desired state

Page 30: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - output$ ansible-playbook -i ~/etc/hosts main.yml

PLAY [deploy web server] ******************************************************

GATHERING FACTS *************************************************************** ok: [ss-dfw-00]

TASK: [install apache] ******************************************************** changed: [ss-dfw-00]

PLAY RECAP ******************************************************************** ss-dfw-00 : ok=2 changed=1 unreachable=0 failed=0

foouser@ss-dfw-00:~$ sudo netstat -putan | grep 80 tcp6 0 0 :::80 :::* LISTEN 11306/apache2

NOT Desired state

Page 31: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks

Idempotency

1 * N 0 + N

Page 32: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - output$ ansible-playbook -i ~/etc/hosts main.yml

PLAY [deploy web server] ******************************************************

GATHERING FACTS *************************************************************** ok: [ss-dfw-00]

TASK: [install apache] ******************************************************** ok: [ss-dfw-00]

PLAY RECAP ******************************************************************** ss-dfw-00 : ok=2 changed=0 unreachable=0 failed=0

Idempotency

Page 33: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Conditionals--- ... tasks: - name: install apache on Debian based distros apt: pkg=apache2-mpm-prefork state=latest when: ansible_os_family=="Debian"

- name: install apache on Red-Hat based distros yum: pkg=httpd state=latest when: ansible_os_family=="RedHat"

Page 34: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Conditionals--- ... tasks: - name: install apache on Debian based distros apt: pkg=apache2-mpm-prefork state=latest when: ansible_os_family=="Debian"

- name: install apache on Red-Hat based distros yum: pkg=httpd state=latest when: ansible_os_family=="RedHat"

Page 35: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Includes--- ... tasks: - include: apache_debian.yml when: ansible_os_family=="Debian"

- include: apache_redhat.yml when: ansible_os_family=="RedHat"

Page 36: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Includes--- ... tasks: - include: apache_debian.yml when: ansible_os_family=="Debian"

- include: apache_redhat.yml when: ansible_os_family=="RedHat"

Page 37: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Includes

---# apache_debian.yml

tasks: - name: install apache on Debian based distros apt: pkg=apache2-mpm-prefork state=latest

Page 38: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Includes

---# apache_redhat.yml

tasks: - name: install apache on Red-Hat based distros yum: pkg=httpd state=latest

Page 39: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMP

Let’s deploy LAMP with Ansible!

Page 40: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Groups of servers

webservers dbservers

Page 41: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMP

Inventory file

[webservers]web0web1

[dbservers]db0

Page 42: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMP

roles

common

db

web

lamp_simple

---# This playbook deploys the whole application stack in this site.

- name: apply common configuration to all nodes hosts: all user: root

roles: - common

- name: configure and deploy the webservers and application code hosts: webservers user: root

roles: - web

- name: deploy MySQL and configure the databases hosts: dbservers user: root

roles: - db

Page 43: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMP

roles

common

db

web

lamp_simple

---# This playbook deploys the whole application stack in this site.

- name: apply common configuration to all nodes hosts: all user: root

roles: - common

- name: configure and deploy the webservers and application code hosts: webservers user: root

roles: - web

- name: deploy MySQL and configure the databases hosts: dbservers user: root

roles: - db

Page 44: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMP

roles

common

db

web

lamp_simple

---# This playbook deploys the whole application stack in this site.

- name: apply common configuration to all nodes hosts: all user: root

roles: - common

- name: configure and deploy the webservers and application code hosts: webservers user: root

roles: - web

- name: deploy MySQL and configure the databases hosts: dbservers user: root

roles: - db

Page 45: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMPcommon

tasks

db

tasks

web

tasksplaybooks

Page 46: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMPcommon

tasks

---# This playbook contains common plays that will be run on all nodes.

- name: Install ntp yum: name=ntp state=present tags: ntp

- name: Configure ntp file template: src=ntp.conf.j2 dest=/etc/ntp.conf tags: ntp notify: restart ntp…

Page 47: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMPdb

tasks

---# This playbook will install mysql# and create db user and give permissions.

- name: Install Mysql package yum: name={{ item }} state=installed with_items: - mysql-server - MySQL-python - libselinux-python - libsemanage-python…

Page 48: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Playbooks - Deploy LAMPweb

tasks

---# These tasks install http and the php modules.

- name: Install http and php etc yum: name={{ item }} state=present with_items: - httpd - php - php-mysql - …

- name: insert iptables rule for httpd lineinfile: dest=/etc/sysconfig/iptables create=yes state=present regexp="{{ httpd_port }}" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport {{ httpd_port }} -j ACCEPT" notify: restart iptables…

Page 49: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Best practices - Directory layoutsite.yml # master playbookwebservers.yml # playbook for webserver tierdbservers.yml # playbook for dbserver tier

roles/ common/ # this hierarchy represents a "role" tasks/ # main.yml # <-- tasks file can include smaller files if warranted handlers/ # main.yml # <-- handlers file templates/ # <-- files for use with the template resource ntp.conf.j2 # <------- templates end in .j2 files/ # bar.txt # <-- files for use with the copy resource foo.sh # <-- script files for use with the script resource vars/ # main.yml # <-- variables associated with this role

webtier/ # same kind of structure as "common" was above, done for the webtier role monitoring/ # "" fooapp/ # ""

Page 50: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Agenda

● Presentation (20’)o The basicso Playbookso Sharing code

● Q&A (5’)● Quiz (5’)

Page 51: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Sharing playbooks

Page 52: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Sharing playbooks

Page 53: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Sharing playbooks

$ git clone https://github.com/ansible/ansible-examples

Cloning into 'ansible-examples'...remote: Reusing existing pack: 1698, done.remote: Total 1698 (delta 0), reused 0 (delta 0)Receiving objects: 100% (1698/1698), 3.73 MiB | 296.00 KiB/s, done.Resolving deltas: 100% (355/355), done.Checking connectivity... done

Page 54: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Sharing playbooks

$ ansible-playbook -i ~/etc/hosts lamp_simple/site.yml

Page 55: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Sharing playbooks

Page 56: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Sharing code

Page 57: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Page 58: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Agenda

● Presentation (20’)o The basicso Playbookso Git repositories

● Q&A (5’)● Quiz (5’)

Page 59: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Page 60: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Agenda

● Presentation (20’)o The basicso Playbookso Git repositories

● Q&A (5’)● Quiz (5’)

Page 61: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Quiz

Page 62: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Give your feedback!

Page 63: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

ReferencesAnsible Workshttp://www.ansible.com/home

Ansible Documentationhttp://docs.ansible.com/index.html

Ansible source codehttps://github.com/ansible/ansible

Ansible exampleshttps://github.com/ansible/ansible-examples

Best practiceshttp://docs.ansible.com/playbooks_best_practices.html

Page 64: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Homework

● Replay examples● commit result to GitHub● send me a message

Page 65: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

Page 66: Ansible - Crash course

RACKSPACE® HOSTING | [email protected]

@soldasimo

simonesoldateschi