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
MUM 2018
- 387