Ansible: grep crontab-Dateien basierend auf Benutzernamen, die aus /etc/passwd extrahiert wurden

Ansible: grep crontab-Dateien basierend auf Benutzernamen, die aus /etc/passwd extrahiert wurden

Ich möchte eine Liste der Benutzer aus /etc/passwd extrahieren und dann ihre Crontab-Dateien nach deaktivierten (kommentiert: ^#) Jobs durchsuchen.

Die Schritte auf hoher Ebene wären:

  1. Holen Sie sich ein Array von Benutzernamen aus /etc/passwd ("my_users")
  2. Führen Sie grep für die in Schritt 1 genannten Dateien aus (/var/spool/cron/{{my_users}}).
  3. Verwenden Sie „Debug“, um die Ergebnisse auszudrucken.

Ich freue mich über jeden Vorschlag, hier ist, was ich bisher habe:

  - name: ANSIBLE PLAYBOOK - disabled cronjob check
  hosts: "{{ variable_host | default('testvm') }}"
  remote_user: admin
  gather_facts: no
  become: yes

  tasks:    
  - getent:
      database: passwd
  - name: set_fact
    debugger: on_failed
    ansible.builtin.set_fact:
      my_users: "{{ getent_passwd|dict2items|json_query('[?contains(value,`/bin/bash`)].key') }}"
      cacheable: yes

  - name: set_fact_2
    ansible.builtin.set_fact:
      array_length: "{{ my_users|length }}"
  - debug:
      msg: "Debugging 2: {{ my_users|length }}"

  - name: Get disabled cron jobs
    debugger: always
    loop: "{{ my_users }}"
    ansible.builtin.lineinfile:
      path: "/var/spool/cron/{{ my_users }}"
      regexp: "^#"

Hier ist die fragliche Ausgabe, die nicht ganz meinen Erwartungen entspricht:

AUFGABE [Deaktivierte Cron-Jobs abrufen]**************************************************************************************************************************************************************************************** fehlgeschlagen: [testvm] (item=n2disk) => {"ansible_loop_var": "item", "changed": false, "item": "n2disk", "msg": "Zeile ist erforderlich mit Status=present"} fehlgeschlagen: [testvm] (item=cento) => {"ansible_loop_var": "item", "changed": false, "item": "cento", "msg": "Zeile ist erforderlich mit Status=present"} fehlgeschlagen: [testvm] (item=admin) => {"ansible_loop_var": "item", "changed": false, "item": "admin", "msg": "Zeile ist erforderlich mit Status=present"} fehlgeschlagen: [testvm] (item=nprobe) => {"ansible_loop_var": "item", "changed": false, "item": "nprobe", "msg": "Zeile ist erforderlich mit Status=present"} fehlgeschlagen: [testvm] (item=root) => {"ansible_loop_var": "item", "changed": false, "item": "root", "msg": "Zeile ist erforderlich mit Status=present"} fehlgeschlagen: [testvm] (item=backup) => {"ansible_loop_var": "item", "changed": false, "item": "backup", "msg": "Zeile ist erforderlich mit Status=present"}

Antwort1

Als Hinweis siehe unten, wie man ein Wörterbuch erstellt, das alle Crontab-Informationen enthält

  1. Deklarieren der Variablen
  cron_tabs_path: /var/cron/tabs
  cron_users: "{{ cron_user.files|map(attribute='path')|
                                  map('basename')|list }}"
  cron_tabs: "{{ cron_tab.results|map(attribute='stdout')|
                                  map('community.general.jc', 'crontab')|list }}"
  cron_tabs_dict_all: "{{ dict(ansible_play_hosts|
                               zip(ansible_play_hosts|
                                   map('extract', hostvars, ['cron_tabs_dict']))) }}"
  1. Alle Crontab-Dateien finden (cron_users)
    - find:
        paths: "{{ cron_tabs_path }}"
      register: cron_user
  1. Alle Crontabs lesen
    - command: "crontab -u {{ item }} -l"
      register: cron_tab
      loop: "{{ cron_users }}"
  1. Erstellen Sie ein Wörterbuch der Benutzer und ihrer Crontabs
    - set_fact:
        cron_tabs_dict: "{{ dict(cron_users|zip(cron_tabs)) }}"

Beispielsweise angesichts der Crontabs auf den Remote-Hosts test_11 und test_13

shell> ssh admin@test_11 sudo crontab -u admin -l
#Ansible: test_1
5 12 * * * echo test 1
#Ansible: test_5
5 14 * * * echo test 5
#Ansible: test_4
5 13 * * * echo test 4
shell> ssh admin@test_11 sudo crontab -u alice -l
#Ansible: test_2
5 13 * * * echo test 2
shell> ssh admin@test_11 sudo crontab -u bob -l
#Ansible: test_3
5 14 * * * echo test 3
shell> ssh admin@test_13 sudo crontab -u admin -l
#Ansible: test_1
5 12 * * * echo test 1
#Ansible: test_4
5 13 * * * echo test 4
#Ansible: test_5
5 14 * * * echo test 5

Das Spielbuch

shell> cat pb.yml
- hosts: test_11,test_13

  vars:

    cron_tabs_path: /var/cron/tabs
    cron_tabs: "{{ cron_tab.results|map(attribute='stdout')|
                                    map('community.general.jc', 'crontab')|list }}"
    cron_users: "{{ cron_user.files|map(attribute='path')|
                                    map('basename')|list }}"
    cron_tabs_dict_all: "{{ dict(ansible_play_hosts|
                                 zip(ansible_play_hosts|
                                     map('extract', hostvars, ['cron_tabs_dict']))) }}"

  tasks:

    - find:
        paths: "{{ cron_tabs_path }}"
      register: cron_user
    - debug:
        var: cron_users

    - command: "crontab -u {{ item }} -l"
      register: cron_tab
      loop: "{{ cron_users }}"
    - debug:
        var: cron_tabs

    - set_fact:
        cron_tabs_dict: "{{ dict(cron_users|zip(cron_tabs)) }}"
    - debug:
        var: cron_tabs_dict|to_yaml

    - debug:
        var: cron_tabs_dict_all|to_yaml
      run_once: true

gibt

  cron_tabs_dict_all:
    test_11:
      admin:
        schedule:
        - command: echo test 1
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['12']
          minute: ['5']
          month: ['*']
        - command: echo test 5
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['14']
          minute: ['5']
          month: ['*']
        - command: echo test 4
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['13']
          minute: ['5']
          month: ['*']
        variables: []
      alice:
        schedule:
        - command: echo test 2
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['13']
          minute: ['5']
          month: ['*']
        variables: []
      bob:
        schedule:
        - command: echo test 3
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['14']
          minute: ['5']
          month: ['*']
        variables: []
    test_13:
      admin:
        schedule:
        - command: echo test 1
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['12']
          minute: ['5']
          month: ['*']
        - command: echo test 4
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['13']
          minute: ['5']
          month: ['*']
        - command: echo test 5
          day_of_month: ['*']
          day_of_week: ['*']
          hour: ['14']
          minute: ['5']
          month: ['*']
        variables: []

Verwendengetentum /etc/passwd zu lesen

    - getent:
        database: passwd

verwandte Informationen