2017-09-19 6 views
-1

Commencé à expérimenter avec Ansible et en utilisant des playbooks pour automatiser certaines tâches de routine sur les périphériques réseau. J'ai pu apprendre des choses de base et apprendre en cours de route, mais je sais que mes connaissances sont limitées alors quand je vois ce livre et combien de choses semblent redondantes, je dois supposer qu'il y a de meilleures façons d'éliminer la redondance et de faire les choses plus propre et plus efficace. Exemple Je veux essayer d'utiliser et d'expliquer afin d'obtenir des idées sur la configuration d'un nouveau vlan sur un groupe de périphériques.Conseils pour améliorer l'efficacité de mes playbooks?

Typiquement, un nouveau vlan doit d'abord être configuré sur les deux commutateurs de distribution, puis il y a des interfaces spécifiques sur ces deux commutateurs auxquels nous devons ajouter le vlan.

Ainsi, pour cette première partie, j'ai les deux hôtes dans un groupe appelé « dist » dans mes hôtes fichier:

[dist] 
DIST01 ansible_host=10.10.1.1 
DIST02 ansible_host=10.10.1.2 

Puis j'ai créé ce qui suit dans mon PlayBook:

- name: Add Heartbeat VLAN to DIST 
    hosts: dist 
    connection: local 
    gather_facts: no 

    tasks: 
    - name: Include Login Credentials 
    include_vars: secrets.yml 

    - name: Define Provider 
    set_fact: 
     provider: 
     host: "{{ ansible_host }}" 
     username: "{{ creds['username'] }}" 
     password: "{{ creds['password'] }}" 

    tasks: 
    - name: Ensure VLAN Exists 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id="2600" state=present host={{ ansible_host }} 

    - name: Ensure VLAN Name Configured 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id={{ item.vid }} name={{ item.name }} host={{ ansible_host }} state=present 
     with_items: 
     - { vid: 2600, name: Ansible Heartbeat VLAN } 

    - name: ASSIGN VLAN TO TRUNK PORTS 
     nxos_switchport: 
     interface: "{{ item.interface }}" 
     mode: trunk 
     trunk_vlans: "{{ item.vlan }}" 
     provider: "{{ provider }}" 
     with_items: 
     - { interface: po850, vlan: 2600 } 
     - { interface: po860, vlan: 2600 } 
     - { interface: po865, vlan: 2600 } 
     - { interface: po868, vlan: 2600 } 
     - { interface: po871, vlan: 2600 } 
     - { interface: po872, vlan: 2600 } 
     - { interface: po875, vlan: 2600 } 
     - { interface: po877, vlan: 2600 } 
     - { interface: po884, vlan: 2600 } 

Ainsi, pour chaque hôte de ce groupe, il parcourt une liste d'interfaces/ports et ajoute le vlan spécifié.

Question n ° 1. La première chose qui se démarque comme étant "inefficace" dans mon esprit est que je ne crois pas qu'il soit très sage d'avoir à spécifier le "vlan: 2600" partout.

Je pense que je devrais juste définir le vlan comme une variable où (dans le playbook? Dans un autre fichier qui est appelé?) À utiliser dans chaque cas où il est nécessaire.

Série de tâches:

Une fois la tâche précédente prochain nous oblige à se connecter à chaque commutateur d'accès qui a besoin du vlan à déployer et configurer le nouveau vlan là.

Le problème que je rencontre ici est que le port-canal sur chacun de ces commutateurs est une interface différente #. Je ne peux donc pas appliquer la même configuration en parcourant simplement une liste de périphériques.

Par exemple ce que je dois faire est quelque chose comme ceci:

host: ACCESS01 interface: po850 vlan: 2600 
host: ACCESS02 interface: po860 vlan: 2600 
host: ACCESS03 interface: po870 vlan: 2600 

Ainsi, pour chaque hôte vous commutateur/ajouter le vlan à l'interface associée à ce commutateur.

Je viens de créer une nouvelle tâche pour chaque périphérique qui spécifie l'interface à configurer pour ce commutateur.

Exemple:

- name: Add Heartbeat VLAN to ACCESS01 
    hosts: ACCESS01 
    connection: local 
    gather_facts: no 

    tasks: 
    - name: Include Login Credentials 
    include_vars: secrets.yml 

    - name: Define Provider 
    set_fact: 
     provider: 
     host: "{{ ansible_host }}" 
     username: "{{ creds['username'] }}" 
     password: "{{ creds['password'] }}" 

    tasks: 
    - name: Ensure VLAN Exists 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id="2600" state=present host={{ ansible_host }} 

    - name: Ensure VLAN Name Configured 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id={{ item.vid }} name={{ item.name }} host={{ ansible_host }} state=present 
     with_items: 
     - { vid: 2600, name: Ansible Heartbeat VLAN } 

    - name: ASSIGN VLAN TO PORTS 
     nxos_switchport: 
     interface: "{{ item.interface }}" 
     mode: trunk 
     trunk_vlans: "{{ item.vlan }}" 
     provider: "{{ provider }}" 
     with_items: 
     - { interface: po850, vlan: 2600 } 


