Die Konfigurations-Management-Software Ansible arbeitet im Gegensatz zu puppet ohne agent-Software auf dem Zielsystem. Stattdessen loggt sie sich per ssh ein und führt dann entsprechende Befehle aus.

In meinen Augen macht es Sinn, hierfür einen oder mehrere User mit passenden sudo-Rechten an zu legen, anstatt mit dem root-User zu arbeiten. Insbesondere dann, wenn nicht nur Systemverwalter, sondern auch Entwickler, Rechner mit Ansible verwalten sollen, kommt man nicht ohne zusätzliche Benutzer aus, da man ja nicht den Root-Zugang herausgeben möchte.

Dieser Artikel soll zeigen, was man für einen zusätzlichen Benutzer benötigt und stellt entsprechende Tasks in einem Ansible-Playbook als Ausgangspunkt für weitere Überlegungen vor.
Im Beispiel legen wir einen User "ansible" an.
Für eine leichte Nachvollziehbarkeit ist das Beispiel bewusst einfach gehalten.

User "ansible" per Ansible auf dem Zielsystem anlegen

Was brauchen wir alle für einen solchen User "Ansible"?

  • User mit HomeDir
  • Gruppe
  • installiertes sudo-Paket
  • Sudo-Berechtigung
    Im Beispiel erteilen wir dem User "ansible" einfach alle Rechte - das sollte man natürlich an die eigenen Bedürfnisse anpassen.
    Da Ansible in dem meisten Fällen Systemwartungsaufgaben übernimmt und mit python-Scripten arbeitet, wird eine Steuerung der Möglichkeiten per Sudo aber eher schwierig
  • SSH-Key

Folgendes einfache Listing zeigt das Playbook "add-ansible-user.yml", welches als Root auf dem Zielsystem ausgeführt wird.

---
- hosts: all
  remote_user: root

  tasks:

  - name: Gruppe "ansible" anlegen
    group:
      name: ansible
      gid: 20000
      state: present

  - name: Benutzer "ansible" anlegen
    user:
      name: ansible
      createhome: yes
      uid: 20000
      group: ansible
      state: present

  - name: SSH-Key für Benutzer "ansible" kopieren
    authorized_key:
      user: ansible
      key: "{{ lookup('file', './files/ansible_ssh_key.pub') }}"
      key_options: 'no-port-forwarding'

  - name: Installiere sudo
    package:
      name: sudo
      state: present

  - name: Sudoers-Eintrag für Benutzer "ansible" anlegen
    copy:
      dest: /etc/sudoers.d/ansible
      content: 'ansible ALL= NOPASSWD: ALL'
      owner: root
      group: root
      mode: 0500

Im Ordner "./files" legt man den öffentlichen ssh-Schlüssel des Users "ansible" ab.

Dieses Playbook funkioniert so mit:

  • SLES 12 SP2 (Suse Linux Enterprise Server)
  • Centos 7
  • Ubuntu 16.04
    Bei Ubuntu-Server ist zu beachten, dass python möglicherweise nachinstalliert werden muss
  • Debian 8
  • Debian 9

Playbooks als User "ansible" ausführen

Weitere Playbooks können dann unter dem Benutzer "ansible" ausgeführt werden.

Hier für benötigen wir Folgendes:

  • Playbooks müssen angewiesen werden:
    • User "ansible" verwenden
      geschieht durch die Angabe von "remote_user"
    • höhere Rechte anfordern
      geschieht durch Angabe von "become"
  • Ansible muss den passenden SSH-Key für den User "ansible" verwenden

"become" kann man global oben im Playbook definieren, oder aber bei dem Task in einem Playbook, der höhere Rechte benötigt.
Im Beispiel wird "become" nur für den Tast "install ftpclient" aus diesem Artikel Software mit Ansible installieren - distributions-abhängige Paketauswahl verwendet.

---
- hosts: all
  remote_user: ansible

  tasks:

       ... einige Tasks ohne Notwendigkeit hoher Rechte

  - name: install ftpclient
    package: name={{ ftpclient_package_name }} state=installed
    become: true

Die Datei "/etc/ansible/hosts" wurde zur Verwendung des SSH-Schlüssels für den User "ansible" wie folgt abgeändert.
Komplexere Beispiele findet man hier: Ansible with multiple SSH key pair - Stack Overflow

cat /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups
[all_servers:vars]
ansible_ssh_private_key_file = /home/<user>/.ssh/private_key_for_ansible_rsa

[all_servers:children]
testservers

[testservers]
server1
server2
server3

SIE MÖCHTEN DAS PLAYBOOK AUSPROBIEREN?

Clonen Sie sich einfach mein Beispiel-Repository "ansible_prepare_for_ansible" auf Github.