annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 
cancel
6035
Visites
20
Compliment
12
Réponses

Découvrez Cisco ACI avec Francesco Molino et Apprenez-en davantage sur l'Automatisation

Forum Ask Me Anything

Demandez-moi n'importe quoi à propos de Cisco ACI pour la Programmabilité des Réseaux (Network Programmability) et l'Automatisation des Flux de Travail (Workflow Automation). Désormais, vous pouvez en savoir plus sur la modélisation, l'automatisation et la programmation des informations de gestion, et avoir une introduction sur les ressources disponibles et le dépannage. Posez vos questions !  

Savez-vous comment automatiser la configuration des applications ou le déploiement des politiques avec Ansible ou Terraform ? Découvrez comment le déploiement d'applications vous aide à gérer la mise en réseau multidomaine. Rejoignez-nous et soumettez vos questions à notre membre VIP 2020 !

Veuillez soumettre vos questions en cliquant "Répondre"

(Les réponses seront fournies en fonction de la disponibilité de nos experts)
Complimentez ou qualifiez les réponses pour remercier les experts !


Notre expert
Photo_Francesco_Molino_100x135px.png Francesco Molino est actuellement Senior Network & Security Consultant chez IPConsul à Montréal (Canada) et un expert dans les domaines de l'électronique, des réseaux et de la sécurité informatique. Il possède les certifications CCIE en Entreprise Infrastructure, Service Provider et Security n°35050, et Firejumper Elite n°154. Avec plus de 15 ans d’expérience dans les télécommunications, il est un fervent partisan de Cisco et des solutions open source. Francesco s'intéresse au développement d'outils d'automatisation utilisant Python, Ansible, Terraform, Bash et s'appuie également sur les APIs fournies par les différents manufacturiers. Francesco est un top contributeur de la communauté depuis 2009, nommé Designated VIP en 2017, 2018, 2019 et 2020.

2 SOLUTIONS APPROUVÉES

Solutions approuvées

Bonjour @Lennart Jung  

 

Vous pouvez remplacer la ligne suivante dans votre ressource aci_access_port_selector

leaf_interface_profile_dn = "aci_leaf_interface_profile.IP_LEAF-Profiles.${each.value.VPC_PRD_DATA_IP}.id"

par

leaf_interface_profile_dn = aci_leaf_interface_profile.IP_LEAF-Profiles[each.value.VPC_PRD_DATA_IP].id

Cela devrait fonctionner selon ce que vous essayez d'atteindre comme objectif.

 


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question

Voir la solution dans l'envoi d'origine

Bonjour @floatingpurr 

Juste pour être certain de comprendre votre question.
Vous souhaitez avoir le client anyconnect installé sur ce serveur pour vous connecter sur un réseau distant?