- name: Add Heartbeat VLAN to ACCESS02 
    hosts: ACCESS02 
    connection: local 
    gather_facts: no 

    tasks: 
    - name: Include Login Credentials 
    include_vars: secrets.yml 

    - name: Define Provider 
    set_fact: 
     provider: 
     host: "{{ ansible_host }}" 
     username: "{{ creds['username'] }}" 
     password: "{{ creds['password'] }}" 

    tasks: 
    - name: Ensure VLAN Exists 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id="2600" state=present host={{ ansible_host }} 

    - name: Ensure VLAN Name Configured 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id={{ item.vid }} name={{ item.name }} host={{ ansible_host }} state=present 
     with_items: 
     - { vid: 2600, name: Ansible Heartbeat VLAN } 

    - name: ASSIGN VLAN TO PORTS 
     nxos_switchport: 
     interface: "{{ item.interface }}" 
     mode: trunk 
     trunk_vlans: "{{ item.vlan }}" 
     provider: "{{ provider }}" 
     with_items: 
     - { interface: po860, vlan: 2600 } 

- name: Add Heartbeat VLAN to ACCESS03 
    hosts: ACCESS03 
    connection: local 
    gather_facts: no 

    tasks: 
    - name: Include Login Credentials 
    include_vars: secrets.yml 

    - name: Define Provider 
    set_fact: 
     provider: 
     host: "{{ ansible_host }}" 
     username: "{{ creds['username'] }}" 
     password: "{{ creds['password'] }}" 

    tasks: 
    - name: Ensure VLAN Exists 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id="2600" state=present host={{ ansible_host }} 

    - name: Ensure VLAN Name Configured 
     provider: "{{ provider }}" 
     nxos_vlan: vlan_id={{ item.vid }} name={{ item.name }} host={{ ansible_host }} state=present 
     with_items: 
     - { vid: 2600, name: Ansible Heartbeat VLAN } 

    - name: ASSIGN VLAN TO PORTS 
     nxos_switchport: 
     interface: "{{ item.interface }}" 
     mode: trunk 
     trunk_vlans: "{{ item.vlan }}" 
     provider: "{{ provider }}" 
     with_items: 
     - { interface: po870, vlan: 2600 } 

Et tu vois ... Je sais que quand je vois des choses presque identiques répétées encore et encore, je dois supposer qu'il ya une meilleure façon et je ne sais pas assez encore à résoudre par moi-même.

Question # 2.Je pense qu'il ya une meilleure façon de gérer répéter ce qui suit pour chaque tâche dans le PlayBook:

tasks: 
     - name: Include Login Credentials 
     include_vars: secrets.yml 

     - name: Define Provider 
     set_fact: 
      provider: 
      host: "{{ ansible_host }}" 
      username: "{{ creds['username'] }}" 
      password: "{{ creds['password'] }}" 

Question # 3, pourrais-je citer que ces données quelque part, que ce soit dans le PlayBook ou un autre fichier peut-être puis créer une tâche qui pourrait parcourir les données pour déterminer quel port doit être configuré?

host: ACCESS01 interface: po850 vlan: 2600 
host: ACCESS02 interface: po860 vlan: 2600 
host: ACCESS03 interface: po870 vlan: 2600 

Une sorte de logique à cela dans mon esprit serait quelque chose comme, si « hôte » est égal à « ACCESS01 », puis l'interface est égale à po850.

La tâche pourrait-elle simplement référencer des variables qui sont remplies en fonction de l'hôte sur lequel elle travaille actuellement?

Toutes les pensées et les conseils sur l'amélioration à la fois le playbook et ma connaissance des choses sont grandement appréciés. Je suppose que je suis à la recherche de la manière la plus "possible" d'accomplir cela. Ce n'est pas un mot hein?

Répondre

0

Pour la question n ° 1, vous pouvez utiliser comme ceci:

- name: ASSIGN VLAN TO TRUNK PORTS 
    nxos_switchport: 
    interface: "{{ item.interface }}" 
    mode: trunk 
    trunk_vlans: "{{ item.vlan | default('2600') }}" 
    provider: "{{ provider }}" 
    with_items: 
    - interface: po850 
    - interface: po860 
    - interface: po865 
    - interface: po868 
    - interface: po871 
    - interface: po872 
    - interface: po875 
    - interface: po884 

Si vous souhaitez affecter différentes vlan à une ou plusieurs interface (s), vous pouvez utiliser comme ceci:

- { interface: po850, vlan: 2700 } 

J'espère que cela vous aidera.