6 ways ansible can improve your workflow

79
TITLE 6 Ways Ansible Can Improve Your Workflow Owen Zanzal @AgentO3 April 2015

Upload: vividcortex

Post on 03-Aug-2015

275 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 6 Ways Ansible Can Improve Your Workflow

TITLE

6 Ways Ansible Can Improve Your Workflow

Owen Zanzal@AgentO3April 2015

Page 2: 6 Ways Ansible Can Improve Your Workflow

TITLE

Questions?@VividCortex

2

Page 3: 6 Ways Ansible Can Improve Your Workflow

TITLE

Ansible at VividCortex

3

• 1.5 years• Simple• Powerful• Versatile• Easy to learn

Page 4: 6 Ways Ansible Can Improve Your Workflow

TITLE

How we use Ansible

4

• Configuration Management• Provisioning• Deployment• Builds• Monitoring• Debugging

Page 5: 6 Ways Ansible Can Improve Your Workflow

TITLE

0 to Ansible

5

Page 6: 6 Ways Ansible Can Improve Your Workflow

TITLE6

• Inventory• Playbook• Hosts• Vars• Tasks• Roles• Tags

Ansible Terminology

Page 7: 6 Ways Ansible Can Improve Your Workflow

TITLE7

[server_group]server1server2 server3

Inventory

Page 8: 6 Ways Ansible Can Improve Your Workflow

TITLE8

[server_group]server1server2 server3

Inventory

Page 9: 6 Ways Ansible Can Improve Your Workflow

TITLE9

- hosts: server_group tags: [‘say-hello’] vars:

say: Hello tasks:

- name: Say hello shell: echo {{say}} roles:

- say-hello

Playbook

Page 10: 6 Ways Ansible Can Improve Your Workflow

TITLE10

- hosts: server_group tags: [‘say-hello’] vars:

say: Hello tasks:

- name: Say hello shell: echo {{say}} roles:

- say-hello

Hosts

Page 11: 6 Ways Ansible Can Improve Your Workflow

TITLE11

- hosts: server_group tags: [‘say-hello’] vars:

say: Hello tasks:

- name: Say hello shell: echo {{say}} roles:

- say-hello

Vars

Page 12: 6 Ways Ansible Can Improve Your Workflow

TITLE12

- hosts: server_group tags: [‘say-hello’] vars:

say: Hello tasks:

- name: Say hello shell: echo {{say}} roles:

- say-hello

Tasks

Page 13: 6 Ways Ansible Can Improve Your Workflow

TITLE13

- hosts: server_group tags: [‘say-hello’] vars:

say: Hello tasks:

- name: Say hello shell: echo {{say}} roles:

- say-hello

Roles

Page 14: 6 Ways Ansible Can Improve Your Workflow

TITLE14

- hosts: server_group tags: [‘say-hello’] vars:

say: Hello tasks:

- name: Say hello shell: echo {{say}} roles:

- say-hello

Tags

Page 15: 6 Ways Ansible Can Improve Your Workflow

TITLE15

ansible-playbook -i inventory \playbooks.yml \-t say-hello \-e ‘say=bye’

CLI

Page 16: 6 Ways Ansible Can Improve Your Workflow

TITLE16

ansible-playbook -i inventory \playbooks.yml \-t say-hello \-e ‘say=bye’

CLI

Page 17: 6 Ways Ansible Can Improve Your Workflow

TITLE17

ansible-playbook -i inventory \playbooks.yml \-t say-hello \-e ‘say=bye’

CLI

Page 18: 6 Ways Ansible Can Improve Your Workflow

TITLE18

ansible-playbook -i inventory \playbooks.yml \-t say-hello \-e ‘say=bye’

CLI

Page 19: 6 Ways Ansible Can Improve Your Workflow

TITLE19

ansible-playbook -i inventory \playbooks.yml \-t say-hello \-e ‘say=bye’

CLI

Page 20: 6 Ways Ansible Can Improve Your Workflow

TITLE

#1 Configuration Management

20

Page 21: 6 Ways Ansible Can Improve Your Workflow

TITLE21

• Chef

• Puppet

• Salt Stack

Similar To

Page 22: 6 Ways Ansible Can Improve Your Workflow

TITLE22

• Install packages

• Manage application state

• Configure files

Common Tasks

Page 23: 6 Ways Ansible Can Improve Your Workflow

TITLE23

- hosts: webservers … tasks:

- name: Install apache on Ubuntu apt: name=apache2 state=present when: ansible_distribution == “Ubuntu”

- name: Install apache on CentOs yum: name=httpd state=present when: ansible_distribution == “CentOs”

