Update work/tbx/meraki/meraki_api.md

This commit is contained in:
2024-06-01 05:10:39 +00:00
parent fd1c8c9bfe
commit 5b3a00b860

View File

@@ -1297,3 +1297,193 @@ graph TD;
By adding this Mermaid chart to your GitHub site, you'll have a clear visual representation of the hierarchical structure within Meraki's organization, network, and device model. If you need further customization or have additional questions, feel free to ask!
---
### Guide: Converting Python Scripts to Ansible Playbooks and Vice Versa
This guide provides a step-by-step approach for converting Python scripts to Ansible playbooks and Ansible playbooks to Python scripts. It also outlines when to choose Bash/Python scripts versus Ansible playbooks based on your use case.
---
### Converting Python to Ansible
**1. Identify each API call in the Python script.**
**2. Use the Ansible `uri` module for HTTP requests.**
**3. Use the `set_fact` module to store variables.**
**4. Use the `copy` module to save content to files.**
**5. Use `ansible.builtin.debug` for debugging output.**
---
**Example Python Script: Fetching Organizations and Networks**
```python
import requests
import json
API_KEY = 'your_api_key'
BASE_URL = 'https://api.meraki.com/api/v1'
# Fetch organizations
response = requests.get(f'{BASE_URL}/organizations', headers={'Authorization': f'Bearer {API_KEY}'})
organizations = response.json()
with open('organizations.json', 'w') as f:
json.dump(organizations, f, indent=4)
print("Organizations data saved to organizations.json")
# Extract organization ID
org_id = organizations[0]['id']
# Fetch networks
response = requests.get(f'{BASE_URL}/organizations/{org_id}/networks', headers={'Authorization': f'Bearer {API_KEY}'})
networks = response.json()
with open('networks.json', 'w') as f:
json.dump(networks, f, indent=4)
print("Networks data saved to networks.json")
```
**Converted Ansible Playbook (myplaybook.yml):**
```yaml
---
- hosts: localhost
gather_facts: false
tasks:
- name: Get all Organizations
uri:
url: "https://api.meraki.com/api/v1/organizations"
method: GET
headers:
Authorization: "Bearer {{ lookup('env', 'MERAKI_DASHBOARD_API_KEY') }}"
return_content: yes
register: organizations
- name: Save organizations to file
copy:
content: "{{ organizations.json | to_nice_json }}"
dest: ./organizations.json
- name: Extract organization ID
set_fact:
organization_id: "{{ organizations.json[0].id }}"
- name: Get all Networks for the first Organization
uri:
url: "https://api.meraki.com/api/v1/organizations/{{ organization_id }}/networks"
method: GET
headers:
Authorization: "Bearer {{ lookup('env', 'MERAKI_DASHBOARD_API_KEY') }}"
return_content: yes
register: networks
- name: Save networks to file
copy:
content: "{{ networks.json | to_nice_json }}"
dest: ./networks.json
```
**Hosts File (hosts):**
```ini
[local]
localhost
```
**Run the Playbook:**
```sh
ansible-playbook -i hosts myplaybook.yml
```
---
### Converting Ansible to Python
**1. Identify each task in the Ansible playbook.**
**2. Use the `requests` library for HTTP requests.**
**3. Use Python variables to store and manipulate data.**
**4. Use `print` or `json.dumps` for output.**
---
**Example Ansible Playbook:**
```yaml
---
- hosts: localhost
gather_facts: false
tasks:
- name: Get all Organizations
cisco.meraki.organizations_info:
meraki_api_key: "{{ lookup('env', 'MERAKI_DASHBOARD_API_KEY') }}"
register: result
- name: Show Organizations List
ansible.builtin.debug:
msg: "{{ result.meraki_response | json_query('[*].{id: id, name: name}') }}"
- name: Get all Networks for the first Organization
cisco.meraki.networks_info:
meraki_api_key: "{{ lookup('env', 'MERAKI_DASHBOARD_API_KEY') }}"
organization_id: "{{ result.meraki_response[0].id }}"
register: networks
- name: Show Networks List
ansible.builtin.debug:
msg: "{{ networks.meraki_response | json_query('[*].{id: id, name: name}') }}"
```
**Converted Python Script:**
```python
import requests
import json
import os
API_KEY = os.getenv('MERAKI_DASHBOARD_API_KEY')
BASE_URL = 'https://api.meraki.com/api/v1'
# Get all Organizations
response = requests.get(f'{BASE_URL}/organizations', headers={'Authorization': f'Bearer {API_KEY}'})
organizations = response.json()
print("Organizations List:")
print(json.dumps([{ 'id': org['id'], 'name': org['name'] } for org in organizations], indent=4))
# Extract organization ID
organization_id = organizations[0]['id']
# Get all Networks for the first Organization
response = requests.get(f'{BASE_URL}/organizations/{organization_id}/networks', headers={'Authorization': f'Bearer {API_KEY}'})
networks = response.json()
print("Networks List:")
print(json.dumps([{ 'id': net['id'], 'name': net['name'] } for net in networks], indent=4))
```
---
### Choosing Between Bash/Python and Ansible
**Bash/Python:**
- **Use for quick scripts**: Ideal for simple, one-off tasks.
- **Fine-grained control**: Offers detailed control over each step and can handle dynamic programming logic easily.
- **Flexibility**: Easily switch between different tasks and workflows.
**Ansible:**
- **Use for automation**: Best for automating routine tasks and ensuring consistency across environments.
- **Scalability**: Designed to scale across many devices and networks.
- **Readability and simplicity**: Playbooks are written in YAML, which is easy to read and understand.
- **Error handling and idempotence**: Handles errors gracefully and ensures tasks run once with the same effect.
---
By following this guide, you can convert Python scripts to Ansible playbooks and vice versa, allowing you to choose the best tool for your specific needs. Whether you need fine-grained control with Bash/Python or scalable automation with Ansible, this guide provides the necessary steps for effective conversions.
If you have any further questions or need additional examples, feel free to ask!