Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cedge adoption #35

Merged
merged 4 commits into from
Dec 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .ansible-lint
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ exclude_paths:
verbosity: 1

# # Mock modules or roles in order to pass ansible-playbook --syntax-check
# mock_modules:
mock_modules:
- amazon.aws.ec2_instance_info
- amazon.aws.ec2_eip_info
- azure.azcollection.azure_rm_publicipaddress_info
- azure.azcollection.azure_rm_virtualmachine_info
# - zuul_return
# # note the foo.bar is invalid as being neither a module or a collection
# - fake_namespace.fake_collection.fake_module
Expand Down
2 changes: 1 addition & 1 deletion galaxy.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace: cisco
name: sdwan_deployment
version: 0.3.3
version: 0.3.4
readme: README.md
authors:
- Arkadiusz Cichon <[email protected]>
Expand Down
55 changes: 55 additions & 0 deletions roles/aws_device_params/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Ansible Role: aws_device_params

The `aws_device_params` Ansible role reads params from cEdge devices deployed on AWS, so that they can be used through other roles.

## Role Description

The `aws_device_params` role generates deployment facts for already deployed cEdge devices. For each cEdge deployment facts contain information about its:
- `hostname`
- `admin_username`
- `admin_password`
- `mgmt_public_ip`
- `transport_public_ip`
- `service_interfaces`
Additionally the role sets the `manager_authentication` variable, which can be used for logging to vManage in other roles.

## Requirements

- The `cisco.sdwan_deployment` collection installed.
- Ansible 2.16 or higher.
- Ansible AWS modules (`amazon.aws` collection) installed.
- AWS CLI configured with the appropriate permissions to create and manage AWS resources.

## Dependencies

There are no external role dependencies. Only `cisco.sdwan_deployment` collection is required.

### Required Variables

- `aws_tag_creator`: Tag for identifying the creator of AWS resources.
- `aws_region`: AWS region to host the resources.
- `admin_password`: The admin password for virtual machine access.

## Example Playbook

Including an example of how to use your role (for instance, with variables passed in as parameters):

```yaml
- name: Read deployed cEdge parameters
hosts: localhost
gather_facts: false
vars:
aws_region: "us-east-1"
aws_tag_creator: "tag-creator"
admin_password: "password" # pragma: allowlist secret
roles:
- cisco.sdwan_deployment.aws_device_params
```

## License

"GPL-3.0-only"

## Author Information

This role was created by Przemyslaw Susko <[email protected]>
17 changes: 17 additions & 0 deletions roles/aws_device_params/meta/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates

---

galaxy_info:
author: Przemyslaw Susko <[email protected]>
description: Deploy Cisco SD-WAN cEdges (C8000V) on AWS
license: GPL-3.0-or-later
min_ansible_version: "2.16.6"

galaxy_tags:
- cisco
- sdwan
- catalystwan
- networking

dependencies: []
48 changes: 48 additions & 0 deletions roles/aws_device_params/tasks/aws_cedge_ec2_instance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)

---

- name: Get EIPs associated with the cEdge instances
amazon.aws.ec2_eip_info:
region: "{{ aws_region }}"
filters:
"tag:Creator": "{{ aws_tag_creator }}"
tag:Machine: "*{{ hostname }}*"
register: eip_info

- name: Extract management public IP
ansible.builtin.set_fact:
mgmt_public_ip: "{{ (eip_info.addresses | selectattr('tags.VPN', 'equalto', '512') | map(attribute='public_ip') | first) | default(None) }}"
transport_public_ip: "{{ (eip_info.addresses | selectattr('tags.VPN', 'equalto', '0') | map(attribute='public_ip') | first) | default(None) }}"

- name: Set service_interfaces fact
ansible.builtin.set_fact:
service_interfaces: []
last_index: 2

