Update work/tbx/meraki/meraki_api.md
This commit is contained in:
@@ -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!
|
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!
|
||||||
Reference in New Issue
Block a user