2017-06-12 9 views
0

Ich habe eine Umgebung, in der das sudo-Passwort eines Benutzers auf mehreren Servern nicht identisch ist. Dies kann als ein Sicherheitsmerkmal zu sehen :-DIst eine dynamische Suche möglich?

Ich wollte das sudo Passwort (Tresor/Sicherheit beiseite zu einem Zeitpunkt) in einer Datei speichern:

  • host1.sudopwd
  • host2.sudopwd
  • ...
  • hostn.sudopwd

in meinem ansible Textbuch, ich bin mit so etwas wie die:

--- 
- hosts: all 
tasks: 
- include: '{{ inventory_hostname }}' 
    vars: 
    ansible_become: true 
    ansible_become_user: root 
    ansible_become_pass: "{{ lookup('file','{{ inventory_hostname }}.sudopwd') }}" 

Und es funktioniert gut, wenn ich eine Datei pro Hosts habe. Nun, wie kann ich es dynamischer machen?

Lassen Sie uns sagen, dass ich ein Skript habe, das searchsudopwd genannt wird, das ein einfaches Bash-Skript ist (könnte irgendeine Sprache tatsächlich sein).

#!/usr/bin/env bash 
if [[ "$1" == "host1" ]]; then 
    echo "pwd1" 
elif [[ "$1" == "host2" ]]; then 
    echo "pwd2" 
else 
    echo "default pwd" 
fi 

Wie kann ich es mit ansible verwenden? Was muss in meinem Spielbuch geändert werden, damit es funktioniert?

Ich habe versucht, so etwas wie:

--- 
- hosts: all 
tasks: 
- include: '{{ inventory_hostname }}' 
    vars: 
    ansible_become: true 
    ansible_become_user: root 
    ansible_become_pass: "{{ item }}" 
    with_lines: searchsudopwd '{{ inventory_hostname }}' 

Aber es funktioniert nicht ...

Wenn meine Idee nicht funktioniert, ist es eine Möglichkeit, wie ein „default“ Passwort haben und nur das Passwort für bestimmte Hosts erhalten?

Vielen Dank für Ihre Hilfe und Zeit!

Antwort

1

Ich denke, Sie sind besser dran, die Kennwörter in den einzelnen host_vars Dateien, wenn nötig, und setzen Sie den Standard in group_vars/all. Setzen Sie alles in Ansible Vault. (Aber dann haben Sie ein gemeinsames Passwort für ansible Vault.)

Ich habe einen Host namens „ML01“ so dass ich das Skript geändert:

$ cat /home/jscheible/searchsudopwd 
#!/usr/bin/env bash 
if [[ "$1" == "ml01" ]]; then 
    echo "pwd1" 
elif [[ "$1" == "host2" ]]; then 
    echo "pwd2" 
else 
    echo "default pwd" 
fi 

zu nennen, dass die lokale Programm mit den Passwörtern, rufen Sie einfach, dass in einem Spiel mit delegate_to: localhost:

$ cat show_pwd 
--- 
- hosts: all 
    connection: ssh 
    gather_facts: false 
    tasks: 
    - name: Do passwd lookup 
    command: /home/jscheible/searchsudopwd {{ inventory_hostname }} 
    delegate_to: localhost 
    register: result 

    - name: Show results 
    debug: 
     var: result.stdout 
    delegate_to: localhost 

Hier sind die Ergebnisse für meinen Test:

$ ansible-playbook show_pwd 

PLAY [all] ********************************************************************* 

TASK [Do passwd lookup] ******************************************************** 
changed: [al01 -> localhost] 
changed: [ml01 -> localhost] 

TASK [Show results] ************************************************************ 
ok: [al01 -> localhost] => { 
    "result.stdout": "default pwd" 
} 
ok: [ml01 -> localhost] => { 
    "result.stdout": "pwd1" 
} 

PLAY RECAP ********************************************************************* 
+0

Danke :-) das ich nicht über die "host_vars" wusste! Ich habe es getestet und es funktioniert so, wie ich es erwartet hatte! Ich habe nicht den anderen Teil Ihrer Antwort überprüft, aber es scheint zu "zu kompliziert" im Vergleich zu der host_vars/group_vars Lösung –

+0

Sobald ich genug Ruf habe, werde ich +1 Ihre Antwort! –

1

Es gibt handliche lookup plugins.

Sie können tatsächlich ersetzen Sie einfach Ihre file Lookup mit pipe Lookup:

ansible_become_pass: "{{ lookup('pipe','/path_on_ansible_machine/searchsudopwd '+inventory_hostname) }}" 
Verwandte Themen