ansible
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| ansible [2023-12-07 17:36:35] – manfred | ansible [2024-04-04 16:02:21] (aktuell) – [Wenn-Sonst] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Ansible ====== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | <code python> | ||
| + | --- | ||
| + | - name: PlayBook Betriebssystemversion anzeigen | ||
| + | hosts: all | ||
| + | gather_facts: | ||
| + | become: true | ||
| + | tasks: | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.debug: | ||
| + | var: ansible_facts.lsb.codename | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.debug: | ||
| + | var: ansible_facts.lsb.description | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.debug: | ||
| + | var: ansible_facts.lsb.id | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.debug: | ||
| + | var: ansible_facts.lsb.major_release | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.debug: | ||
| + | var: ansible_facts.lsb.release | ||
| + | </ | ||
| + | |||
| + | > ansible-playbook -i inventory.yml -l test01 playbook_update.yml | ||
| + | > ansible-playbook -i inventory.yml -l test02 playbook_update.yml | ||
| + | |||
| + | <file python inventory.yml> | ||
| + | --- | ||
| + | servers: | ||
| + | hosts: | ||
| + | test01: | ||
| + | ansible_host: | ||
| + | become: true | ||
| + | test02: | ||
| + | ansible_host: | ||
| + | become: true | ||
| + | </ | ||
| + | |||
| + | <file python include_variables.yml> | ||
| + | --- | ||
| + | ansible_python_interpreter: | ||
| + | | ||
| + | SSHDCFG: "/ | ||
| + | |||
| + | NTP_SERVER1: | ||
| + | NTP_SERVER2: | ||
| + | </ | ||
| + | |||
| + | <file python include_users.yml> | ||
| + | --- | ||
| + | # | ||
| + | # SFTP-Benutzer definieren | ||
| + | # | ||
| + | # | ||
| + | # Der User, bei dem Gruppenname und Benutzername sind gleich, ist ein " | ||
| + | # alle weiteren User, die mit dieser gleichen Gruppe angelegt werden, | ||
| + | # sind " | ||
| + | # | ||
| + | # Wenn bei einem User der Gruppenname und der Benutzername gleich sind, | ||
| + | # dann wird sein Home-Verzeichnis ganz normal unterhalb von /home angelegt. | ||
| + | # Sind diese Namen unterschiedlich, | ||
| + | # dessen Home-Verzeichnis angelegt, dessen Benutzername dem eigenen Gruppennamen | ||
| + | # entspricht. | ||
| + | # | ||
| + | # Ein " | ||
| + | # | ||
| + | # | ||
| + | users: | ||
| + | - name: " | ||
| + | gruppe: " | ||
| + | shell: "/ | ||
| + | ssh_key: "{{ lookup(' | ||
| + | password: " | ||
| + | comment: " | ||
| + | | ||
| + | - name: " | ||
| + | gruppe: " | ||
| + | shell: "/ | ||
| + | ssh_key: "{{ lookup(' | ||
| + | password: " | ||
| + | comment: "Otto der Filmemacher" | ||
| + | datadir: " | ||
| + | | ||
| + | - name: " | ||
| + | gruppe: " | ||
| + | shell: "/ | ||
| + | ssh_key: "{{ lookup(' | ||
| + | password: " | ||
| + | comment: " | ||
| + | datadir: " | ||
| + | </ | ||
| + | |||
| + | <file python playbook_update.yml> | ||
| + | --- | ||
| + | # ----------------------------------------------------------- | ||
| + | # Upgrade | ||
| + | # ----------------------------------------------------------- | ||
| + | - name: " | ||
| + | gather_facts: | ||
| + | become: true | ||
| + | hosts: servers | ||
| + | tasks: | ||
| + | # ------------------------------------------------------- | ||
| + | # IPv6 abschalten | ||
| + | # ------------------------------------------------------- | ||
| + | - name: Deactivate ipv6 perm | ||
| + | lineinfile: | ||
| + | path: / | ||
| + | state: present | ||
| + | regexp: ' | ||
| + | line: ' | ||
| + | |||
| + | - name: Deactivate ipv6 temp | ||
| + | ansible.builtin.shell: | ||
| + | sysctl -w net.ipv6.conf.all.disable_ipv6=1 | ||
| + | sysctl -w net.ipv6.conf.default.disable_ipv6=1 | ||
| + | update-grub | ||
| + | exit 0 | ||
| + | args: | ||
| + | executable: /bin/bash | ||
| + | |||
| + | - name: Restart systemd-resolved | ||
| + | service: | ||
| + | name: systemd-resolved | ||
| + | state: restarted | ||
| + | |||
| + | # ------------------------------------------------------- | ||
| + | # apt-get dist-upgrade | ||
| + | # ------------------------------------------------------- | ||
| + | - name: Perform a dist-upgrade. | ||
| + | ansible.builtin.apt: | ||
| + | upgrade: dist | ||
| + | update_cache: | ||
| + | |||
| + | - name: Check if a reboot is required. | ||
| + | ansible.builtin.stat: | ||
| + | path: / | ||
| + | get_md5: no | ||
| + | register: reboot_required_file | ||
| + | |||
| + | - name: Reboot the server (if required). | ||
| + | ansible.builtin.reboot: | ||
| + | when: reboot_required_file.stat.exists == true | ||
| + | |||
| + | - name: Remove dependencies that are no longer required. | ||
| + | apt: | ||
| + | autoremove: yes | ||
| + | |||
| + | - name: Check the Uptime of the servers | ||
| + | shell: " | ||
| + | register: Uptime | ||
| + | |||
| + | - debug: var=Uptime.stdout | ||
| + | |||
| + | ### TASK install basic | ||
| + | - name: Install Tools server | ||
| + | apt: | ||
| + | update_cache: | ||
| + | name: | ||
| + | - systemd-timesyncd | ||
| + | - vim | ||
| + | - screen | ||
| + | - mc | ||
| + | state: present | ||
| + | </ | ||
| + | |||
| + | <file python playbook_add_user.yml> | ||
| + | --- | ||
| + | - hosts: servers | ||
| + | gather_facts: | ||
| + | become_user: | ||
| + | become: true | ||
| + | tasks: | ||
| + | |||
| + | # | ||
| + | ### SSHD/ | ||
| + | # | ||
| + | ### die letzte Sektion wird entfernt, weil sie immer am Ende bleiben muss | ||
| + | ### und hier aber noch etwas hinzugefühgt (bzw. eingeschoben) werden soll | ||
| + | |||
| + | # 330 # Sicherheitssektion entfernen | ||
| + | - name: Textblock aus der Datei entfernen | ||
| + | ansible.builtin.blockinfile: | ||
| + | path: " | ||
| + | marker: "# {mark} Sicherheitssektion" | ||
| + | block: "" | ||
| + | state: absent | ||
| + | |||
| + | # | ||
| + | ### Das SFTP-Sub-System mus umgestellt werden | ||
| + | |||
| + | - name: SFTP-User umask 0002 | ||
| + | ansible.builtin.lineinfile: | ||
| + | path: " | ||
| + | line: Subsystem sftp internal-sftp -u 002 -l VERBOSE | ||
| + | create: yes | ||
| + | |||
| + | # | ||
| + | # SFTP-Log | ||
| + | # | ||
| + | # 350 # SSHD/SFTP - überprüfen und ggf. konfigurieren | ||
| + | - name: SFTP - logadmin einrichten | ||
| + | ansible.builtin.lineinfile: | ||
| + | path: " | ||
| + | line: "{{ item }}" | ||
| + | create: yes | ||
| + | with_items: | ||
| + | - '# Log internal-sftp in a separate file' | ||
| + | - ': | ||
| + | - ': | ||
| + | |||
| + | # | ||
| + | # 365 # spezieller Benutzer zum lesen von Logs | ||
| + | - name: SFTP - SSHD-CFG für logadmin | ||
| + | ansible.builtin.lineinfile: | ||
| + | path: " | ||
| + | line: "{{ item }}" | ||
| + | create: yes | ||
| + | with_items: | ||
| + | - '# Create an additional socket for some of the sshd chrooted users.' | ||
| + | - ' | ||
| + | - '# | ||
| + | - 'Match user logadmin' | ||
| + | - ' | ||
| + | - ' | ||
| + | - ' | ||
| + | - ' | ||
| + | |||
| + | # | ||
| + | ### SSHD/ | ||
| + | |||
| + | # | ||
| + | ### Master: item[' | ||
| + | |||
| + | - name: Master-Gruppe anlegen | ||
| + | ansible.builtin.group: | ||
| + | name: "{{ item[' | ||
| + | state: present | ||
| + | local: false | ||
| + | non_unique: false | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Master-Benutzer anlegen | ||
| + | ansible.builtin.user: | ||
| + | name: "{{ item[' | ||
| + | group: "{{ item[' | ||
| + | home: "/ | ||
| + | comment: "{{ item[' | ||
| + | password: "{{ item.password | default(' | ||
| + | state: present | ||
| + | umask: 0002 | ||
| + | append: false | ||
| + | create_home: | ||
| + | generate_ssh_key: | ||
| + | local: false | ||
| + | non_unique: false | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Master-Home-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Master-DEV-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Master-SSH-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: "{{ item[' | ||
| + | group: root | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | # | ||
| + | ### Kunden: item[' | ||
| + | |||
| + | - name: Kunde-Benutzer anlegen | ||
| + | ansible.builtin.user: | ||
| + | name: "{{ item[' | ||
| + | group: "{{ item[' | ||
| + | home: "/ | ||
| + | comment: "{{ item[' | ||
| + | password: "{{ item.password | default(' | ||
| + | state: present | ||
| + | umask: 0002 | ||
| + | append: false | ||
| + | create_home: | ||
| + | generate_ssh_key: | ||
| + | local: false | ||
| + | non_unique: false | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Kunden-Home-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Kunden-DEV-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Kunden-SSH-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: "{{ item[' | ||
| + | group: root | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | - name: Rechte vom Kunden-DATADIR-Verzeichnis setzen | ||
| + | ansible.builtin.file: | ||
| + | path: "/ | ||
| + | owner: "{{ item[' | ||
| + | group: "{{ item[' | ||
| + | mode: ' | ||
| + | recurse: false | ||
| + | state: directory | ||
| + | when: item[' | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | # | ||
| + | ### Alle Benutzer | ||
| + | |||
| + | - name: SSH-Schlüssel ablegen | ||
| + | authorized_key: | ||
| + | user: "{{ item[' | ||
| + | key: "{{ item[' | ||
| + | state: present | ||
| + | with_items: | ||
| + | - "{{ users }}" | ||
| + | |||
| + | # | ||
| + | ### SSHD/ | ||
| + | # | ||
| + | # | ||
| + | # Sicherheitssektion | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.blockinfile: | ||
| + | path: " | ||
| + | marker: "# {mark} Sicherheitssektion" | ||
| + | block: "# | ||
| + | ChrootDirectory /tmp\n\t | ||
| + | X11Forwarding no\n\t | ||
| + | AllowTcpForwarding no\n\t | ||
| + | ForceCommand internal-sftp -l VERBOSE\n# | ||
| + | state: present | ||
| + | |||
| + | # | ||
| + | - name: Restart sshd | ||
| + | service: | ||
| + | name: sshd | ||
| + | state: restarted | ||
| + | enabled: true | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== File ===== | ||
| + | |||
| + | <code python> | ||
| + | --- | ||
| + | - name: Dateien und Verzeichnisse löschen | ||
| + | file: | ||
| + | path: "{{ item }}" | ||
| + | state: absent | ||
| + | with_items: | ||
| + | - / | ||
| + | - / | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | --- | ||
| + | # Inhalte von einem Verzeichnis löschen; z.B. von einem Mount-Point | ||
| + | - block: | ||
| + | - name: Dateien im Verzeichnis einlesen | ||
| + | find: | ||
| + | paths: "/ | ||
| + | hidden: True | ||
| + | recurse: True | ||
| + | register: collected_files | ||
| + | |||
| + | - name: Sym-Links im Verzeichnis einlesen | ||
| + | find: | ||
| + | paths: "/ | ||
| + | hidden: True | ||
| + | recurse: True | ||
| + | file_type: link | ||
| + | register: collected_link | ||
| + | |||
| + | - name: Unterverzeichnisse einlesen | ||
| + | find: | ||
| + | paths: "/ | ||
| + | hidden: True | ||
| + | recurse: True | ||
| + | file_type: directory | ||
| + | register: collected_directories | ||
| + | |||
| + | - name: entferne Dateien und Unterverzeichnisse aus dem Verzeichnis | ||
| + | file: | ||
| + | path: "{{ item.path }}" | ||
| + | state: absent | ||
| + | with_items: > | ||
| + | {{ | ||
| + | collected_files.files | ||
| + | + collected_link.files | ||
| + | + collected_directories.files | ||
| + | }} | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== LineInFile ===== | ||
| + | |||
| + | <code python> | ||
| + | --- | ||
| + | # ----------------------------------------------------------- | ||
| + | # Tests | ||
| + | # ----------------------------------------------------------- | ||
| + | - name: " | ||
| + | gather_facts: | ||
| + | become: true | ||
| + | hosts: servers | ||
| + | vars_files: | ||
| + | - include_variables.yml | ||
| + | |||
| + | # https:// | ||
| + | tasks: | ||
| + | - name: Add a line to a file if the file does not exist, without passing regexp | ||
| + | ansible.builtin.lineinfile: | ||
| + | path: / | ||
| + | line: 192.168.1.99 foo.lab.net foo | ||
| + | create: yes | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== BlockInFile ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <code python> | ||
| + | - name: Insert/ | ||
| + | ansible.builtin.blockinfile: | ||
| + | path: / | ||
| + | marker: "< | ||
| + | insertafter: | ||
| + | block: | | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | - name: Remove HTML as well as surrounding markers | ||
| + | ansible.builtin.blockinfile: | ||
| + | path: / | ||
| + | marker: "< | ||
| + | block: "" | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | - name: Textblock aus der Datei entfernen | ||
| + | ansible.builtin.blockinfile: | ||
| + | path: / | ||
| + | marker: "# {mark} Sicherheitssektion" | ||
| + | block: "" | ||
| + | state: absent | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | aaa | ||
| + | bbb | ||
| + | ccc | ||
| + | # BEGIN Sicherheitssektion | ||
| + | ddd | ||
| + | eee | ||
| + | fff | ||
| + | # END Sicherheitssektion | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Wenn-Sonst ===== | ||
| + | |||
| + | Wenn die Major-Versionsnummer eine " | ||
| + | ### OS-Schalter | ||
| + | - name: Ubuntu 22.04 LTS | ||
| + | set_fact: | ||
| + | php_version: | ||
| + | percona_repo_version: | ||
| + | when: | ||
| + | ansible_facts.lsb.major_release == " | ||
| + | |||
| + | |||
| + | ===== cut / split ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ### ein einfaches Beispiel, hier wird die Zeichenkette einer E-Mail beim '' | ||
| + | --- | ||
| + | - name: Ansible Split Example 1 | ||
| + | hosts: localhost | ||
| + | tasks: | ||
| + | - name: Split Simple String Example | ||
| + | debug: msg={{ ' | ||
| + | |||
| + | ### in diesem Beispiel wird eine Zeichenkette bei bestimmten Zeichen (-) getrennt | ||
| + | --- | ||
| + | - name: Ansible Split Example 2 | ||
| + | hosts: localhost | ||
| + | vars: | ||
| + | var1: dos-e1-south-209334567829102380 | ||
| + | tasks: | ||
| + | - set_fact: | ||
| + | var2: "{{ var1.split(' | ||
| + | - debug: | ||
| + | msg: "{{ var2.0 }}-{{ var2.1 }}-{{ var2.2 }}" | ||
| + | |||
| + | ### in diesem Beispiel wird alles nach dem letzten Trennzeichen (-), einschließlich des Trennzeiches selbst, per RegEx entfernt | ||
| + | --- | ||
| + | - name: Ansible Split Example 3 | ||
| + | hosts: localhost | ||
| + | vars: | ||
| + | var: dos-e1-south-209334567829102380 | ||
| + | tasks: | ||
| + | - debug: | ||
| + | msg: '{{ var | regex_replace(" | ||
| + | |||
| + | Die Ausgaben von Beispiel 2 und 3 sind identisch und lauten: '' | ||
| + | |||
| + | Erklärung der im 3. Beispiel verwendeten RegEx: | ||
| + | | ||
| + | ^(.*) | ||
| + | behalte alles vom Beginn im Zwischenspeicher (1. Zwischenspeicher) | ||
| + | | ||
| + | -[^-]+$ | ||
| + | finde das " | ||
| + | | ||
| + | \\1 | ||
| + | ersetze die Zeichenkette durch den Inhalt aus dem 1. Zwischenspeicher | ||
| + | |||
| + | ### man kann auch mehrere Zeichenketten mit einem Spaltentrenner (-) wieder zu einer einzigen Zeichenkette zusammensetzen | ||
| + | - debug: | ||
| + | msg: "{{ var2[0:3] | join(' | ||
| + | |||
| + | ### in diesem Beispiel wird eine Datei eingelesen, zeilenweise bearbeitet und die einzelnen Zeilen werden beim '':'' | ||
| + | --- | ||
| + | - name: Ansible Split Example 4 | ||
| + | hosts: localhost | ||
| + | vars: | ||
| + | - usernames : [] | ||
| + | tasks: | ||
| + | - name: print only domain names from Email IDs with Split | ||
| + | set_fact: | ||
| + | usernames: '{{ usernames + [ item | split(":" | ||
| + | loop: "{{ lookup(' | ||
| + | | ||
| + | - debug: var=usernames | ||
| + | |||
| + | |||
| + | ===== SED / regex_replace ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <code python> | ||
| + | - name: Replace old hostname with new hostname (requires Ansible >= 2.4) | ||
| + | ansible.builtin.replace: | ||
| + | path: /etc/hosts | ||
| + | regexp: ' | ||
| + | replace: ' | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | - name: Supports a validate command | ||
| + | ansible.builtin.replace: | ||
| + | path: / | ||
| + | regexp: ' | ||
| + | replace: '\1 127.0.0.1: | ||
| + | validate: '/ | ||
| + | </ | ||
| + | |||
