NetBiscuit
Monday, 19 February 2024
netmiko - show command
Thursday, 19 May 2022
Ansible and ACI
These are some ansible playbooks to do basic configuration on Cisco ACI using ansible.
Information taken from here:
https://github.com/CiscoDevNet/aci_ansible_learning_labs_code_samples/
"inventory" should look like this:
[apic:vars]
username=admin
password=<removed>
ansible_python_interpreter="/home/username/ansible/aci_ansible_learning_labs_code_samples/venv/bin/python"
[apic]
sandboxapicdc.cisco.com
1. Create Tenant:
2. Create Tenant, VRF and Bridge Domain:
Paramiko - config grab with Cisco IOS
Friday, 19 November 2021
Making a Raspberrypi Stop Motion Video
This guide explains how to make a stop motion video using a raspberrypi with the camera module. As part of this exercise I also wanted to transfer the file over to another remote PC in an automated fashion.
The reason I wanted to do this was the using video made the filesize umanageable. With stop motion you can alter the interval, duration of process etc.
High level steps:
1. pi1 takes a picture every 10 seconds
2. pi1 copies the picture to pi2
3. pi1 deletes the local copy and takes another picture and repeats the process.
4. On pi2 there is a scheduled cronjob that creates a video from the still images and then deletes the images files.
On pi1:
Create a folder to store our images:
mkdir /home/pi/camera
Create a script to capture the images:
sudo nano /home/pi/camera.sh
Add the following to the camera.sh shell script. The script itself runs through a for loop, you can see in this example it runs through 3600 iterations. Within the loop the script takes a picture and outputs it to a file with a filename called picture-i (where i is the number where we are in the loop). The script then pauses for 10 seconds. This means that this script would take roughly 10 hours to work through the loop until it stops - you can obviously modify the values to suit your needs. The script then writes the file to pi2 using scp - you need to have already setup ssh login without password for this to work. The script then deletes the local file and returns to the start of the loop. The deletion of the local file is purely to save space - it is not compulsory:
#!/bin/bash
#DATE=$(date +"%Y-%m-%d_%H%M%S")
for ((i=1; i<=3600; i++))
do
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
echo "*** Taking Picture $i ***"
raspistill -o /home/pi/camera/picture-$i.jpg
sleep 10
echo "*** Writing file $i to remote server ***"
scp /home/pi/camera/*.jpg pi@pi2:/home/pi/camera
rm /home/pi/camera/*.jpg
done
Press CTRL + X, followed by Y to close the file and save it:
mkdir /home/pi/camera
sudo nano /home/pi/make-video.sh
Press CTRL + X, followed by Y to close the file and save it:
Thursday, 18 February 2021
BIG-IP
! Load factory default cofig
tmsh load /sys config default
! Run management interface setup utility
config# config
Tuesday, 2 February 2021
F5 BIGIP Ansible
See here for more info:
https://github.com/F5Networks/f5-ansible/blob/devel/examples/0000-getting-started/playbook.yaml
Directory structure looks like this:
├── inventory
│ └── hosts
└── playbook.yaml
<save the below to playbook.yaml>
---
- name: Create a VIP, pool and pool members
hosts: all
connection: local
vars:
provider:
password: admin
server: 192.168.1.245
user: admin
validate_certs: no
server_port: 443
tasks:
- name: Create a pool
bigip_pool:
provider: "{{ provider }}"
lb_method: ratio-member
name: web
slow_ramp_time: 120
delegate_to: localhost
- name: Add members to pool
bigip_pool_member:
provider: "{{ provider }}"
description: "webserver {{ item.name }}"
host: "{{ item.host }}"
name: "{{ item.name }}"
pool: web
port: 80
with_items:
- host: 10.10.10.10
name: web01
- host: 10.10.10.20
name: web02
delegate_to: localhost
- name: Create a VIP
bigip_virtual_server:
provider: "{{ provider }}"
description: foo-vip
destination: 172.16.10.108
name: vip-1
pool: web
port: 80
snat: Automap
profiles:
- http
- clientssl
delegate_to: localhost
Friday, 9 November 2018
Script to create tenant / app profile / EPG
# To enable HTTP in the APIC, navigate to FABRIC, FABRIC POLICIES Pod Policies Policies Management Acces default then enable HTTP
import requests
import json
def get_cookies(apic):
username = 'admin'
password = 'ciscoapic'
url = apic + '/api/aaaLogin.json'
auth = dict(aaaUser=dict(attributes=dict(name=username, pwd=password)))
authenticate = requests.post(url, data=json.dumps(auth), verify=False)
return authenticate.cookies
def add_tenant(apic,cookies):
jsondata = {"fvTenant":{"attributes":{"dn":"uni/tn-acme","name":"acme","rn":"tn-acme","status":"created"},"children":[]}}
result = requests.post('{0}://{1}/api/node/mo/uni/tn-acme.json'.format(protocol,host), cookies=cookies, data=json.dumps(jsondata), verify=False)
print result.status_code
print result.text
def get_tenants(apic,cookies):
uri = '/api/class/fvTenant.json'
url = apic + uri
req = requests.get(url, cookies=cookies, verify=False)
response = req.text
return response
def add_application_profile(apic,cookies):
jsondata = {"fvAp":{"attributes":{"dn":"uni/tn-acme/ap-Accounting","name":"Accounting","rn":"ap-Accounting","status":"created"},"children":[]}}
result = requests.post("{0}://{1}/api/node/mo/uni/tn-acme/ap-Accounting.json".format(protocol, host), cookies=cookies, data=json.dumps(jsondata), verify=False)
print result.status_code
print result.text
def add_EPG1(apic,cookies):
jsondata = {"fvAEPg":{"attributes":{"dn":"uni/tn-acme/ap-Accounting/epg-Payroll","name":"Payroll","rn":"epg-Payroll","status":"created"},"children":[{"fvCrtrn":{"attributes":{"dn":"uni/tn-acme/ap-Accounting/epg-Payroll/crtrn","name":"default","rn":"crtrn","status":"created,modified"},"children":[]}}]}}
result = requests.post("{0}://{1}/api/node/mo/uni/tn-acme/ap-Accounting/epg-Payroll.json".format(protocol, host), cookies=cookies, data=json.dumps(jsondata), verify=False)
print result.status_code
print result.text
def add_EPG2(apic,cookies):
jsondata = {"fvAEPg":{"attributes":{"dn":"uni/tn-acme/ap-Accounting/epg-Bills","name":"Bills","rn":"epg-Bills","status":"created"},"children":[{"fvCrtrn":{"attributes":{"dn":"uni/tn-acme/ap-Accounting/epg-Bills/crtrn","name":"default","rn":"crtrn","status":"created,modified"},"children":[]}}]}}
result = requests.post("{0}://{1}/api/node/mo/uni/tn-acme/ap-Accounting/epg-Bills.json".format(protocol, host), cookies=cookies, data=json.dumps(jsondata), verify=False)
print result.status_code
print result.text
if __name__ == "__main__":
protocol = 'http'
host = '192.168.10.1'
apic = '{0}://{1}'.format(protocol, host)
cookies = get_cookies(apic)
add_tenant(apic,cookies)
add_application_profile(apic,cookies)
add_EPG1(apic,cookies)
add_EPG2(apic,cookies)
rsp = get_tenants(apic,cookies)
rsp_dict = json.loads(rsp)
tenants = rsp_dict['imdata']
for tenant in tenants:
print tenant['fvTenant']['attributes']['name']