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"
- User "ansible" verwenden
- 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.