Slide 1

Slide 1 text

Let’s automate stuff with Ansible symfony Live Berlin 2015 https://www.dropbox.com/s/wmsqf8xg74bevy6/53H.jpg @Sgoettschkes

Slide 2

Slide 2 text

It started with bare metal ...

Slide 3

Slide 3 text

… and then the cloud happened

Slide 4

Slide 4 text

“99 servers in the cloud, 99 servers Take one down, tear it apart, 98 servers in the cloud” Unknown

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Ansible

Slide 7

Slide 7 text

Ansible

Slide 8

Slide 8 text

Ansible

Slide 9

Slide 9 text

Installation pip, brew, apt or From source (It’s just Python!)

Slide 10

Slide 10 text

Inventory $ cat hosts [webservers] 127.0.0.101 ansible_ssh_port=2222 127.0.0.102 ansible_ssh_user=admin [dbservers] 127.0.0.103 ansible_sudo=true

Slide 11

Slide 11 text

Inventory $ cat hosts [webservers] 127.0.0.101 ansible_ssh_port=2222 127.0.0.102 ansible_ssh_user=admin [dbservers] 127.0.0.103 ansible_sudo=true

Slide 12

Slide 12 text

Ad-Hoc commands $ ansible all -m ping 127.0.0.101 | success >> { "changed": false, "ping": "pong" } 127.0.0.102 | success >> { "changed": false, "ping": "pong" }

Slide 13

Slide 13 text

Ad-Hoc commands $ ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts" $ # or $ ansible all -m command -a "echo $TERM"

Slide 14

Slide 14 text

Tasks

Slide 15

Slide 15 text

Tasks $ cat tasks.yml --- - name: update apt cache apt: update_cache=yes - name: install vim apt: pkg=vim state=latest - name: install composer shell: curl -sS https://getcomposer.org/installer | php chdir=/usr/local/src creates=/usr/local/src/composer.phar

Slide 16

Slide 16 text

Modules $ cat tasks.yml --- - name: update apt cache apt: update_cache=yes - name: install vim apt: pkg=vim state=latest - name: install composer shell: curl -sS https://getcomposer.org/installer | php chdir=/usr/local/src creates=/usr/local/src/composer.phar

Slide 17

Slide 17 text

Tasks $ cat tasks.yml --- - name: update apt cache apt: update_cache=yes - name: install vim apt: pkg=vim state=latest - name: install composer shell: curl -sS https://getcomposer.org/installer | php chdir=/usr/local/src creates=/usr/local/src/composer.phar

Slide 18

Slide 18 text

Tasks $ cat tasks.yml --- - name: update apt cache apt: update_cache=yes - name: install vim apt: pkg=vim state=latest - name: install composer shell: curl -sS https://getcomposer.org/installer | php chdir=/usr/local/src creates=/usr/local/src/composer.phar

Slide 19

Slide 19 text

Tasks $ cat tasks.yml --- - name: update apt cache apt: update_cache=yes - name: install vim apt: pkg=vim state=latest - name: install composer shell: curl -sS https://getcomposer.org/installer | php chdir=/usr/local/src creates=/usr/local/src/composer.phar

Slide 20

Slide 20 text

Tasks $ cat tasks.yml --- - name: update apt cache apt: update_cache=yes - name: install vim apt: pkg=vim state=latest - name: install composer shell: curl -sS https://getcomposer.org/installer | php chdir=/usr/local/src creates=/usr/local/src/composer.phar

Slide 21

Slide 21 text

Tasks $ cat tasks.yml --- - name: install packages apt: pkg={{ item }} state=latest with_items: - emacs - vim

Slide 22

Slide 22 text

Tasks $ cat tasks.yml --- - name: install packages apt: pkg={{ item }} state=latest with_items: - emacs - vim when: ansible_os_family == “Debian”

Slide 23

Slide 23 text

Modules - apt, homebrew, pacman, … - and pip, gem, npm, composer, … - copy, file, template, … - PostgreSQL, MySQL, MongoDB, redis, … - git, hg, bzr, subversion, ... - Monitoring, Network, Cloud, ...

Slide 24

Slide 24 text

Handlers $ cat handlers.yml - name: reload nginx service: name=nginx state=reloaded - name: restart nginx service: name=nginx state=restarted

Slide 25

Slide 25 text

Handlers $ cat handlers.yml - name: reload nginx service: name=nginx state=reloaded - name: restart nginx service: name=nginx state=restarted

Slide 26

Slide 26 text

Handlers $ cat tasks.yml --- - name: install nginx apt: pkg=nginx state=latest notify: restart nginx

Slide 27

Slide 27 text

Templates $ cat templates/nginx.conf.j2 user {{ nginx_user }}; worker_processes {{ nginx_worker_processes }}; pid /var/run/nginx.pid;

