![Ansible: grep crontab-файлы на основе имен пользователей, извлеченных из /etc/passwd](https://rvso.com/image/782583/Ansible%3A%20grep%20crontab-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20%D0%BD%D0%B0%20%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5%20%D0%B8%D0%BC%D0%B5%D0%BD%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B8%D0%B7%20%2Fetc%2Fpasswd.png)
Я хочу извлечь список пользователей из /etc/passwd, а затем выполнить grep в их файлах crontab на предмет отключенных (закомментировано: ^#) заданий.
Высокоуровневые шаги будут следующими:
- Возьмите массив имен пользователей из /etc/passwd ("my_users")
- Запустите grep для файлов, указанных в шаге 1 (/var/spool/cron/{{my_users}})
- Используйте «Отладка» для распечатки результатов.
Буду признателен за любые предложения. Вот что у меня есть на данный момент:
- 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: "^#"
Вот результат, о котором идет речь, и он не совсем такой, как я ожидал:
ЗАДАЧА [Получить отключенные задания cron]***** ... {"ansible_loop_var": "item", "changed": false, "item": "nprobe", "msg": "строка обязательна с state=present"} не удалось: [testvm] (item=root) => {"ansible_loop_var": "item", "changed": false, "item": "root", "msg": "строка обязательна с state=present"} не удалось: [testvm] (item=backup) => {"ansible_loop_var": "item", "changed": false, "item": "backup", "msg": "строка обязательна с state=present"}
решение1
В качестве подсказки смотрите ниже, как создать словарь, содержащий всю информацию crontab.
- Объявите переменные
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']))) }}"
- Найти все файлы crontab (cron_users)
- find:
paths: "{{ cron_tabs_path }}"
register: cron_user
- Прочитать все кронтабы
- command: "crontab -u {{ item }} -l"
register: cron_tab
loop: "{{ cron_users }}"
- Создайте словарь пользователей и их кронтабов
- set_fact:
cron_tabs_dict: "{{ dict(cron_users|zip(cron_tabs)) }}"
Например, учитывая файлы crontab на удаленных хостах test_11 и 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
Пособие
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
дает
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: []
Использоватьгетентдля чтения /etc/passwd
- getent:
database: passwd