22-07-2021 10:58 AM - modifié 22-07-2021 11:05 AM
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
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.
Résolu ! Accéder à la solution.
22-07-2021 08:32 PM - modifié 22-07-2021 08:33 PM
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.
le 23-07-2021 08:39 PM
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.
le 22-07-2021 11:35 AM
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 ?
22-07-2021 08:32 PM - modifié 22-07-2021 08:33 PM
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.
le 26-07-2021 06:39 AM - dernière modification le 26-07-2021 10:01 AM par Jimena Saez
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
le 27-07-2021 06:52 PM
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
le 23-07-2021 11:11 AM
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.
le 23-07-2021 08:39 PM
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.
le 23-07-2021 12:35 PM
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 ?
le 23-07-2021 08:28 PM - dernière modification le 26-07-2021 10:14 AM par Jimena Saez
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é?
le 28-07-2021 11:24 PM
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 ?
le 28-07-2021 11:40 PM
Voici une question de justin.solomon
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?
le 29-07-2021 12:13 AM
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 !
le 29-07-2021 11:29 AM
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
Découvrez et enregistrez vos notes préférées. Revenez pour trouver les réponses d'experts, des guides étape par étape, des sujets récents et bien plus encore.
Êtes-vous nouveau ici? Commencez par ces conseils. Comment utiliser la communauté Guide pour les nouveaux membres
Parcourez les liens directs de la Communauté et profitez de contenus personnalisés en français