2017-07-08 2 views
1

Donc j'utilise Ansible au jour le jour pour gérer nos instances AWS et maintenant je teste la gestion de notre infrastructure réseau (je suis un gars du réseau, qui peut faire certaines choses d'administration système) mais ont rencontré un problème que je n'arrive pas à contourner.Impossible d'ouvrir le shell: Ansible v2.3.1.0

J'ai ici un Cisco 3750G sur lequel j'ai activé SSH. Je peux ssh avec l'utilisateur spécifié et exécuter toutes les commandes qui échouent dans mon playbook.

Je suis en mesure d'utiliser le module ping avec succès de Ansible à ce commutateur, mais chaque fois que j'essaie d'utiliser les modules ios_commands ou ios_configs il échoue avec l'erreur unable to open shell. J'utilise Ansible v2.3.1.0 qui a des connexions persistantes comme une nouvelle fonctionnalité. J'ai fait quelques recherches sur Google et j'ai trouvé quelques personnes qui ont eu ce problème et l'ont réparé de différentes façons (qui n'ont pas fonctionné pour moi).

choses que j'ai essayé:

  • les variables de Précisés connexion dans un fichier secrets.yaml. Puis spécifié le provider en utilisant mon nom d'utilisateur, auth_pass, et le mot de passe dans le fichier secrets.
  • Modification du paramètre ansible_connection-local et ssh (ni travaillé)
  • host_key_checking désactivé pour l'instant dans mon dossier ansible.cfg

Après cela ne fonctionnait pas, j'ai essayé: - créer manuellement les variables de connexion du fournisseur dans la Playbook lui-même. - d'occasion 2 modules différents ios_commands et ios_configs (il y a une
différence entre les 2 modules, mais pour mon utilisation à la fois doit agir de la même)

https://docs.ansible.com/ansible/network_debug_troubleshooting.html#category-unable-to-open-shell Cette Etats doc que l'erreur que je vois est normalement un problème d'authentification mais cela ne semble pas être le cas ici.

Quelqu'un d'autre est-il confronté à ce problème? J'ai un fichier journal avec la sortie de débogage de mon exécution playbook si quelqu'un veut voir cela. J'ai posté mon exemple de playbook ci-dessous pour examen.

hôtes: commutateur gather_facts: pas de connexion : locales tâches:

- name: GATHER CREDENTIALS 
    include_vars: secrets.yaml 

- name: DEFINE CONNECTION PROVIDER 
    set_fact: 
    provider: 
     username: "{{ creds['username'] }}" 
     password: " {{ creds['password'] }}" 
     auth_pass: "{{ creds['auth_pass'] }}" 

- name: Show interfaces 
    ios_config: 
    provider: "{{ provider }}" 
    commands: 
     - show ip int br 
    register: cisco_int 

- debug: var=cisco_int.stdout_lines 
+0

Donc, je n'ai toujours pas réussi à faire fonctionner cette version d'Ansible. Je vais essayer d'installer une version plus ancienne (sans la fonction de connexion persistante) et voir si cela fonctionne. –

Répondre

2

J'ai finalement compris ce qui se passait ici. C'était une combinaison de choses.

  • La fonction de connexion persistante de 2,3 est brisée pour moi si je devais à rétrograder 2.2.0.0

  • Ensuite, je devais spécifier manuellement mon interpréteur python dans mon inventaire. Apparemment, vous pouvez installer paramiko d'une manière qui ne l'installe pas à /usr/bin/python mais à la place va à /usr/local/bin/python, l'ancien étant où Ansible exécute ses modules. J'ai également pensé que le comportement de ios_command et ios_config était similaire. config est utilisé pour les commandes en mode global/interface config . command s'exécute à partir du mode exec utilisateur et priv.

Maintenant, mes courses playbook et je peux obtenir la sortie de show ip int br sur mon 3750.

0

Je sais que vous avez dit que vous rétrogradé. Peut-être que cela aide si vous décidez de donner un autre coup de 2.3. J'ai eu un peu le même problème en passant de 2.2 à 2.3 Je cours mon playbook de base avec le format suivant. Bien que dans ma configuration TACACS je n'utilise pas les secrets d'activation, j'ai inclus l'option.

hôtes

[ios:vars] 
ansible_python_interpreter=/usr/bin/python 
ansible_connection = local 
# If SSH/ For Telnet - Port=23 
port=22 
[ios] 
ios-swt-1 
ios-rtr-1 

secrets.yml

--- 
creds: 
username: ansible 
password: '@ns1Bl3' 
#Uncomment For Enable: 
#auth_pass: [email protected] 

Playbook

--- 
- hosts: ios 
    gather_facts: no 
    connection: local 

    tasks: 

    - name: obtain login credentials 
    include_vars: secrets.yml 

    - name: define provider 
    set_fact: 
     provider: 
     host: "{{ inventory_hostname }}" 
     username: "{{ creds['username'] }}" 
     password: "{{ creds['password'] }}" 
     #Uncomment next line if enable password is needed 
     #auth_pass: "{{ creds['auth_pass'] }}" 
     transport: cli 

    - include: tasks/ios_command-freeform.yml 

tâches/ios_command-freeform.yml

--- 
- name: Freeform Task 
    ios_command: 
    provider: "{{ provider }}" 
    commands: 
# Change the command after "-" to any IOS command you would like to run. 
     - show version 
    register: freeform 

# Provides an output if -vvv is not used when running ansible-playbook 
- debug: var=freeform.stdout_lines 

- name: append to output 
# append the command output to a local file 
    copy: 
    content: "{{ freeform.stdout[0] }}" 
    dest: "play_results/{{ inventory_hostname }}.txt" 
+0

Hmm ne pense pas que ce serait possible dans mon environnement. Activer les mots de passe sont sur tout: P Bien que j'ai vu quelques modifications au module networkcli dans la dernière version d'ansible. Peut-être que je vais recommencer ... –