Slide 28

Slide 28 text

Variables $ cat templates/nginx.conf.j2 user {{ nginx_user }}; worker_processes {{ nginx_worker_processes }}; pid /var/run/nginx.pid;

Slide 29

Slide 29 text

Facts $ cat group_vars/webservers.yml nginx_user: www-data nginx_worker_processes: "{{ ansible_processor_cores * ansible_processor_count }}"

Slide 30

Slide 30 text

Roles ● Grouping tasks ● Separated ● e.g. nginx, python, nodejs, mongodb, ...

Slide 31

Slide 31 text

Putting it all together https://www.dropbox.com/s/en9t0dmeanbi2du/188H.jpg

Slide 32

Slide 32 text

Folder structure $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml

Slide 33

Slide 33 text

Inventory files $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml

Slide 34

Slide 34 text

Inventory files $ cat environments/staging/inventory 127.0.0.101 ansible_ssh_user=deploy ansible_sudo=true [webservers] 127.0.0.101 [dbservers] 127.0.0.101

Slide 35

Slide 35 text

Group vars $ cat environments/staging/group_vars/all.yml --- env: staging domain_www: staging.example.com domain_static: static.staging.example.com

Slide 36

Slide 36 text

Group vars $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml

Slide 37

Slide 37 text

Group vars $ cat group_vars/all.yml --- apt_packages: - acl - curl - git - tmux - vim

Slide 38

Slide 38 text

site.yml $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml

Slide 39

Slide 39 text

site.yml $ cat site.yml --- - hosts: all roles: - apt - iptables - locale - include: webservers.yml - include: dbservers.yml

Slide 40

Slide 40 text

webservers.yml $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml

Slide 41

Slide 41 text

webservers.yml $ cat webservers.yml --- - hosts: webservers roles: - nginx - php

Slide 42

Slide 42 text

roles $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml

Slide 43

Slide 43 text

roles $ ls -a . . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml $ ls roles apt iptables locale nginx php

Slide 44

Slide 44 text

roles . .. dbservers.yml environments .git .gitignore group_vars host_vars README.md requirements.yml roles site.yml webservers.yml $ ls roles apt iptables locale nginx php $ ls roles/php/ defaults LICENSE meta README.md tasks templates

Slide 45

Slide 45 text

Roles $ ls roles apt iptables locale nginx php $ ls roles/php/ defaults LICENSE meta README.md tasks templates $ ls roles/php/tasks main.yml php.yml

Slide 46

Slide 46 text

Roles $ cat roles/php/tasks/main.yml --- - include: php.yml tags=php

Slide 47

Slide 47 text

Roles $ cat roles/php/tasks/php.yml --- - name: install php packages apt: default_release={{ php_default_release }} pkg={{ item }} state=latest with_items: - php5-cli - php5-common

Slide 48

Slide 48 text

Roles - name: configure cli php.ini ini_file: dest=/etc/php5/cli/php.ini option={{ item.key }} section={{ item.section }} value={{ item.value }} with_items: php_config_cli

Slide 49

Slide 49 text

Roles $ cat roles/php/defaults/main.yml --- php_default_release: stable php_config_cli: - { section: date, key: date.timezone, value: UTC } - { section: PHP, key: memory_limit, value: “{{ (ansible_memtotal_mb / 100) * 50}}M” }

Slide 50

Slide 50 text

Let’s go $ ansible-playbook -i environment/staging/inventory site.yml $ ansible-playbook -i environment/staging/inventory \ webservers.yml $ ansible-playbook -i environment/staging/inventory \ -t apt site.yml

Slide 51

Slide 51 text

Let’s go TASK: [apt | install nginx] ok: [127.0.0.101] TASK: [php | install php packages] changed: [127.0.0.101] => (item=php5-cli,php5-common) TASK: [locale | copy localtime template] skipped: [127.0.0.101]

Slide 52

Slide 52 text

There is more! http://publicdomainarchive.com/wp-content/uploads/2015/03/public-domain-images-free-stock-photos-autumn.jpg

Slide 53

Slide 53 text

Ansible 2.0 “Ansible 2 is coming, and it’s going to be awesome!” James Cammarata (Director of Ansible Core Engineering)

Slide 54

Slide 54 text

IT Automation https://www.dropbox.com/s/x8b4iqm82di9abr/186H.jpg

Slide 55

Slide 55 text

https://www.dropbox.com/s/6z5aiwa8l09g2pa/86H.jpg

Slide 56

Slide 56 text

https://www.dropbox.com/s/6z5aiwa8l09g2pa/86H.jpg Please rate this talk: https://joind.in/talk/view/15074