MIKROTIK

YOU CAN (NOT)

Ansible Indonesia - MUM ID 2018

ansible

evangelion

AUTOMATE

What if i told you

you can deploy mpls apps with ease

shier

Ansible Indonesia - MUM ID 2018

VIM ♡ TMUX ♡ ARCH ♡ ANSIBLE

ansible.id  l  t.me/rshier  l  r@ansible.id

r

Ansible Indonesia - MUM ID 2018

MISSIONs

- LORE

- ANSIBLE WORKS

- ENTER MISSION

- afterwards

Ansible Indonesia - MUM ID 2018

LORE

#ashenone

Ansible Indonesia - MUM ID 2018

ONCE UPON A TIME...

THERE'S AN FINAL EXAM

LORE

Ansible Indonesia - MUM ID 2018

LORE

VS

ME

PPL

CHOOSE YOUR FIGHTER

Ansible Indonesia - MUM ID 2018

OFFICIAL RECORD: 

result

30 mins

HIDDEN RECORD: 

5  mins

LORE

Ansible Indonesia - MUM ID 2018

LORE

VS

AUTOMATION

IBM MODEL M

INTENSIFIES

HOW

Ansible Indonesia - MUM ID 2018

ANSIBLE WORKS

#faker

Ansible Indonesia - MUM ID 2018

ANSIBLE WORKS

Ansible Indonesia - MUM ID 2018

ANSIBLE WORKS

SIMPLE

POWERFULL

AGENTLESS

Ansible Indonesia - MUM ID 2018

ANSIBLE INVENTORY

[p-router]
10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4

[pe-router]
10.1.0.[1:3]

[p-router:vars]
ospf_area = backbone
ldp_enabled = yes

Ansible Indonesia - MUM ID 2018

ANSIBLE PLAYBOOK

---

- hosts: p-router
  remote_user: admin
  tasks:

    - name: enable ospf
      ospf: ...

    - name: enable ldp
      ldp: ...

    - name: blah...
      blah: ...

Ansible Indonesia - MUM ID 2018

ENTER MISSION

#ansiblevor

Ansible Indonesia - MUM ID 2018

ENTER MISSIONS

ENTER MISSIONS

     LINK   10.AB.0.AB/24

WHERE  A  =  LOWER ID
                 B  = HIGHER ID

E.G. 10.23.0.2/24
10.14.0.1/24

Ansible Indonesia - MUM ID 2018

ENTER MISSIONS

MODULES

OSPF-
LDP -
BGP -
VRF -

Ansible Indonesia - MUM ID 2018

LOWER MODULE
DEPENDS ON
HIGHER MODULE

ENTER MISSIONS

Ansible Indonesia - MUM ID 2018

WHERE IS
ANSIBLE ?

ENTER MISSIONS

Ansible Indonesia - MUM ID 2018

ON THE

ENTER MISSIONS

Ansible Indonesia - MUM ID 2018

Ansible Indonesia - MUM ID 2018

inter\
lude

Ansible Indonesia - MUM ID 2018

interlude #0

github repo

ansible-id

Ansible Indonesia - MUM ID 2018

interlude #0

$ git clone https://github.com/ansible-id/mum18
.
├── group_vars/
├── host_vars/
├── playbooks/
├── templates/
├── ansible.cfg
├── inventory.py
├── LICENSE
└── README.md

Ansible Indonesia - MUM ID 2018

interlude #1

dhcp server

isc dhcp

Ansible Indonesia - MUM ID 2018

interlude #1

subnet 10.0.0.0 netmask 255.0.0.0 {
  range 10.255.255.1 10.255.255.254;
  option subnet-mask 255.0.0.0;
}

Ansible Indonesia - MUM ID 2018

interlude #2

dynamic inventory

python3

Ansible Indonesia - MUM ID 2018

interlude #2

#!/usr/bin/env python