Install Packages

Page 24: 6 Ways Ansible Can Improve Your Workflow

TITLE24

- hosts: webservers … tasks:

- name: Install apache on Ubuntu apt: name=apache2 state=present when: ansible_distribution == “Ubuntu”

- name: Install apache on CentOs yum: name=httpd state=present when: ansible_distribution == “CentOs”

Install Packages

Page 25: 6 Ways Ansible Can Improve Your Workflow

TITLE25

- hosts: webservers … tasks:

- name: Install apache on Ubuntu apt: name=apache2 state=present when: ansible_distribution == “Ubuntu”

- name: Install apache on CentOs yum: name=httpd state=present when: ansible_distribution == “CentOs”

Install Packages

Page 26: 6 Ways Ansible Can Improve Your Workflow

TITLE26

- hosts: webservers … tasks:

- name: Install apache on Ubuntu apt: name=apache2 state=present when: ansible_distribution == “Ubuntu”

- name: Install apache on CentOs yum: name=httpd state=present when: ansible_distribution == “CentOs”

Install Packages

Page 27: 6 Ways Ansible Can Improve Your Workflow

TITLE27

- hosts: webservers … tasks:

- name: Install apache on Ubuntu apt: name=apache2 state=present when: ansible_distribution == “Ubuntu”

- name: Install apache on CentOs yum: name=httpd state=present when: ansible_distribution == “CentOs”

Install Packages

Page 28: 6 Ways Ansible Can Improve Your Workflow

TITLE28

...

- name: Start apache on Ubuntu

service: name=apache2 state=started

enabled=yes

when: ansible_distribution == “Ubuntu”

- name: start apache on CentOs

yum: name=httpd state=started enabled=yes

when: ansible_distribution == “CentOs”

Application State

Page 29: 6 Ways Ansible Can Improve Your Workflow

TITLE29

...

- name: Start apache on Ubuntu

service: name=apache2 state=started

enabled=yes

when: ansible_distribution == “Ubuntu”

- name: start apache on CentOs

yum: name=httpd state=started enabled=yes

when: ansible_distribution == “CentOs”

Application State

Page 30: 6 Ways Ansible Can Improve Your Workflow

TITLE30

...

- name: Start apache on Ubuntu

service: name=apache2 state=started

enabled=yes

when: ansible_distribution == “Ubuntu”

- name: start apache on CentOs

yum: name=httpd state=started enabled=yes

when: ansible_distribution == “CentOs”

Application State

Page 31: 6 Ways Ansible Can Improve Your Workflow

TITLE31

... - name: Copy php.ini to webservers copy: src=files/php.ini dest=/etc/php.ini- name: Copy vhost to webservers

template: > src=vhost.conf.j2dest=/etc/httpd/conf.d/vhost.conf

Configure Files

Page 32: 6 Ways Ansible Can Improve Your Workflow

TITLE

#2 Provisioning

32

Page 33: 6 Ways Ansible Can Improve Your Workflow

TITLE33

• Terraform

• Cloud Formation

Similar To

Page 34: 6 Ways Ansible Can Improve Your Workflow

TITLE34

• Bring up a new instance

• Gather facts

• Wait for it to boot

Tasks

Page 35: 6 Ways Ansible Can Improve Your Workflow

TITLE35

topology: - name: db count: 1 user: root type: c3.large keypair: keyname group: sg-8565309 image: "{{datacenter_images.centos}}" subnet: subnet-1776c...

Create instance

Page 36: 6 Ways Ansible Can Improve Your Workflow

TITLE36

hosts: localhost...- name: Create ec2 boxes ec2: count_tag: Name: "{{env_key}}-{{item.name}}" exact_count: "{{item.count}}" key_name: "{{item.keypair}}" group_id: "{{item.group}}" instance_type: "{{item.type}}"

Create instance

Page 37: 6 Ways Ansible Can Improve Your Workflow

TITLE37

hosts: localhost...- name: Create ec2 boxes ec2: count_tag: Name: "{{env_key}}-{{item.name}}" exact_count: "{{item.count}}" key_name: "{{item.keypair}}" group_id: "{{item.group}}" instance_type: "{{item.type}}"

Create instance

Page 38: 6 Ways Ansible Can Improve Your Workflow

TITLE38

... image: "{{item.image}}" vpc_subnet_id: "{{item.subnet}}" wait: yes region: "{{item.region}}" instance_tags: Name: "{{env_key}}-{{item.name}}" volumes: "{{item.volumes}}" register: ec2 with_items: topology

Create instance

Page 39: 6 Ways Ansible Can Improve Your Workflow

