Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:ansible_mit_ansible_einrichten

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.

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

  1. Ansible installiert, aber noch nicht konfiguriert ist
    Siehe auch nachfolgenden internen Link: Ansible
  2. Ein eigener Benutzer für die Nutzung von Ansible genutzt werden soll
  3. Die Authentifizierung des Ansible-Benutzers gegenüber allen Hosts durch Verwendung eines ssh-Schlüsselpaares erfolgen soll

Informationen

ansible.cfg

Bei der Ermittlung der Konfigurationsdatei - ansible.cfg durchsucht Ansible nachfolgende Verzeichnis in der folgenden Reihenfolge:

  1. Durch die Umgebungsvariable ANSIBLE_CONFIG spezifizierte Datei
  2. ./ansible.cfg (ansible.cfg im aktuellen Verzeichnis)
  3. ~/.ansible.cfg (.ansible.cfg im $HOME Verzeichnis (Heimatverzeichnis) des angegebenen Benutzers)
  4. /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,

  1. become=True - diese automatisch erlagt werden sollen
  2. become_method=sudo - welcher Befehl zur Rechteerlangung ausgeführt werden soll
  3. become_user=root - der Benutzer, dessen Rechte erlangt werden sollen
  4. become_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 und
  • ansible_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 und
  • ansible_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 und
  • ansible_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.

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
tachtler/ansible_mit_ansible_einrichten.txt · Zuletzt geändert: 2020/02/01 06:42 von klaus