from isc_dhcp_leases import IscDhcpLeases
from json import dump
from sys import stdout, argv
from collections import defaultdict

def get_lease():
    leases = IscDhcpLeases('/var/lib/dhcp/dhcpd.leases')
    return leases.get()

def get_group(name, delimiter):
    pos = name.index(delimiter)
    group = name[:pos]

    return group

def generate_hosts():
    leases = get_lease()
    hosts = dict()
    groups = dict()

    for l in leases:
        name = l.hostname
        name = name.lower()
        group = get_group(name, '-')
        active = l.active and l.valid
        ip = l.ip

        if group not in groups.keys():
            groups[group] = dict(hosts=[])
        groups[group]['hosts'].append(name)

        hosts[name] = dict(ansible_host=ip, active=active, group=group)

    return {
            'hosts': hosts,
            'groups': groups
            }

def generate_inventory():
    inventory = generate_hosts()

    groups = inventory['groups']
    meta = dict(hostvars=inventory['hosts'])

    return dict(**inventory['groups'], _meta=meta)

def main(argv):
    result = generate_inventory()

    if argv[1] == '--host' and argv[2]:
        result = result['_meta']['hostvars'][argv[2]]

    return dump(result, stdout)

if __name__ == '__main__':
    main(argv)

Ansible Indonesia - MUM ID 2018

interlude #3

ansible config

ansible.cfg

Ansible Indonesia - MUM ID 2018

interlude #3


[defaults]
inventory = ./inventory.py
host_key_checking = False
command_warnings = False
hash_behaviour = merge
log_path = ./ansible.log

Ansible Indonesia - MUM ID 2018

interlude #4

variables

host vars

Ansible Indonesia - MUM ID 2018

interlude #4

---

ip:
  - name: loopback
    address: 3.3.3.3/32
  - name: ether2
    address: 10.13.0.3/24
  - name: ether3
    address: 10.23.0.3/24
  - name: ether4
    address: 10.35.0.3/24

bgp:
  asn: 65500
  peers:
    - name: edge-4
      address: 4.4.4.4
      asn: 65500
      af:
        - vpnv4

Ansible Indonesia - MUM ID 2018

interlude #5

template

jinja2

Ansible Indonesia - MUM ID 2018

interlude #5


/ip address
{% for i in ip %}
add address={{ i['address'] }} interface={{ i['name'] }} \
comment="ANSIBLE IS AWESOME!!" disabled=no
{% endfor %}

Ansible Indonesia - MUM ID 2018

interlude #6

let's play!!

playbooks

Ansible Indonesia - MUM ID 2018

interlude #6


---
- hosts: all
  gather_facts: no
  connection: local
  vars:
    user: admin
    output: ../outputs/{{ inventory_hostname }}
  tasks:
    - name: generate ip
      template:
        src: ../templates/ip.auto.rsc.j2
        dest: "{{ output }}/ip.auto.rsc"
      notify: upload ip

  handlers:
    - name: upload ip
      shell: "curl -T {{ output }}/ip.auto.rsc ftp://{{ user }}@{{ansible_host}}"

interlude #7

Ansible Indonesia - MUM ID 2018

ansible
vor

[insert some sorta march bgm here]

interlude #7

Ansible Indonesia - MUM ID 2018

$ ansible-playbook playbooks/....yml

Ansible Indonesia - MUM ID 2018

After\
wards

Ansible Indonesia - MUM ID 2018

Afterwards

iT'S make more
COMPLICATED isn't?

Ansible Indonesia - MUM ID 2018

Afterwards

ansible

Ansible Indonesia - MUM ID 2018

Afterwards

IT'S NOT
ABOUT HOW

FAST

Ansible Indonesia - MUM ID 2018

Afterwards

Ansible Indonesia - MUM ID 2018

Afterwards

Ansible Indonesia - MUM ID 2018

MOAARR?

- ansible.id

- halo@ansible.id

- @ansibleid

MUM 2018

By Ansible Indonesia