TITLE39

... image: "{{item.image}}" vpc_subnet_id: "{{item.subnet}}" wait: yes region: "{{item.region}}" instance_tags: Name: "{{env_key}}-{{item.name}}" volumes: "{{item.volumes}}" register: ec2 with_items: topology

Gather facts

Page 40: 6 Ways Ansible Can Improve Your Workflow

TITLE40

... - name: Add new instance to host group add_host: > hostname={{env}}-{{server_name}} ansible_ssh_host={{ item.private_ip }} groupname=launched ansible_ssh_user={{ server_config.user }} when: ec2.changed with_items: ec2.instances

Gather facts

Page 41: 6 Ways Ansible Can Improve Your Workflow

TITLE41

... - name: Add new instance to host group add_host: > hostname={{env}}-{{server_name}} ansible_ssh_host={{ item.private_ip }} groupname=launched ansible_ssh_user={{ server_config.user }} when: ec2.changed with_items: ec2.instances

Gather facts

Page 42: 6 Ways Ansible Can Improve Your Workflow

TITLE42

... - name: Wait for SSH to come up wait_for: host={{item.private_ip}} port=22 delay=2 timeout=320 state=started when: ec2.changed with_items: ec2.instances

Wait

Page 43: 6 Ways Ansible Can Improve Your Workflow

TITLE

#3 Deployment

43

Page 44: 6 Ways Ansible Can Improve Your Workflow

TITLE44

• Capistrano

Similar To

Page 45: 6 Ways Ansible Can Improve Your Workflow

TITLE45

• Move files to target

• Create release and link to current

• Restart

Tasks

Page 46: 6 Ways Ansible Can Improve Your Workflow

TITLE46

...- name: Unarchive artifacts to dest sudo_user: "app-runner" unarchive: > src=downloads/services.zip dest=/tmp/services

Move files to target

Page 47: 6 Ways Ansible Can Improve Your Workflow

TITLE47

...- name: Create a release sudo_user: "app-runner" release: > src=/tmp/services/archive/artifacts name=consumers keep=5

Create release and link to current

Page 48: 6 Ways Ansible Can Improve Your Workflow

TITLE48

...- name: restart runit service service: name=consumers state=restarted

Restart

Page 49: 6 Ways Ansible Can Improve Your Workflow

TITLE

#4 Builds

49

Page 50: 6 Ways Ansible Can Improve Your Workflow

TITLE50

• Make

• TravisCI

Similar To

Page 51: 6 Ways Ansible Can Improve Your Workflow

TITLE51

• Resolve dependencies

• Build artifacts

• Archive

Tasks

Page 52: 6 Ways Ansible Can Improve Your Workflow

TITLE52

- hosts: 127.0.0.1 connection: local vars: env: "{{lookup('env','ENV')}}"

theme_path: ./themes/cortex bin_grunt_path: ./node_modules/grunt-cli/bin artifacts: - _site

Resolve Dependencies

Page 53: 6 Ways Ansible Can Improve Your Workflow

TITLE53

.... tasks: - file: > path={{current_path}}/artifacts state=directory recurse=yes - name: Install npm deps command: npm install chdir={{theme_path}}

Resolve Dependencies

Page 54: 6 Ways Ansible Can Improve Your Workflow

TITLE54

....- name: Build assets command: "{{bin_grunt_path}}/grunt

chdir={{theme_path}}" - name: Build site command: ~/hugo_0.13/hugo --config="prod_config.yaml" when: env == "prod" - name: Build site command: ~/hugo_0.13/hugo --config="stage_config.yaml" when: env != "prod"

Build

Page 55: 6 Ways Ansible Can Improve Your Workflow

TITLE55

....- name: Build assets command: "{{bin_grunt_path}}/grunt

chdir={{theme_path}}" - name: Build site command: ~/hugo_0.13/hugo --config="prod_config.yaml" when: env == "prod" - name: Build site command: ~/hugo_0.13/hugo --config="stage_config.yaml" when: env != "prod"

Build

Page 56: 6 Ways Ansible Can Improve Your Workflow

TITLE56

...vars:... artifacts: - _site... - command: cp -rf {{item}} {{current_path}}/artifacts with_items: artifacts

Archive

Page 57: 6 Ways Ansible Can Improve Your Workflow

TITLE57

...vars:... artifacts: - _site... - command: cp -rf {{item}} {{current_path}}/artifacts with_items: artifacts

Archive

Page 58: 6 Ways Ansible Can Improve Your Workflow

TITLE

#5 Monitoring

58