Si oui, vous pouvez avoir le package anyconnect pour Linux disponible sur le site de Cisco et celui peut être utilisé soit en cli (s'il s'agit d'un Linux server sans gui) soit le client graphique.
Vous avez aussi la possibilité d'utiliser le package openconnect disponible en utilisant apt (cli et gui).

 

Ou parlez vous d'avoir un serveur vpn sur ce serveur sur lequel les clients se connectent?

Si c'est le cas, vous pouvez installer openconnect server (ocserv) ou d'autres solutions linux. En revanche, anyconnect est une marque Cisco et disponible en client seulement.

Les clients pourront se connecter en utilisant soit anyconnect soit openconnect qui est disponible pour Linux, macos et Windows.


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question

Voir la solution dans l'envoi d'origine

12 RÉPONSES 12

Voici une question de Lennart Jung

Erreur ACI / Terraform : property value inconnue

Salut,

Je suis un débutant essayant de faire fonctionner TF et ACI - j'essaie de comprendre cela depuis quelques heures maintenant et je suis toujours coincé. Peut-être que vous avez une idée de comment résoudre cette erreur et m'orienter dans la bonne direction.

J'ai un ensemble de serveurs qui devraient être connectés à leurs leafs (1201, 1202), en allant au fur et à mesure avec une carte contenant tous les détails sur les serveurs, cela m'a semblé une bonne idée.

mes variables.tf ressemblent à ceci (j'ai extrait les bits intéressants):

variable "MAP_leaf_interface_profiles" {
type = map(any)
default = {
"IP_LEAF-1201" = { name="IP_LEAF-1201", name_alias="", description="IP_LEAF-1201"}
"IP_LEAF-1202" = { name="IP_LEAF-1202", name_alias="", description="IP_LEAF-1202"}
"IP_LEAF-2401" = { name="IP_LEAF-2401", name_alias="", description="IP_LEAF-2401"}
"IP_LEAF-2402" = { name="IP_LEAF-2402", name_alias="", description="IP_LEAF-2402"}
"IP_LEAF-1201-1202" = { name="IP_LEAF-1201-1202", name_alias="", description="IP_LEAF-1201-1202"}
"IP_LEAF-2401-2402" = { name="IP_LEAF-2401-2402", name_alias="", description="IP_LEAF-2401-2402"}
}
}

variable "MAP_VxRail_hostnames-TEST" {
type = map(any)
default = {
"XX123456789012-1201" = { hostname="XX123456789012", dc_location="DC1", VPC_PRD_DATA_interface="eth1/25", VPC_PRD_DATA_IP_tdn="uni/infra/accportprof-IP_LEAF-1201", VPC_PRD_DATA_IP="IP_LEAF-1201"},
"XX123456789012-1202" = { hostname="XX123456789012", dc_location="DC1", VPC_PRD_DATA_interface="eth1/25", VPC_PRD_DATA_IP_tdn="uni/infra/accportprof-IP_LEAF-1202", VPC_PRD_DATA_IP="IP_LEAF-1202"}
}
}

Je peux très bien créer les profils d'interface "IP_LEAF-XXXX" avec cet snippet :

resource "aci_leaf_interface_profile" "IP_LEAF-Profiles" {
for_each = var.MAP_leaf_interface_profiles
description = each.value.description
name = each.value.name
}

Dans une prochaine étape, je voudrais créer le access_port_selector pour chaque serveur avec ce morceau de code :

resource "aci_access_port_selector" "IS_FRx-PRD_VxRail-DATA-SN" {
for_each = var.MAP_VxRail_hostnames-TEST
name = "IS_${each.value.dc_location}-PRD_VxRail-DATA-${each.key}"
leaf_interface_profile_dn = "aci_leaf_interface_profile.IP_LEAF-Profiles.${each.value.VPC_PRD_DATA_IP}.id"
description = "${each.value.hostname}"
access_port_selector_type = "range"
}

qui échoue complètement avec l'erreur suivante :

│ Error: unknown property value aci_leaf_interface_profile.IP_LEAF-Profiles.IP_LEAF-1201.id/hports-IS_FR2-PRD_VxRail-DATA-XX123456789012-1201-typ-range, name dn, class infraHPortS [(Dn0)] Dn0=,

│ with aci_access_port_selector.IS_FRx-PRD_VxRail-DATA-SN["XX123456789012-1201"],
│ on main.tf line 67, in resource "aci_access_port_selector" "IS_FRx-PRD_VxRail-DATA-SN":
│ 67: resource "aci_access_port_selector" "IS_FRx-PRD_VxRail-DATA-SN" {

Cependant lors de la modification de la ligne suivante (comme le codage en dur du tdn)

 leaf_interface_profile_dn = "${each.value.VPC_PRD_DATA_IP_tdn}" 

 tout fonctionne bien:

aci_access_port_selector.IS_FRx-PRD_VxRail-DATA-SN["XX123456789012-1202"]: Creating...
aci_access_port_selector.IS_FRx-PRD_VxRail-DATA-SN["XX123456789012-1201"]: Creating...
aci_access_port_selector.IS_FRx-PRD_VxRail-DATA-SN["XX123456789012-1201"]: Creation complete after 1s [id=uni/infra/accportprof-IP_LEAF-1201/hports-IS_FR2-PRD_VxRail-DATA-XX123456789012-1201-typ-range]
aci_access_port_selector.IS_FRx-PRD_VxRail-DATA-SN["XX123456789012-1202"]: Creation complete after 1s [id=uni/infra/accportprof-IP_LEAF-1202/hports-IS_FR2-PRD_VxRail-DATA-XX123456789012-1202-typ-range]

 

Comment puis-je régler ça ? Je voudrais éviter d'utiliser le tDN dans le map. Ou bien existe-t-il une meilleure approche pour le faire ?

Bonjour @Lennart Jung  

 

Vous pouvez remplacer la ligne suivante dans votre ressource aci_access_port_selector

leaf_interface_profile_dn = "aci_leaf_interface_profile.IP_LEAF-Profiles.${each.value.VPC_PRD_DATA_IP}.id"

par

leaf_interface_profile_dn = aci_leaf_interface_profile.IP_LEAF-Profiles[each.value.VPC_PRD_DATA_IP].id

Cela devrait fonctionner selon ce que vous essayez d'atteindre comme objectif.

 


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question

Hi @Francesco Molino 

Cela a résolu le problème ! Merci beaucoup ! Y a-t-il une explication pour laquelle on doit utiliser des crochets ? Serait-il possible d'utiliser plusieurs variables à l'intérieur des crochets, c'est-à-dire :

Texte d'origine:

this indeed fixed the problem! Thank you very much! Is there an explanation as to why I have to use square-brackets? Would it be possible to use multiple variables within those square brackets - i.e.:

 

leaf_interface_profile_dn = aci_leaf_interface_profile.IP_LEAF-Profiles [concat(each.value.VPC_PRD_DATA_IP,"sometext", each.value.hostname)] .id

 

L'utilisation des crochets c'est pour pouvoir avoir le contenu en mode compute sinon en mettant un debug vous pouvez voir le message d'erreur qui apparait:

 

The following problems may be the cause of any confusing errors from downstream operations:
- .annotation: planned value cty.StringVal("orchestrator:terraform") for a non-computed attribute

 


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question

Voici une question de floatingpurr

Installation d'AnyConnect sur un serveur distant

Bonjour. Je vais participer à un séminaire Cisco sur IaC. Dans ce séminaire, nous allons effectuer des exercices pratiques avec Ansible et Terraform contre des DevNet sandboxes ou des environnements dCloud. Nous avons besoin d'AnyConnect. J'ai installé Ansible et Terraform sur un serveur distant exécutant Ubuntu 20 LTS (i.e. Debian). Existe-t-il un moyen d'installer AnyConnect sur un tel serveur distant afin de se connecter à des laboratoires distants ?

Est-ce que ça va marcher? Toutes suggestions/remarques sont plus que bienvenues.

Bonjour @floatingpurr 

Juste pour être certain de comprendre votre question.
Vous souhaitez avoir le client anyconnect installé sur ce serveur pour vous connecter sur un réseau distant?

Si oui, vous pouvez avoir le package anyconnect pour Linux disponible sur le site de Cisco et celui peut être utilisé soit en cli (s'il s'agit d'un Linux server sans gui) soit le client graphique.
Vous avez aussi la possibilité d'utiliser le package openconnect disponible en utilisant apt (cli et gui).

 

Ou parlez vous d'avoir un serveur vpn sur ce serveur sur lequel les clients se connectent?

Si c'est le cas, vous pouvez installer openconnect server (ocserv) ou d'autres solutions linux. En revanche, anyconnect est une marque Cisco et disponible en client seulement.

Les clients pourront se connecter en utilisant soit anyconnect soit openconnect qui est disponible pour Linux, macos et Windows.


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question

Didier M
Level 1
Level 1

Salut

Pouvez-vous me pointer vers un groupe de ressources ou un attribut pouvant être utilisé pour exporter des contrats dans ACI pour la communication inter-vrf ?

Bonjour

Tout dépend si vous voulez utiliser Terraform ou Ansible.
Par exemple, la documentation Ansible pour la collection Cisco ACI donne des exemples:
https://galaxy.ansible.com/cisco/aci

 

Des exemples peuvent être trouvés sur DevNet, GitHub…
Est-ce que vous cherchez des exemples de code déjà préparé?

 


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question

Voici une question de EvanC

Autorisation refusée - Ansible Hands On NXOS Sandbox

Je m'entraine avec le laboratoire Ansible Hands On avec NXOS Sandbox

À l'étape 3, je comprends que le but est de créer un playbook pour copier un fichier hosts personnalisé pour remplacer les fichiers hosts par défaut stockés dans /etc/hosts

Cependant, lorsque j'exécute le playbook conformément aux instructions du laboratoire, la tâche "push new host file" a échoué car elle demande le mot de passe sudo.

TASK [Push new host file] *******************************************************************************************************************************************************************************************************************
fatal: [10.10.20.50]: FAILED! => {"msg": "Failed to get information on remote file (/etc/hosts): sudo: a password is required\n"}

 

Ensuite, j'essaie de copier moi-même les hosts personnalisés via

$ sudo cp -r files/hosts /etc/hosts

 

Cette commande échoue également :

developer is not in the sudoers file. This incident will be reported.

 

Il semblerait que l'utilisateur "developer" créé pour NXOS Sandbox n'ait pas le droit sudo.

Pouvez-vous m'indiquer comment procéder avec ce lab en tant qu'utilisateur sans droits sudo ?

 

Voici une question de justin.solomon

Importation ACI Terraform

L'entreprise dans laquelle je travaille dispose d'une plateforme CI/CD IaC. Nous utilisons Terraform, Azure Devops et Octopus Deploy pour pousser le code vers les environnements. Je suis nouveau dans le développement de Terraform, donc mes questions peuvent vous paraitre élémentaires.

Nous avons une infrastructure ACI existante en place. Nous avons également le simulateur ACI en place dans notre environnement de développement. J'ai récemment joué avec le changement de code dans le simulateur. En raison de l'infrastructure existante, je trouve assez difficile de commencer à déployer des modifications avec du code sans trop modifier l'environnement existant.

Au cours de mes recherches, j'ai découvert qu'il serait possible d'importer la configuration ACI dans le Terraform state. Avez-vous déjà essayé cette procédure ? Est-ce possible? Pouvez-vous m'indiquer de la documentation pour y parvenir?

Voici une question de black

Ansible + Cobra SDK + Repo aci-ansible de Jason Edelman

Salut,

En espérant que ce soit quelque chose de facile à résoudre. Je suis nouveau sur Ansible, ACI et le SDK Cobra. Je vois cette erreur lorsque j'essaie d'exécuter un Playbook Ansible qui utilise la bibliothèque aci-ansible de Jason Edelman. Cobra SDK n'est pas trouvé, même s'il semble être installé. L'erreur spécifique lorsque j'exécute le playbook est :

 

fatal: [10.10.10.10]: FAILED! => {"changed": false, "error": "No module named cobra.mit.access", "failed": true, "msg": "Ensure you have the ACI Cobra SDK installed"}

 

Et voici les étapes que j'ai suivies pour installer la bibliothèque Ansible et le SDK, dont la plupart proviennent directement des instructions publiées sur le contrôleur ACI.

git clone https://github.com/jedelman8/aci-ansible.git ~/ansible/aci-ansible
mkdir ~/cobra_sdk_2.2_1o
cd ~/cobra_sdk_2.2_1o
sudo easy_install virtualenv
cd ~
virtualenv cobra_sdk_2.2_1o
source cobra_sdk_2.2_1o/bin/activate
cd ~/cobra_sdk_2.2_1o
easy_install -Z acicobra-2.2_1o-py2.7.egg
easy_install -Z acimodel-2.2_1o-py2.7.egg

Une fois que c'est fait, il semble être là et fonctionner.

(cobra_sdk_2.2_1o) sdfsd@sfsdf12:~/cobra_sdk_2.2_1o$ pip freeze
acicobra===2.2-1o
acimodel===2.2-1o
appdirs==1.4.3
packaging==16.8
pyparsing==2.2.0
requests==2.13.0
six==1.10.0

Je suis également capable d'importer depuis Python.

(cobra_sdk_2.2_1o) sdfd@sdfd12:~/cobra_sdk_2.2_1o$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from cobra.mit.access import MoDirectory
>>>

Et voici mon playbook:

---
- hosts: "{{ host_list }}"
gather_facts: no
connection: local

tasks:

- name: define user
set_fact:
user: bart

- name: define pass
set_fact:
pass: simpson

- name: build a test bridge domain
aci_bridge_domain: name=1212_DELETEME context=aaa tenant=b state=present host={{ inventory_hostname }} username={{ user }} password={{ pass }}

- name: remove a test bridge domain
aci_bridge_domain: name=1212_DELETEME context=aaa tenant=b state=absent host={{ inventory_hostname }} username={{ user }} password={{ pass }}

Mais chaque fois que je l'exécute, il échoue avec l'erreur suivante (identique à celle répertoriée ci-dessus). Avez-vous une idée ?

fatal: [10.0.49.34]: FAILED! => {"changed": false, "error": "No module named cobra.mit.access", "failed": true, "msg": "Ensure you have the ACI Cobra SDK installed"}

 

Merci d'avance pour vos commentaires !

Bonjour

 

Je vois que votre playbook se réfère à un module appelé aci_bridge_domain qui n'existe pas dans le code que vous utilisez.

Le module correct serait: aci_bd.

Aussi, pouvez vous partager le contenu de votre fichier ansible.cfg ou votre fichier host qui doit référé le programme python à utiliser:

 

ansible_python_interpreter=/usr/bin/python3

 

Maintenant, cette library est vieille de 4 ans et que je vous conseillerais d'utiliser la collection ansible cisco.aci (https://galaxy.ansible.com/cisco/aci)

Vous aurez besoin d'utiliser aci_bd et aci_bd_subnet. Sur la page web de la collection cisco.aci sur ansible, vous trouverez les différents paramètres à utiliser ainsi que des examples.

Pour info, voici un example ci dessous

    - name: Create Bridge Domain
      aci_bd:
        host: '{{ ansible_host }}'
        username: '{{ username }}'
        private_key: '{{ private_key }}'
        certificate_name: '{{ certificate_name }}'
        validate_certs: no
        tenant: '{{ item.TENANT }}'
        bd: '{{ item.BD }}'
        vrf: '{{ item.VRF_FULL }}'
        enable_multicast: 'yes'
        enable_routing: 'yes'
        l2_unknown_unicast: 'proxy'
        l3_unknown_multicast: 'flood'
        multi_dest: 'bd-flood'
        arp_flooding: 'yes'
        state: present
      tags: l3
      loop: '{{ l3_list }}'

    - name: Create Bridge Domain Subnet
      aci_bd_subnet:
        host: "{{ ansible_host }}"
        username: '{{ username }}'
        private_key: '{{ private_key }}'
        certificate_name: '{{ certificate_name }}'
        validate_certs: no
        tenant: '{{ item.TENANT }}'
        bd: '{{ item.BD }}'
        gateway: "{{ item.ANYCAST_GATEWAY }}"
        mask: "{{ (item.BD_SUBNET).split('/')[1] | int }}"
        scope: public
        state: present
      tags: l3
      loop: '{{ l3 }}'

Dans mon exemple, il y a une loop qui fait appelle à une variable l3 car j'utilise un fichier excel avec plusieurs subnets à créer mais si vous voulez un seul bridge-domain, vous pourrez l'adapter comme suit:

 

    - name: Create Bridge Domain
      aci_bd:
        host: '{{ ansible_host }}'
        username: '{{ username }}'
        private_key: '{{ private_key }}'
        certificate_name: '{{ certificate_name }}'
        validate_certs: no
        tenant: 'TEST_TENANT'
        bd: 'TEST_BD'
        vrf: 'TEST_VRF'
        enable_multicast: 'yes'
        enable_routing: 'yes'
        l2_unknown_unicast: 'proxy'
        l3_unknown_multicast: 'flood'
        multi_dest: 'bd-flood'
        arp_flooding: 'yes'
        state: present

    - name: Create Bridge Domain Subnet
      aci_bd_subnet:
        host: "{{ ansible_host }}"
        username: '{{ username }}'
        private_key: '{{ private_key }}'
        certificate_name: '{{ certificate_name }}'
        validate_certs: no
        tenant: 'TEST_TENANT'
        bd: 'TEST_BD'
        gateway: "10.10.10.1"
        mask: "24"
        scope: public
        state: present

 


Thanks
Francesco
PS: Please don't forget to rate and select as validated answer if this answered your question