- name: Append to service_interfaces
ansible.builtin.set_fact:
service_interfaces: "{{ service_interfaces + [{'addr': eip.private_ip_address, 'index': last_index}] }}"
last_index: "{{ last_index | int + 1 }}"
loop: "{{ eip_info.addresses }}"
loop_control:
loop_var: eip
when:
- eip.tags.VPN != '512'
- eip.tags.VPN != '0'

- name: Set instance fact
ansible.builtin.set_fact:
instance:
hostname: "{{ hostname }}"
admin_username: "admin"
admin_password: "{{ admin_password }}"
mgmt_public_ip: "{{ mgmt_public_ip }}"
transport_public_ip: "{{ transport_public_ip }}"
service_interfaces: "{{ service_interfaces }}"

- name: Update deployment facts
ansible.builtin.set_fact:
deployment_facts:
deployed_edge_instances: "{{ deployment_facts.deployed_edge_instances + [instance] }}"
53 changes: 53 additions & 0 deletions roles/aws_device_params/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)

---

- name: Gather network resources information
ansible.builtin.include_role:
name: cisco.sdwan_deployment.aws_network_infrastructure
tasks_from: aws_gather_network_resources.yml

- name: Gather information about EC2 instances with 'cedge' in their name
amazon.aws.ec2_instance_info:
region: "{{ aws_region }}"
filters:
"tag:Creator": "{{ aws_tag_creator }}"
"tag:Name": "*vManage*"
register: vmanage_ec2_info

- name: Get EIPs associated with the vManage instances
amazon.aws.ec2_eip_info:
region: "{{ aws_region }}"
filters:
"tag:Creator": "{{ aws_tag_creator }}"
tag:Machine: "*{{ vmanage_ec2_info.instances | map(attribute='tags.Name') | list | first }}*"
register: vmanage_eip_info

- name: Set manager authentication fact
ansible.builtin.set_fact:
manager_authentication:
url: "{{ vmanage_eip_info.addresses | selectattr('tags.VPN', 'equalto', '512') | map(attribute='public_ip') | first }}"
username: "admin"
password: "{{ admin_password }}"

- name: Define deployment facts
ansible.builtin.set_fact:
deployment_facts:
deployed_edge_instances: []

- name: Gather information about EC2 instances with 'cedge' in their name
amazon.aws.ec2_instance_info:
region: "{{ aws_region }}"
filters:
"tag:Creator": "{{ aws_tag_creator }}"
"tag:Name": "*cedge*"
register: cedge_ec2_info

- name: Get params for cEdge
ansible.builtin.include_tasks: aws_cedge_ec2_instance.yml
vars:
hostname: "{{ host }}"
loop: "{{ cedge_ec2_info.instances | map(attribute='tags.Name') | list }}"
loop_control:
loop_var: host
53 changes: 53 additions & 0 deletions roles/azure_device_params/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
_# Ansible Role: azure_device_params

The `azure_device_params` Ansible role reads params from cEdge devices deployed on Azure, so that they can be used through other roles.

## Role Description

The `azure_device_params` role generates deployment facts for already deployed cEdge devices. For each cEdge deployment facts contain information about its:
- `hostname`
- `admin_username`
- `admin_password`
- `mgmt_public_ip`
- `transport_public_ip`
- `service_interfaces`
Additionally the role sets the `manager_authentication` variable, which can be used for logging to vManage in other roles.

## Requirements

- The `cisco.sdwan_deployment` collection installed.
- Ansible 2.16 or higher.
- Ansible Azure modules (`azure.azcollection` collection) installed.
- Azure CLI configured with the necessary permissions to manage Azure resources.

## Dependencies

There are no external role dependencies. Only `cisco.sdwan_deployment` collection is required.

### Required Variables

- `admin_password`: The admin password for virtual machine access.
- `az_resource_group`: The name of the Azure resource group for the deployment.

## Example Playbook

Including an example of how to use your role (for instance, with variables passed in as parameters):