Page 59: 6 Ways Ansible Can Improve Your Workflow

TITLE59

• Nagios

Similar To

Page 60: 6 Ways Ansible Can Improve Your Workflow

TITLE60

• SSH into target

• Run assertion

• Notify

Tasks

Page 61: 6 Ways Ansible Can Improve Your Workflow

TITLE61

- hosts: all tasks: - name: Check df command: echo {{(item.size_available * 100 ) // item.size_total}} with_items: ansible_mounts register: df_results

SSH into target

Page 62: 6 Ways Ansible Can Improve Your Workflow

TITLE62

- hosts: all tasks: - name: Check df command: echo {{(item.size_available * 100 ) // item.size_total}} with_items: ansible_mounts register: df_results

SSH into target

Page 63: 6 Ways Ansible Can Improve Your Workflow

TITLE63

- hosts: all tasks: - name: Check df command: echo {{(item.size_available * 100 ) // item.size_total}} with_items: ansible_mounts register: df_results

SSH into target

Page 64: 6 Ways Ansible Can Improve Your Workflow

TITLE64

... - hipchat: > token={{secret_token}} room=notifications msg="Disk space alert -- {{ ansible_fqdn }} disk {{ item.item.mount }} = {{item.stdout}}% free" when: item.stdout | int < 10 with_items: df_results.results

Run Assertion

Page 65: 6 Ways Ansible Can Improve Your Workflow

TITLE65

... - hipchat: > token={{secret_token}} room=notifications msg="Disk space alert -- {{ ansible_fqdn }} disk {{ item.item.mount }} = {{item.stdout}}% free" when: item.stdout | int < 10 with_items: df_results.results

Notify

Page 66: 6 Ways Ansible Can Improve Your Workflow

TITLE

#6 Debugging

66

Page 67: 6 Ways Ansible Can Improve Your Workflow

TITLE67

• Fabric

Similar To

Page 68: 6 Ways Ansible Can Improve Your Workflow

TITLE68

• SSH into target

• Inspect file ( log, config, etc… )

• Dump contents

Tasks

Page 69: 6 Ways Ansible Can Improve Your Workflow

TITLE69

ansible-playbook \-i dev ops.yml \-t runit-log \-e “h=api-servers q=api-hosts”

CLI

Page 70: 6 Ways Ansible Can Improve Your Workflow

TITLE70

- hosts: "{{h}}" tags: ["runit-log"] vars: docs: "Get runit logs" q: "*" p: /home/ansible/service/{{q}}/log/main/current n: 20

SSH into target

Page 71: 6 Ways Ansible Can Improve Your Workflow

TITLE71

... tasks: - shell: tail -n {{n}} {{p}} register: r - debug: var=r.stdout_lines

Inspect file

Page 72: 6 Ways Ansible Can Improve Your Workflow

TITLE72

... tasks: - shell: tail -n {{n}} {{p}} register: r - debug: var=r.stdout_lines

Dump contents

Page 73: 6 Ways Ansible Can Improve Your Workflow

TITLE73

ok: [dev-api0] => { "r.stdout_lines": [ "==> /home/ansible/service/api-hosts-read/log/main/current <==", "2015/04/28 16:12:56 b17fefd0ad793b7a 0.008614 200 10.10.11.207 via 10.10.13.156:42480 GET /hosts/12/agents", "2015/04/28 16:13:06 091e3dcb1a15d931 0.015990 200 10.10.13.156 via 10.10.13.156:42671 GET /hosts/2/agents", "2015/04/28 16:13:12 67dcee980bf3e6cc 0.003114 200 10.10.13.120 via 10.10.13.156:42801 GET /hosts/22/credentials?type=mysql",

Dump contents

Page 74: 6 Ways Ansible Can Improve Your Workflow

TITLE

Bonus!!!

74

Page 75: 6 Ways Ansible Can Improve Your Workflow

TITLE75

• Codify Knowledge

• Accessibility

• Discovery

ChatOps

Page 76: 6 Ways Ansible Can Improve Your Workflow

TITLE76

ansible-playbook \-i dev ops.yml \-t runit-log \-e “h=api-servers q=api-hosts*”

CLI

Page 77: 6 Ways Ansible Can Improve Your Workflow

TITLE77

/ops runit-log use=dev h=api-servers q=api-hosts*

or

/ops use dev

/ops runit-log h=api-servers q=api-hosts*

ChatOps Version

Page 78: 6 Ways Ansible Can Improve Your Workflow

TITLE78

ChatOps in Action

Page 79: 6 Ways Ansible Can Improve Your Workflow

TITLE

Thanks for watching!!!

79