Inhaltsverzeichnis
Ansible mit Ansible einrichten
ist eine Open-Source-Software zur Automatisierung, Orchestrierung und Konfiguration von Serversystemen. Mit Ansible erfolgt die Verwaltung von Servern unter anderem über SSH und erfordert keinerlei zusätzliche Software auf dem zu verwaltenden System. Die Ausgabe erfolgt im JSON-Format und Module können in jeder beliebigen Programmiersprache geschrieben sein. Das System nutzt überwiegend YAML zur Konfiguration von wiederverwendbarer Beschreibungen der Systeme.
Beschreibung | Externer Link |
---|---|
Homepage | https://www.ansible.com/ |
Dokumentation | https://docs.ansible.com/ |
Best Practise | https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html |
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um der Benutzer root
zu werden, geben Sie bitte nachfolgenden Befehl ein:
$ su - Password:
Vorbereitung
Nachfolgend soll davon ausgegangen werden, dass
Informationen
ansible.cfg
Bei der Ermittlung der Konfigurationsdatei - ansible.cfg
durchsucht Ansible nachfolgende Verzeichnis in der folgenden Reihenfolge:
- Durch die Umgebungsvariable
ANSIBLE_CONFIG
spezifizierte Datei ./ansible.cfg
(ansible.cfg
im aktuellen Verzeichnis)~/.ansible.cfg
(.ansible.cfg
im $HOME Verzeichnis (Heimatverzeichnis) des angegebenen Benutzers)/etc/ansible/ansible.cfg
* Quelle:
Nachfolgende Änderungen, im Vergleich zur Originaldatei, sollen an der Konfigurationsdatei
ansible.cfg
vorgenommen werden:
[defaults]
Pfad zum Python-Interpreter, der für die Modulausführung auf entfernten Zielen oder einen automatischen Erkennungsmodus verwendet werden kann. Unterstützte Erkennungsmodi sind auto
, auto_silent
und auto_legacy
(Standard). Alle Erkennungsmodi verwenden eine Nachschlagetabelle, um die mitgelieferte System-Python-Distribution zu verwenden (bei Distributionen, von denen bekannt ist, dass sie eine solche enthalten), wobei auf eine fest geordnete Liste bekannter Python-Interpreterorte zurückgegriffen wird, wenn eine plattformspezifische Vorgabe nicht verfügbar ist.
Als Fallback-Verhalten wird eine Warnung ausgeben, dass der Interpreter explizit gesetzt werden sollte (da später installierte Interpreter sich ändern können und welcher verwendet wird).
Dieses Warnverhalten kann durch das Setzen von auto_silent abgeschaltet werden. Der Standardwert von auto_legacy
bietet das gleiche Verhalten, aber aus Gründen der Abwärtskompatibel mit älteren Ansible -Versionen, die immer auf /usr/bin/python
voreingestellt waren, wird dieser Interpreter, falls vorhanden, verwendet (und eine Warnung ausgeben, dass das Standardverhalten in einer zukünftigen Ansible -Version auf das von auto
geändert wird.
* Quellen:
VORHER
(Nur relevanter Ausschnitt)
[defaults]
NACHHER
(Nur relevanter Ausschnitt)
[defaults] # Tachtler - NEW - interpreter_python = auto_silent # some basic default values... # Tachtler #default: #inventory = /etc/ansible/hosts inventory = /home/ansible/inventories/production/hosts
Veränderung: 2
Um als nicht privilegierter Benutzer auch Aktionen durchführen zu können, welche root
-Benutzer Berechtigungen voraussetzen, kann mit nachfolgender Anpassung der Konfigurationsdatei ansible.conf
, bestimmt werden, ob für eine Aktion die root
Berechtigungen erfordert,
become=True
- diese automatisch erlagt werden sollenbecome_method=sudo
- welcher Befehl zur Rechteerlangung ausgeführt werden sollbecome_user=root
- der Benutzer, dessen Rechte erlangt werden sollenbecome_ask_pass=True
- ob nach einem Passwort gefragt werden soll
VORHER
(Nur relevanter Ausschnitt)
[privilege_escalation] #become=True #become_method=sudo #become_user=root #become_ask_pass=False
NACHHER
(Nur relevanter Ausschnitt)
[privilege_escalation] # Tachtler #default: #become=True become=True # Tachtler #default: #become_method=sudo become_method=sudo # Tachtler #default: #become_user=root become_user=root # Tachtler #default: #become_ask_pass=False become_ask_pass=True
Ansible-Verzeichnisstruktur
Nachfolgende Verzeichnisstruktur soll im $HOME-Verzeichnis (Heimatverzeichnis) des Benutzer, unter dem Ansible ausgeführt werden soll, eingerichtet werden:
# tree -la /home/ansible/
* Quelle:
Konfiguration
ACHTUNG - Die nachfolgenden Konfigurationen sind NUR auf einem Server, dem zukünftigen Ansible-Host durchzuführen.
ACHTUNG - Die nachfolgenden Konfigurationen sind NICHT auf Remote-Servern, ohne installiertem Ansible durchzuführen!
Nachfolgende Konfiguration soll ein Playbook erstellen, um nachfolgende Aufgaben auf dem Server zu erledigen, auf dem Ansible installiert ist und der zukünftig als Ansible-Host dienen soll.
/etc/ansible/ansible-config.yml
Das Playbook mit dem Ansible konfiguriert werden soll, soll in nachfolgendem Verzeichnis mit ebenfalls nachfolgendem Namen durch folgenden Befehl neu erstellt werden:
# vim /etc/ansible/ansible-config.yml
HINWEIS - Die Variablen im Bereich - vars:
- sollten den individuellen Gegebenheiten ggf. angepasst werden!
Nachfolgend der das Playbook.
--- ### Ansible mit Ansible einrichten - name: ansible-config.yml hosts: localhost vars: ansible_home: ansible ansible_user: ansible ansible_user_group: ansible ansible_user_comment: Ansible User ansible_user_gid: 65533 ansible_user_uid: 65533 ansible_user_shell: /bin/bash ansible_cfg: /etc/ansible/ansible.cfg vars_prompt: - name: ansible_user_password prompt: "Enter the password for the user?" - name: ansible_user_password_confirm prompt: "Retype the users password again?" - name: ansible_user_ssh_key_passphrase prompt: "Enter the passphrase for the private ssh key?" - name: ansible_user_ssh_key_passphrase_confirm prompt: "Retype the private ssh keys passphrase again?" tasks: - name: Fail the play if ansible_user_password and *_confirm do NOT match. fail: msg: "The user password and the repetition of the user password do NOT match!" when: - ansible_user_password != ansible_user_password_confirm - name: Fail the play if ansible_user_ssh_key_passphrase and *_confirm do NOT match. fail: msg: "The ssh key passphrase and the repetition of the ssh key passphrase do NOT match!" when: - ansible_user_ssh_key_passphrase != ansible_user_ssh_key_passphrase_confirm - name: End the play if password or passphrase do NOT match. meta: end_play when: (ansible_user_password != ansible_user_password_confirm) or (ansible_user_ssh_key_passphrase != ansible_user_ssh_key_passphrase_confirm) - name: Ensure group exists. group: gid: "{{ ansible_user_gid }}" name: "{{ ansible_user_group }}" state: present - name: Ensure user exists. user: append: yes comment: "{{ ansible_user_comment }}" force: yes generate_ssh_key: yes group: "{{ ansible_user_group }}" groups: wheel name: "{{ ansible_user }}" password: "{{ ansible_user_password | password_hash('sha512', 65534 | random ) }}" shell: "{{ ansible_user_shell }}" ssh_key_comment: "{{ ansible_user_comment }}" ssh_key_file: ".ssh/id_ed25519_{{ ansible_user}}" ssh_key_passphrase: "{{ ansible_user_ssh_key_passphrase }}" ssh_key_type: ed25519 state: present uid: "{{ ansible_user_uid }}" - name: Ensure file exists. stat: path: '{{ ansible_cfg }}' register: check_ansible_cfg - fail: msg: "File {{ ansible_cfg }} NOT found!" when: check_ansible_cfg.stat.exists == false - name: Copy configuration file to home directory of the ansible user. copy: dest: "/home/{{ ansible_user }}/.ansible.cfg" force: yes group: "{{ ansible_user_group }}" owner: "{{ ansible_user }}" src: "{{ ansible_cfg }}" when: check_ansible_cfg.stat.exists == true - name: Change configuration of "/home/{{ ansible_user }}/.ansible.cfg". lineinfile: line: "{{ item.line }}" path: "/home/{{ ansible_user }}/.ansible.cfg" regexp: "{{ item.regexp }}" state: present with_items: - { regexp: "^\\[defaults\\]", line: "[defaults]\n# Tachtler - NEW -\ninterpreter_python = auto_silent" } - { regexp: "^#inventory = /etc/ansible/hosts", line: "# Tachtler\n#default: #inventory = /etc/ansible/hosts\ninventory = /home/{{ ansible_user }}/{{ ansible_home }}/inventories/production/hosts" } - { regexp: "^\\#become=True", line: "# Tachtler\n#default: #become=True\nbecome=True" } - { regexp: "^\\#become_method=sudo" , line: "# Tachtler\n#default: #become_method=sudo\nbecome_method=sudo" } - { regexp: "^\\#become_user=root" , line: "# Tachtler\n#default: #become_user=root\nbecome_user=root" } - { regexp: "^\\#become_ask_pass=False" , line: "# Tachtler\n#default: #become_ask_pass=False\nbecome_ask_pass=True" } - name: Create file structure for "/home/{{ ansible_user }}/{{ ansible_home}}". file: group: "{{ ansible_user_group }}" owner: "{{ ansible_user }}" path: "/home/{{ ansible_user }}/{{ ansible_home }}/{{ item.dir }}" state: directory with_items: - { dir: "inventories/" } - { dir: "inventories/production/" } - { dir: "inventories/production/group_vars/" } - { dir: "inventories/production/host_vars/" } - { dir: "library/" } - { dir: "module_utils/" } - { dir: "filter_plugins/" } - { dir: "roles/" } - { dir: "roles/DUMMY/" } - { dir: "roles/DUMMY/tasks/" } - { dir: "roles/DUMMY/handlers/" } - { dir: "roles/DUMMY/templates/" } - { dir: "roles/DUMMY/files/" } - { dir: "roles/DUMMY/vars/" } - { dir: "roles/DUMMY/defaults/" } - { dir: "roles/DUMMY/meta/" } - { dir: "roles/DUMMY/library/" } - { dir: "roles/DUMMY/module_utils/" } - { dir: "roles/DUMMY/lookup_plugins/" } - { dir: "roles/sudoers/" } - { dir: "roles/sudoers/tasks/" } - { dir: "roles/sudoers/handlers/" } - { dir: "roles/sudoers/templates/" } - { dir: "roles/sudoers/files/" } - { dir: "roles/sudoers/vars/" } - { dir: "roles/sudoers/defaults/" } - { dir: "roles/sudoers/meta/" } - { dir: "roles/sudoers/library/" } - { dir: "roles/sudoers/module_utils/" } - { dir: "roles/sudoers/lookup_plugins/" } - name: Create file structure for "/home/{{ ansible_user }}/{{ ansible_home }}". file: group: "{{ ansible_user_group }}" owner: "{{ ansible_user }}" path: "/home/{{ ansible_user }}/{{ ansible_home }}/{{ item.file }}" state: touch with_items: - { file: "dummy.yml" } - { file: "inventories/production/hosts" } - { file: "inventories/production/group_vars/dummy.yml" } - { file: "inventories/production/host_vars/dummy.yml" } - { file: "roles/DUMMY/tasks/main.yml" } - { file: "roles/DUMMY/handlers/main.yml" } - { file: "roles/DUMMY/vars/main.yml" } - { file: "roles/DUMMY/defaults/main.yml" } - { file: "roles/DUMMY/meta/main.yml" } - { file: "sudoers.yml" } - { file: "roles/sudoers/tasks/main.yml" } - { file: "roles/sudoers/vars/main.yml" } - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/dummy.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/dummy.yml" block: | --- ### dummy Playbook - hosts: dummy vars_files: - {{ ansible_home }}/inventories/production/group_vars/dummy.yml - {{ ansible_home }}/inventories/production/host_vars/dummy.yml roles: - { role: dummy, tags: ['dummy'] } - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/inventories/production/hosts". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/inventories/production/hosts" block: | [ansible] {{ ansible_default_ipv4.address}} - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/sudoers.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/sudoers.yml" block: | --- ### Distribute sudoers user - hosts: all roles: - { role: sudoers, tags: ['sudoers'] } - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/vars/main.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/vars/main.yml" block: | --- ### Distribute sudoers user vars sudoers: - {{ ansible_user }} - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/tasks/main.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/tasks/main.yml" block: | --- ### Distribute sudoers user tasks - name: Make sure we have a 'wheel' group group: name: wheel state: present - name: Allow 'wheel' group to have password accessed sudo copy: content: '%wheel ALL=(ALL) ALL ' dest: /etc/sudoers.d/020_passwd_all_for_wheel group: root mode: "0440" owner: root validate: visudo -cf %s - name: Add sudoers users to 'wheel' group user: append: yes name: {{ '"{{ item }}"' }} groups: wheel with_items: {{ '"{{ sudoers }}"' }} - name: Set exclusive authorized key for sudoers taken from file authorized_key: {% raw %}key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_ed25519_{% endraw %}{{ ansible_user }}{% raw %}.pub') }}"{% endraw %} state: present user: {{ '"{{ item }}"' }} with_items: {{ '"{{ sudoers }}"' }}
Playbook Ausführung
/etc/ansible/ansible-config.yml
Nachfolgender Befehl führt eine detaillierte Überprüfung des angegeben Playbook durch:
# ansible-playbook --syntax-check /etc/ansible/ansible-config.yml [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' playbook: /etc/ansible/ansible-config.yml
Nachfolgender Befehl für das Playbook, welches unter /etc/ansible/ansible-config.yml
gespeichert sein sollte aus:
# ansible-playbook /etc/ansible/ansible-config.yml [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' Enter the password for the user?: Retype the users password again?: Enter the passphrase for the private ssh key?: Retype the private ssh keys passphrase again?: PLAY [ansible-config.yml] ****************************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Fail the play if ansible_user_password and *_confirm do NOT match.] ****** skipping: [localhost] TASK [Fail the play if ansible_user_ssh_key_passphrase and *_confirm do NOT match.] *** skipping: [localhost] TASK [Ensure group exists.] **************************************************** changed: [localhost] TASK [Ensure user exists.] ***************************************************** changed: [localhost] TASK [Ensure file exists.] ***************************************************** ok: [localhost] TASK [fail] ******************************************************************** skipping: [localhost] TASK [Copy configuration file to home directory of the ansible user.] ********** changed: [localhost] TASK [Change configuration of "/home/ansible/.ansible.cfg".] ******************* changed: [localhost] => (item={'regexp': '^\\[defaults\\]', 'line': '[defaults]\n# Tachtler - NEW -\ninterpreter_python = auto_silent'}) changed: [localhost] => (item={'regexp': '^#inventory = /etc/ansible/hosts', 'line': '# Tachtler\n#default: #inventory = /etc/ansible/hosts\ninventory = /home/ansible/ansible/inventories/production/hosts'}) changed: [localhost] => (item={'regexp': '^\\#become=True', 'line': '# Tachtler\n#default: #become=True\nbecome=True'}) changed: [localhost] => (item={'regexp': '^\\#become_method=sudo', 'line': '# Tachtler\n#default: #become_method=sudo\nbecome_method=sudo'}) changed: [localhost] => (item={'regexp': '^\\#become_user=root', 'line': '# Tachtler\n#default: #become_user=root\nbecome_user=root'}) changed: [localhost] => (item={'regexp': '^\\#become_ask_pass=False', 'line': '# Tachtler\n#default: #become_ask_pass=False\nbecome_ask_pass=True'}) TASK [Create file structure for "/home/ansible/ansible".] ********************** changed: [localhost] => (item={'dir': 'inventories/'}) changed: [localhost] => (item={'dir': 'inventories/production/'}) changed: [localhost] => (item={'dir': 'inventories/production/group_vars/'}) changed: [localhost] => (item={'dir': 'inventories/production/host_vars/'}) changed: [localhost] => (item={'dir': 'library/'}) changed: [localhost] => (item={'dir': 'module_utils/'}) changed: [localhost] => (item={'dir': 'filter_plugins/'}) changed: [localhost] => (item={'dir': 'roles/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/tasks/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/handlers/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/templates/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/files/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/vars/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/defaults/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/meta/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/library/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/module_utils/'}) changed: [localhost] => (item={'dir': 'roles/DUMMY/lookup_plugins/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/tasks/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/handlers/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/templates/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/files/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/vars/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/defaults/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/meta/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/library/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/module_utils/'}) changed: [localhost] => (item={'dir': 'roles/sudoers/lookup_plugins/'}) TASK [Create file structure for "/home/ansible/ansible".] ********************** changed: [localhost] => (item={'file': 'dummy.yml'}) changed: [localhost] => (item={'file': 'inventories/production/hosts'}) changed: [localhost] => (item={'file': 'inventories/production/group_vars/dummy.yml'}) changed: [localhost] => (item={'file': 'inventories/production/host_vars/dummy.yml'}) changed: [localhost] => (item={'file': 'roles/DUMMY/tasks/main.yml'}) changed: [localhost] => (item={'file': 'roles/DUMMY/handlers/main.yml'}) changed: [localhost] => (item={'file': 'roles/DUMMY/vars/main.yml'}) changed: [localhost] => (item={'file': 'roles/DUMMY/defaults/main.yml'}) changed: [localhost] => (item={'file': 'roles/DUMMY/meta/main.yml'}) changed: [localhost] => (item={'file': 'sudoers.yml'}) changed: [localhost] => (item={'file': 'roles/sudoers/tasks/main.yml'}) changed: [localhost] => (item={'file': 'roles/sudoers/vars/main.yml'}) TASK [Insert content to "/home/ansible/ansible/dummy.yml".] ******************** changed: [localhost] TASK [Insert content to "/home/ansible/ansible/inventories/production/hosts".] *** changed: [localhost] TASK [Insert content to "/home/ansible/ansible/sudoers.yml".] ****************** changed: [localhost] TASK [Insert content to "/home/ansible/ansible/roles/sudoers/vars/main.yml".] *** changed: [localhost] TASK [Insert content to "/home/ansible/ansible/roles/sudoers/tasks/main.yml".] *** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=13 changed=11 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
/home/ansible/ansible/sudoers.yml
Anschließend kann das mit erstellte Playbook, hier /home/ansible/ansible/sudoers.yml
mit nachfolgendem Befehl aufgrufen werden, um den Benutzer, hier ansible
auf den lokalen Host, angesprochen mit der definierten ipv4-Adresse, als Benutzer für die Nutzung mit Ansible zu implementieren. Dies kann durch Ausführung der nachfolgenden Befehle durchgeführt werden:
Ermitteln der aktuellen ipv4-Adresse, mit nachfolgendem Befehl:
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:00:de:ad brd ff:ff:ff:ff:ff:ff inet 192.168.1.250/24 brd 192.168.122.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe00:dead/64 scope link valid_lft forever preferred_lft forever
* Hier wäre dies die z.b ipv4-Adresse: 192.168.1.250
Erste Verbindung mittels der ipv4-Adresse lokal aufbauen, um den HOST-Key (HOST-Schlüssel) überpüfen zu können und dies dauerhaft zu speichern, durch nachfolgenden Befehl:
# ssh root@192.168.1.250 The authenticity of host '192.168.1.250 (192.168.1.250)' can't be established. ECDSA key fingerprint is SHA256:KKTrdrzsv9vpvtKhq7HTIwW5S5sSe92P0r4+4gn/Zjo. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.1.250' (ECDSA) to the list of known hosts. root@192.168.1.250's password: Last login: Sun Jan 12 13:07:20 2020 from 192.168.1.1
# ansible-playbook -i /home/ansible/ansible/inventories/production/hosts /home/ansible/ansible/sudoers.yml --ask-pass SSH password: PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.1.250] TASK [sudoers : Make sure we have a 'wheel' group] ***************************** ok: [192.168.1.250] TASK [sudoers : Allow 'wheel' group to have password accessed sudo] ************ changed: [192.168.1.250] TASK [sudoers : Add sudoers users to 'wheel' group] **************************** ok: [192.168.1.250] => (item=ansible) TASK [sudoers : Set exclusive authorized key for sudoers taken from file] ****** changed: [192.168.1.250] => (item=ansible) PLAY RECAP ********************************************************************* 192.168.1.250 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Damit ist nun der Benutzer, hier ansible
in der Lage alle Ansible-spezifischen Aktionen durchzuführen.
Wechsel vom Benutzer root
zum Benutzer, hier ansible
, mit nachfolgendem Befehl:
# su - ansible
Auflisten des Verzeichnisses /root
durch Ausführung des nachfolgenden Ansible Befehls:
$ /usr/bin/ansible ansible --private-key ~/.ssh/id_ed25519_ansible -a 'ls -la /root' BECOME password: The authenticity of host '192.168.1.250 (192.168.1.250)' can't be established. ECDSA key fingerprint is SHA256:KKTrdrzsv9vpvtKhq7HTIwW5S5sSe92P0r4+4gn/Zjo. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Enter passphrase for key '/home/ansible/.ssh/id_ed25519_ansible': 192.168.122.250 | CHANGED | rc=0 >> total 56 drwxr-x--- 7 root root 4096 Jan 12 13:18 . drwxr-xr-x 17 root root 4096 Jan 12 12:48 .. drwxr-xr-x 4 root root 4096 Jan 12 13:20 .ansible -rw------- 1 root root 1352 Jan 12 13:06 .bash_history -rw-r--r-- 1 root root 58 Jan 12 13:04 .bash_profile -rw-r--r-- 1 root root 340 Jan 12 13:04 .bashrc drwx------ 3 root root 4096 Jan 12 12:52 .cache drwx------ 3 root root 4096 Jan 12 13:05 .config drwx------ 3 root root 4096 Jan 12 12:48 .gnupg drwx------ 2 root root 4096 Jan 12 13:18 .ssh -rw------- 1 root root 8333 Jan 12 13:08 .viminfo -rw-r--r-- 1 root root 39 Jan 12 13:04 .vimrc
HINWEIS - Das zweite ansible
(für die zu nutzende HOST-Gruppe) kommt aus der Konfigurationsdatei
/home/ansible/ansible/inventories/production/hosts
welche durch die Konfigurationsdatei
~/.ansible.cfg
eingebunden wurde!
Playbook Erklärungen
YAML-Dokumentenstart
In dem Playbook - /etc/ansible/ansible-config.yml
soll zu Beginn der Playbooks
- die Kennzeichnung des Starts eines YAML-Dokuments
hinzugefügt werden.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
--- ### Ansible mit Ansible einrichten
name:
Die erste Definition innerhalb soll eine name
sein, welcher den Namen das Playbooks als zugewiesenen Parameter enthält.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: ansible-config.yml
hosts:
Die zweite Definition beinhaltet den Host oder die Hosts, auf dem das Playbook angewendet werden soll. Im nachfolgendem Fall wird nur ein Host angegeben und das ist: localhost
.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
hosts: localhost
vars:
Nachfolgender Abschnitt beinhaltet zur Laufzeit dieses Playbooks benötigte Variablen. Diese Variablen ermöglichen es, das Playbook einfach durch Austausch der Variableninhalte am Anfang des Playbooks variablen, an persönliche Bedürfnisse anpassbar zu halten.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
vars: ansible_home: ansible ansible_user: ansible ansible_user_group: ansible ansible_user_comment: Ansible User ansible_user_gid: 65533 ansible_user_uid: 65533 ansible_user_shell: /bin/bash ansible_cfg: /etc/ansible/ansible.cfg
Erklärung:
ansible_home: ansible
Das soll das Verzeichnis innerhalb des $HOME-Verzeichnisses (Heimatverzeichnis) des neu anzulegenden Ansible-Benutzer sein, in dem die Verzeichnisstruktur von Ansible abgelegt werden soll.
ansible_user: ansible
Das soll der Benutzername sein, unter dem später ein Zugriff vom Ansible-Host auf die einzelnen Ansible-Remote-Hosts via SSH zugegriffen werden soll.
ansible_user_group: ansible
Das soll der Name der Gruppen für den neu anzulegenden Ansible-Benutzer sein.
ansible_user_comment: Ansible User
Das soll ein Kommentar für den neu anzulegenden Ansible-Benutzer sein.
ansible_user_gid: 65533
Das soll die Gruppen-ID für den neu anzulegenden Ansible-Benutzer sein.
ansible_user_uid: 65533
Das soll die Benutzer-ID für den neu anzulegenden Ansible-Benutzer sein.
ansible_user_shell: /bin/bash
Das soll die zu verwendende shell
für den neu anzulegenden Ansible-Benutzer sein.
ansbile_cfg: /etc/ansible/ansible.cfg
Das soll den Speicherort für die ursprüngliche mit der Ansible-Installation erstelle Konfigurationsdatei sein.
vars_prompt:
Nachfolgender Abschnitt beinhaltet zur Laufzeit dieses Playbooks benötigte Variablen, welche durch erscheinen eines „prompt“ (Eingabeabfrage) ebenfalls während der Laufzeit interaktiv zur Eingabe von Daten durch den Benutzer über die tastatur auffordern.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
vars_prompt: - name: ansible_user_password prompt: "Enter the password for the user?" - name: ansible_user_password_confirm prompt: "Retype the users password again?" - name: ansible_user_ssh_key_passphrase prompt: "Enter the passphrase for the private ssh key?" - name: ansible_user_ssh_key_passphrase_confirm prompt: "Retype the private ssh keys passphrase again?"
Erklärung:
- name: ansible_user_password
Name der abzufragenden interaktiven Variable.
prompt: "Enter password for the user?"
„prompt“ (Eingabeabfrage), welche mit dem angegebenen Text erscheinen soll.
- name: ansible_user_password_confirm
Name der abzufragenden interaktiven Variable.
prompt: "Retype the users password again?"
„prompt“ (Eingabeabfrage), welche mit dem angegebenen Text erscheinen soll.
- name: ansible_user_ssh_key_passphrase
Name der abzufragenden interaktiven Variable.
prompt: "Enter the passphrase for the private ssh key?""
„prompt“ (Eingabeabfrage), welche mit dem angegebenen Text erscheinen soll.
- name: ansible_user_ssh_key_passphrase_confirm
Name der abzufragenden interaktiven Variable.
prompt: "Retype the private ssh keys passphrase again?""
„prompt“ (Eingabeabfrage), welche mit dem angegebenen Text erscheinen soll.
HINWEIS - Da es sich um Passwörter handelt, sollen die Eingaben nicht sichtbar sein (Standard)
tasks:
Der nächste Abschnitt beinhaltet den Tasks Bereich, welche die einzelnen auszuführenden Schritte des Playbook darstellen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
tasks:
fail: password
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
ermöglicht es, dass eine Ausgabe an den Benutzer erfolgt, wenn die Eingaben für die Passwörter in den Variablen
ansible_user_password
undansible_user_password_confirm
nicht übereinstimmen.
- name: Fail the play if ansible_user_password and *_confirm do NOT match. fail: msg: "The user password and the repetition of the user password do NOT match!" when: - ansible_user_password != ansible_user_password_confirm
Erklärung:
msg: "The user password and the repetition of the user password do NOT match!"
Definition der auszugebenden Meldung.
when: - ansible_user_password != ansible_user_password_confirm
Bedingung für die Ausgabe der Meldung. In diesem Fall ist das die Ungleichheit des Inhalts der beiden Variablen: ansible_user_password
und ansible_user_password_confirm
.
fail: passphrase
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
ermöglicht es, dass eine Ausgabe an den Benutzer erfolgt, wenn die Eingaben für die Passwörter in den Variablen
ansible_user_ssh_key_passphrase
undansible_user_ssh_key_passphrase_confirm
nicht übereinstimmen.
- name: Fail the play if ansible_user_ssh_key_passphrase and *_confirm do NOT match. fail: msg: "The ssh key passphrase and the repetition of the ssh key passphrase do NOT match!" when: - ansible_user_ssh_key_passphrase != ansible_user_ssh_key_passphrase_confirm
Erklärung:
msg: "The ssh key passphrase and the repetition of the ssh key passphrase do NOT match!"
Definition der auszugebenden Meldung.
when: - ansible_user_ssh_key_passphrase != ansible_user_ssh_key_passphrase_confirm
Bedingung für die Ausgabe der Meldung. In diesem Fall ist das die Ungleichheit des Inhalts der beiden Variablen: ansible_user_ssh_key_passphrase
und ansible_user_ssh_key_passphrase
.
meta:
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
stellt sicher, dass die Eingaben für die Passwörter in den Variablen
ansible_user_password
undansible_user_password_confirm
übereinstimmen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: End the play if password or passphrase do NOT match. meta: end_play when: (ansible_user_password != ansible_user_password_confirm) or (ansible_user_ssh_key_passphrase != ansible_user_ssh_key_passphrase_confirm)
Erklärung:
meta: end_play
Bewirkt, dass das Playbook beendet wird.
when: (ansible_user_password != ansible_user_password_confirm) or (ansible_user_ssh_key_passphrase != ansible_user_ssh_key_passphrase_confirm)
Bedinung für die Beendigung des Playbooks. In diesem Fall ist das die Ungleichheit des Inhalts der beiden Variablen: ansible_user_password
und ansible_user_password_confirm
oder der beiden Variablen ansible_user_ssh_key_passphrase
und ansible_user_ssh_key_passphrase_confirm
.
group:
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
stellt sicher, dass es eine Gruppe, unter Verwendung eines Teils aus den in vars:
definierten Variablen, gibt bzw. diese erstellt wird, falls es die Gruppe noch nicht geben sollte.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Ensure group exists. group: gid: "{{ ansible_user_gid }}" name: "{{ ansible_user_group }}" state: present
Erklärung:
gid: "{{ ansible_user_gid }}"
Setzt die Gruppen-ID für den neu anzulegenden Ansible-Benutzer.
name: "{{ ansible_user_group }}"
Setzt den Gruppen-Namen für den neu anzulegenden Ansible-Benutzer.
state: present
Bestimmt, das die Gruppe angelegt wird, falls die Gruppe nicht vorhanden sein sollte.
user:
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
stellt sicher, dass es einen Benutzer, unter Verwendung aus den in vars:
definierten Variablen gibt bzw. dieser erstellt wird, falls es den Benutzer noch nicht geben sollte.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Ensure user exists. user: append: yes comment: "{{ ansible_user_comment }}" force: yes generate_ssh_key: yes group: "{{ ansible_user_group }}" groups: wheel name: "{{ ansible_user }}" password: "{{ ansible_user_password | password_hash('sha512', 65534 | random ) }}" shell: "{{ ansible_user_shell }}" ssh_key_comment: "{{ ansible_user_comment }}" ssh_key_file: ".ssh/id_ed25519_{{ ansible_user}}" ssh_key_passphrase: "{{ ansible_user_ssh_key_passphrase }}" ssh_key_type: ed25519 state: present uid: "{{ ansible_user_uid }}"
Erklärung:
append: yes
Gibt an, dass der neu anzulegenden Ansible-Benutzer in weiteren Gruppen hinzugefügt werden soll, welche unter - groups
- aufgelistet werden.
comment: "{{ ansible_user_comment }}"
Setzt die Benutzer-Kommentar für den neu anzulegenden Ansible-Benutzer.
force: yes
Bewirkt das ein OpenSSH-Schlüsselpaar neu generiert werden soll.
HINWEIS - Auch bereits ggf. existierende OpenSSH-Schlüsselpaare zu überschreiben!
generate_ssh_key: yes
Bewirkt das ein OpenSSH-Schlüsselpaar neu generiert werden soll.
group: "{{ ansible_user_group }}"
Setzt den Gruppen-Namen für den neu anzulegenden Ansible-Benutzer.
groups: wheel
Gibt an, dass der neu anzulegenden Ansible-Benutzer in den hier angegebenen Gruppen, zusätzlich zu dessen eigener Gruppe, hinzugefügt werden soll.
HINWEIS - Diese Angabe wird nur berücksichtigt, wenn - append: yes
- ebenfalls gesetzte wurde!
name: "{{ ansible_user }}"
Setzt den Benutzer-Namen für den neu anzulegenden Ansible-Benutzer.
password: "{{ ansible_user_password | password_hash('sha512', 65534 | random ) }}"
Erzeugt ein sha512
verschlüsseltes Passwort, mit einem zufällig ermittelten „salt“ (Salz)-Wert, aus der interaktiven Eingabe des Benutzer über die Tastatur, zur Laufzeit des Playbooks.
shell: "{{ ansible_user_shell }}"
Setzt die shell
für den neu anzulegenden Ansible-Benutzer.
ssh_key_comment: "{{ ansible_user_comment }}"
Setzt einen Kommentar im neu erzeugten OpenSSH-Schlüsselpaar.
ssh_key_file: ".ssh/id_ed25519_{{ ansible_user}}"
Das Verzeichnis und der Name im Dateisystem - relativ zum $HOME-Verzeichnis des Benutzers - in dem das neu erzeugten OpenSSH-Schlüsselpaar abgelegt werden soll.
ssh_key_passphrase: "{{ ansible_user_ssh_key_passphrase }}"
Passphrase für den neu erzeugten privaten OpenSSH-Schlüssel.
ssh_key_type: ed25519
Der Algorithmus, der zur Erzeugung des neuen privaten OpenSSH-Schlüssels verwendet wird.
state: present
Bestimmt, das der Benutzer angelegt wird, falls der Benutzer nicht vorhanden sein sollte.
uid: "{{ ansible_user_uid }}"
Setzt die Benutzer-ID für den neu anzulegenden Ansible-Benutzer.
stat: /etc/ansible/ansible.cfg
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
ermittelt, ob die zu kopierende Datei vorhanden ist.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Ensure file exists. stat: path: '{{ ansible_cfg }}' register: check_ansible_cfg - fail: msg: "File {{ ansible_cfg }} NOT found!" when: check_ansible_cfg.stat.exists == false
Erklärung:
path: '{{ ansible_cfg }}'
Gibt den Pfad für die Prüfungen an.
register: check_ansible_cfg'
Reserviert eine Variable, in dem das Ergebnis der Prüfungen enthalten ist.
HINWEIS - Für Erklärungen zu - fail:
- siehe auch die internen Links
copy: /etc/ansible/ansible.cfg
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
kopiert die angegeben Datei, hier innerhalb des Hosts in das ebenfalls angegeben Verzeichnis.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Copy configuration file to home directory of the ansible user. copy: dest: "/home/{{ ansible_user }}/.ansible.cfg" force: yes group: "{{ ansible_user_group }}" owner: "{{ ansible_user }}" src: "{{ ansible_cfg }}" when: check_ansible_cfg.stat.exists == true
Erklärung:
dest: "/home/{{ ansible_user }}/.ansible.cfg"
Ziel der Kopieroperation.
force: yes
Die Datei auch dann kopiert, wenn das Ziel existiert.
group: "{{ ansible_user_group }}"
Setzt die Besitzer-Gruppe im Dateisystem für die zu kopierende Datei.
owner: "{{ ansible_user }}"
Setzt der Besitzer im Dateisystem für die zu kopierende Datei.
src: "{{ ansible_cfg }}"
Quelle der Kopieroperation.
when: check_ansible_cfg.stat.exists == true
Der Kopiervorgang soll nur angestoßen werden, wenn die Datei auch existiert. Das Ergbenis dieser Überprüfung ist in der Variable - check_ansible_cfg.
- gespeichert und wurde im Bereich vorher
ermittelt.
lineinfile: ~/.ansible.cfg
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
fügt nach einem Suchmuster innerhalb der angegebenen Datei, den entsprechenden angegebenen Inhalt hinzu oder verändert diesen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Change configuration of "/home/{{ ansible_user }}/.ansible.cfg". lineinfile: line: "{{ item.line }}" path: "/home/{{ ansible_user }}/.ansible.cfg" regexp: "{{ item.regexp }}" state: present with_items: - { regexp: "^\\[defaults\\]", line: "[defaults]\n# Tachtler - NEW -\ninterpreter_python = auto_silent" } - { regexp: "^#inventory = /etc/ansible/hosts", line: "# Tachtler\n#default: #inventory = /etc/ansible/hosts\ninventory = /home/{{ ansible_user }}/{{ ansible_home }}/inventories/production/hosts" } - { regexp: "^\\#become=True", line: "# Tachtler\n#default: #become=True\nbecome=True" } - { regexp: "^\\#become_method=sudo" , line: "# Tachtler\n#default: #become_method=sudo\nbecome_method=sudo" } - { regexp: "^\\#become_user=root" , line: "# Tachtler\n#default: #become_user=root\nbecome_user=root" } - { regexp: "^\\#become_ask_pass=False" , line: "# Tachtler\n#default: #become_ask_pass=False\nbecome_ask_pass=True" }
Erklärung:
line: "{{ item.line }}"
Stellt den neuen Inhalt der zu ersetzende Zeile dar.
path: "/home/{{ ansible_user }}/.ansible.cfg"
Zieldatei, welche verändert werden soll.
regexp: "{{ item.regexp }}"
„Regular Expression“, nach der in der angegeben Datei gesucht wird.
with_items:
Liste von Einträgen die nachfolgenden Aufbau haben:
- { regexp: "..." , line: "..." }
Aufbau der Einträge.
HINWEIS - Eine Auflistung der durchgeführten Änderungen ist unter nachfolgendem internen Link einzusehene:
file: ~/ - directories
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
ermöglicht es Dateien oder Verzeichnisse zu erstellen, bearbeiten und zu löschen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Create file structure for "/home/{{ ansible_user }}/{{ ansible_home}}". file: group: "{{ ansible_user_group }}" owner: "{{ ansible_user }}" path: "/home/{{ ansible_user }}/{{ ansible_home }}/{{ item.dir }}" state: directory with_items: - { dir: "inventories/" } - { dir: "inventories/production/" } - { dir: "inventories/production/group_vars/" } - { dir: "inventories/production/host_vars/" } - { dir: "library/" } - { dir: "module_utils/" } - { dir: "filter_plugins/" } - { dir: "roles/" } - { dir: "roles/DUMMY/" } - { dir: "roles/DUMMY/tasks/" } - { dir: "roles/DUMMY/handlers/" } - { dir: "roles/DUMMY/templates/" } - { dir: "roles/DUMMY/files/" } - { dir: "roles/DUMMY/vars/" } - { dir: "roles/DUMMY/defaults/" } - { dir: "roles/DUMMY/meta/" } - { dir: "roles/DUMMY/library/" } - { dir: "roles/DUMMY/module_utils/" } - { dir: "roles/DUMMY/lookup_plugins/" } - { dir: "roles/sudoers/" } - { dir: "roles/sudoers/tasks/" } - { dir: "roles/sudoers/handlers/" } - { dir: "roles/sudoers/templates/" } - { dir: "roles/sudoers/files/" } - { dir: "roles/sudoers/vars/" } - { dir: "roles/sudoers/defaults/" } - { dir: "roles/sudoers/meta/" } - { dir: "roles/sudoers/library/" } - { dir: "roles/sudoers/module_utils/" } - { dir: "roles/sudoers/lookup_plugins/" }
Erklärung:
group: "{{ ansible_user_group }}"
Setzt die Besitzer-Gruppe im Dateisystem für die zu erzeugenden Verzeichnisse.
owner: "{{ ansible_user }}"
Setzt der Besitzer im Dateisystem für die zu erzeugenden Verzeichnisse.
path: "/home/{{ ansible_user }}/{{ ansible_home }}/{{ item.dir }}"
Verzeichnis, welche angelegt werden soll.
state: directory
Bestimmt, das ein Verzeichnis angelegt wird.
with_items:
Liste von Einträgen die nachfolgenden Aufbau haben:
- { dir: "..." }
Aufbau der Einträge.
HINWEIS - Eine Auflistung der durchgeführten Änderungen ist unter nachfolgendem internen Link einzusehen:
file: ~/ - files
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
ermöglicht es Dateien oder Verzeichnisse zu erstellen, bearbeiten und zu löschen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Create file structure for "/home/{{ ansible_user }}/{{ ansible_home }}". file: group: "{{ ansible_user_group }}" owner: "{{ ansible_user }}" path: "/home/{{ ansible_user }}/{{ ansible_home }}/{{ item.file }}" state: touch with_items: - { file: "dummy.yml" } - { file: "inventories/production/hosts" } - { file: "inventories/production/group_vars/dummy.yml" } - { file: "inventories/production/host_vars/dummy.yml" } - { file: "roles/DUMMY/tasks/main.yml" } - { file: "roles/DUMMY/handlers/main.yml" } - { file: "roles/DUMMY/vars/main.yml" } - { file: "roles/DUMMY/defaults/main.yml" } - { file: "roles/DUMMY/meta/main.yml" } - { file: "sudoers.yml" } - { file: "roles/sudoers/tasks/main.yml" } - { file: "roles/sudoers/vars/main.yml" }
Erklärung:
group: "{{ ansible_user_group }}"
Setzt die Besitzer-Gruppe im Dateisystem für die zu erzeugende Dateien.
owner: "{{ ansible_user }}"
Setzt der Besitzer im Dateisystem für die zu erzeugende Dateien.
path: "/home/{{ ansible_user }}/{{ ansible_home }}/{{ item.file }}"
Dateien, welche angelegt werden soll.
state: touch
Bestimmt, das eine Datei angelegt wird.
with_items:
Liste von Einträgen die nachfolgenden Aufbau haben:
- { file: "..." }
Aufbau der Einträge.
HINWEIS - Eine Auflistung der durchgeführten Änderungen ist unter nachfolgendem internen Link einzusehen:
blockinfile: dummy.yml
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
fügt den entsprechenden angegebenen Inhalt hinzu oder verändert diesen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/dummy.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/dummy.yml" block: | --- ### dummy Playbook - hosts: dummy vars_files: - {{ ansible_home }}/inventories/production/group_vars/dummy.yml - {{ ansible_home }}/inventories/production/host_vars/dummy.yml roles: - { role: dummy, tags: ['dummy'] }
Erklärung:
path: "/home/{{ ansible_user }}/dummy.yml"
Datei, welche verändert werden soll.
block: | ..."
Block mit Inhalten, welche der Datei hinzugefügt werden sollen.
blockinfile: sudoers.yml
Nachfolgender Aufruf des Moduls
innerhalb des Bereichs tasks:
fügt den entsprechenden angegebenen Inhalt hinzu oder verändert diesen.
Nachfolgende Inhalte sollen dem Playbook - /etc/ansible/ansible-config.yml
hinzugefügt werden:
- name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/inventories/production/hosts". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/inventories/production/hosts" block: | [ansible] {{ ansible_default_ipv4.address}} - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/sudoers.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/sudoers.yml" block: | --- ### Distribute sudoers user - hosts: all roles: - { role: sudoers, tags: ['sudoers'] } - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/vars/main.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/vars/main.yml" block: | --- ### Distribute sudoers user vars sudoers: - {{ ansible_user }} - name: Insert content to "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/tasks/main.yml". blockinfile: path: "/home/{{ ansible_user }}/{{ ansible_home }}/roles/sudoers/tasks/main.yml" block: | --- ### Distribute sudoers user tasks - name: Make sure we have a 'wheel' group group: name: wheel state: present - name: Allow 'wheel' group to have password accessed sudo copy: content: '%wheel ALL=(ALL) ALL ' dest: /etc/sudoers.d/020_passwd_all_for_wheel group: root mode: "0440" owner: root validate: visudo -cf %s - name: Add sudoers users to 'wheel' group user: append: yes name: {{ '"{{ item }}"' }} groups: wheel with_items: {{ '"{{ sudoers }}"' }} - name: Set exclusive authorized key for sudoers taken from file authorized_key: {% raw %}key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_ed25519_{% endraw %}{{ ansible_user }}{% raw %}.pub') }}"{% endraw %} state: present user: {{ '"{{ item }}"' }} with_items: {{ '"{{ sudoers }}"' }}
Erklärung:
path: "/home/{{ ansible_user }}/....yml"
Datei, welche verändert werden soll.
block: | ..."
Block mit Inhalten, welche der Datei hinzugefügt werden sollen.