```yaml
- name: Read deployed cEdge parameters
hosts: localhost
gather_facts: false
vars:
az_resource_group: "resource-group"
admin_password: "password" # pragma: allowlist secret
roles:
- cisco.sdwan_deployment.azure_device_params
```

## License

"GPL-3.0-only"

## Author Information

This role was created by Przemyslaw Susko <[email protected]>_
17 changes: 17 additions & 0 deletions roles/azure_device_params/meta/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates

---

galaxy_info:
author: Przemyslaw Susko <[email protected]>
description: Deploy Cisco SD-WAN cEdges (C8000V) on AWS
license: GPL-3.0-or-later
min_ansible_version: "2.16.6"

galaxy_tags:
- cisco
- sdwan
- catalystwan
- networking

dependencies: []
42 changes: 42 additions & 0 deletions roles/azure_device_params/tasks/az_cedge_ec2_instance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)

---

- name: Set mgmt and transport IP address facts
ansible.builtin.set_fact:
mgmt_public_ip: "{{ (public_ips | selectattr('tags.type', 'equalto', 'mgmt') | list | first).ip_address }}"
transport_public_ip: "{{ (public_ips | selectattr('tags.type', 'equalto', 'transport') | list | first).ip_address }}"

- name: Get service NICs
azure.azcollection.azure_rm_networkinterface_info:
resource_group: "{{ az_resource_group }}"
tags:
- type:service
register: service_nic_info

- name: Set helper facts
ansible.builtin.set_fact:
service_interfaces: []
last_index: 2
cedge_service_nic_info: "{{ service_nic_info.networkinterfaces | selectattr('tags.Name', 'search', hostname) | list }}"

- name: Append to service_interfaces fact
ansible.builtin.set_fact:
service_interfaces: "{{ service_interfaces + [{'addr': item.ip_configurations[0].private_ip_address, 'index': last_index}] }}"
loop: "{{ cedge_service_nic_info }}"

- name: Set instance fact
ansible.builtin.set_fact:
instance:
hostname: "{{ hostname }}"
admin_username: "admin"
admin_password: "{{ admin_password }}"
mgmt_public_ip: "{{ mgmt_public_ip }}"
transport_public_ip: "{{ transport_public_ip }}"
service_interfaces: "{{ service_interfaces }}"

- name: Update deployment facts
ansible.builtin.set_fact:
deployment_facts:
deployed_edge_instances: "{{ deployment_facts.deployed_edge_instances + [instance] }}"
46 changes: 46 additions & 0 deletions roles/azure_device_params/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)

---

- name: Verify if user session with Azure is active
ansible.builtin.include_role:
name: common
tasks_from: az_user_session_probe

- name: Gather public IP addresses
azure.azcollection.azure_rm_publicipaddress_info:
resource_group: "{{ az_resource_group }}"
register: public_ip_info

- name: Set manager authentication fact
ansible.builtin.set_fact:
manager_authentication:
url: "{{ public_ip_info.publicipaddresses |
selectattr('tags.Machine', 'search', 'vManage') |
selectattr('tags.type', 'equalto', 'mgmt') |
map(attribute='ip_address') |
list | first }}"
username: "admin"
password: "{{ admin_password }}"

- name: Get all VMs
azure.azcollection.azure_rm_virtualmachine_info:
resource_group: "{{ az_resource_group }}"
register: vm_info

- name: Filter cedge VMs
ansible.builtin.set_fact:
cedge_vms: "{{ vm_info.vms | selectattr('name', 'search', 'cedge') | list }}"

- name: Define deployment facts
ansible.builtin.set_fact:
deployment_facts:
deployed_edge_instances: []

- name: Get params for cEdge
ansible.builtin.include_tasks: az_cedge_ec2_instance.yml
vars:
hostname: "{{ item.name }}"
public_ips: "{{ public_ip_info.publicipaddresses | selectattr('tags.Machine', 'equalto', item.name) | list }}"
loop: "{{ cedge_vms }}"
Loading