Keine Verbindung mit Ansible

Krull

Well-Known Member
Hallo,
kürzlich hat sich die SD-Karte in meinem RaspberryPi verabschiedet, weshalb ich mir nun eine neue Karte mit einem frischen Rasbian besorgt habe. Eigentlich möchte ich da eine Ansible-Rolle drüber laufen lassen, um den ursprünglichen Zustand wiederherzustellen. Aber selbst einfachste Dinge bekomme ich gerade mit Ansible nicht hin.

Code:
user$: ansible raspberry -m raw -a uptime --ask-pass -vvv
ansible-2.7 2.8.7                                                                                                                                                            
  config file = /usr/home/user/ansible/ansible.cfg                                                                                                                           
  configured module search path = [u'/home/user/.ansible/plugins/modules', u'/usr/local/share/py27-ansible/plugins/modules'] 
  ansible python module location = /usr/local/lib/python2.7/site-packages/ansible                                                                                            
  executable location = /usr/local/bin/ansible-2.7                                                                                                                           
  python version = 2.7.17 (default, Jan  2 2020, 01:19:19) [GCC 4.2.1 Compatible FreeBSD Clang 6.0.1 (tags/RELEASE_601/final 335540)]
Using /usr/home/user/ansible/ansible.cfg as config file                                                                                                                      
SSH password:                                                                                                                                                                
host_list declined parsing /home/user/ansible/hosts as it did not pass it's verify_file() method                             
script declined parsing /home/user/ansible/hosts as it did not pass it's verify_file() method                                 
auto declined parsing /home/user/ansible/hosts as it did not pass it's verify_file() method                                  
Parsed /home/user/ansible/hosts inventory source with ini plugin                                                                                                             
META: ran handlers                                                                                                                                                           
<192.168.178.10> ESTABLISH SSH CONNECTION FOR USER: pi                                                                                                                       
<192.168.178.10> SSH: EXEC sshpass -d10 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no -o 'User="pi"' -
o ConnectTimeout=30 -o StrictHostKeyChecking=no -o ControlPath=/usr/home/user/.ansible/cp/0cec436af9 -tt 192.168.178.10 uptime
<192.168.178.10> (255, '', 'pi@192.168.178.10: Permission denied (publickey,password).\r\n')                                 
raspberry | UNREACHABLE! => {                                                                                                                                                
    "changed": false,                                                                                                                                                        
    "msg": "Failed to connect to the host via ssh: pi@192.168.178.10: Permission denied (publickey,password).", 
    "unreachable": true
}

Die IP ist korrekt, aber Permission denied muss Quatsch sein. Ich kann mich problemlos mit Standardkennung und -passwort über SSH anmelden:
Code:
user$: ssh pi@raspberry 'uptime'
pi@raspberry's password:                                           
 19:04:05 up  4:47,  1 user,  load average: 0.00, 0.00, 0.00

Was ist hier falsch?
 
Das ist's gewesen. Ich hatte es vorher schon mal mit --extra-vars='-ansible_ssh_common_args="-o PreferredAuthentications=password"' versucht, ohne Erfolg. In der ansible.cfg war aber nur publickey als bevorzugte Methode angegeben. Das ist jetzt weg und Ansible funktioniert. Ich hatte eigentlich angenommen, extra-vars überschreibt alles andere...

Danke!
 
Ich würde so wenig wie möglich mit den Inventory files auf systemebene arbeiten… Das ist immer blöd zu debuggen… -m raw ist eigentlich nur sinnvoll wenn man weiss oder glaubt, das die andere Seite kein python vorhanden hat… ist bei einem Linux recht unwahrscheinlich… bei einem OpenBSD kommt das schon eher vor. Die bessere Wahl wäre shell... anyway

Ich kann mir nur 2 Möglichkeiten vorstellen warum das mit den --extra-vars keine Auswirkung hatte.
1. es handelt sich nicht um eine Variable sondern einen Parameter der zwingend in ein ansible configurationsfile gehört.
2. das Handling von PreferredAuthentications ist ein anderes und man sollte dafür eher ein -o PubkeyAuthentication=no verwenden wie man es üblicherweise macht, wenn der Schlüsselbund mit PrivatKeys nicht zur authorized_keys vor Ort passt.
 
Und was ich auch grad noch gesehen habe (zwar schonmal gewusst aber wieder vergessen bis seit ich neue Rechner habe)… man braucht sshpass für die externe passwort eingabe… was nicht gerade den besten Ruf hat
 
Für eine Hand voll Maschinen ist es absoluter overkill, aber in größeren Umgebungen lohnt es sich sehr eine SSH-CA einzurichten und darüber passwortlos zu authentifizieren.
 
Auch wenn es vielleicht ein wenig affig ist… ich hab da mal ein ansible script geschrieben, damit man statt sshpass (wenn man kein root ist kriegt man das nicht gut nachinstalliert…) pexpect (kriegt man z.B. in einer virtualenv umgebung per pip nachinstalliert) benutzen kann um den ssh pubkey zu verteilen
YAML:
---
- hosts: localhost
  vars:
    password: "raspberry"
    machine: 192.168.178.178
  tasks:
    - name: create .ssh folder
      expect:
              command: ssh pi@{{ machine }} "mkdir .ssh"
              responses:
                      "'s password:": "{{ password }}"
    - name: give full access to .ssh user only
      expect:
              command: ssh pi@{{ machine }} "chmod 700 .ssh"
              responses:
                      "'s password:": "{{ password }}"
    - name: echo local pub_key to remote authorized_keys
      expect:
              command: ssh pi@{{ machine }} "echo {{ lookup('file', '~/.ssh/id_rsa.pub') }} >> .ssh/authorized_keys"
              responses:
                      "'s password:": "{{ password }}"
    - name: give r-w permissions to user only
      expect:
              command: ssh pi@{{ machine }} "chmod 600 .ssh/authorized_keys"
              responses:
                      "'s password:": "{{ password }}"

Sicher noch verbesserungswürdig (z.B. mit einer liste vom machinen für ne loop) oder nen block
 
Zurück
Oben