Проверка файлов sudoers.d с помощью Ansible

У меня есть Ansible playbook, который я использую для управления нашими файлами sudoers в нашей среде. Нам нравится хранить минимальный файл sudoers в / etc / sudoers, тогда все, что мы хотим добавить, помещается в отдельные файлы в /etc/sudoers.d.

Моя книга воспроизведения Ansible содержит следующую задачу для отправки этих файлов:

- name: copy sudoers files
  copy:
    src: "{{ item }}"
    dest: "/etc/sudoers.d/{{ item }}"
    backup: yes
    owner: root
    group: root
    mode: 0440
    validate: /usr/sbin/visudo -cf %s
  with_items:
    - admins
    - apache
    - monitor

Задача содержит предложение проверки, чтобы убедиться, что файл действителен перед фиксацией файла, и это обычно работает хорошо. Однако сегодня я столкнулся с проблемой, когда обновление сломало sudo. Файл прошел этап проверки, но содержал User_Alias ​​с тем же именем, что и User_Alias ​​в основном файле / etc / sudoers. Любая попытка запустить sudo после этого приводила к ошибке синтаксического анализа.

У меня такой вопрос - как мне протестировать обновления моих файлов sudoers из Ansible, которые могут обнаруживать подобные ошибки? Как только файл будет на месте, ошибку можно будет обнаружить, запустив visudo -c , но вставка этого в качестве этапа проверки не работает. Ansible требует заполнителя % s , и даже если этого не произошло, проверка выполняется перед копированием файла на место, чтобы visudo -c не обнаружил его.

У меня есть файл crontab, предположительно выполняющий команду Django после загрузки виртуальной среды проекта:

*/1 * * * * source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand

... но он абсолютно ничего не делает. Журнал cron не выводит особых проблем:

Mar 13 19:51:01 110 CRON[23807]: (root) CMD (source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand)

Излишне говорить, что сама команда отлично работает при копировании и вставке в оболочку.

Я знаю, что это связано с переменными среды моего crontab, но я очень необразован по этому поводу, и я понятия не имею, что делать, особенно когда он запускается в виртуальном окружении python. Должен ли он использовать переменные моей пользовательской среды? Те из virtualenv? Как это реализовать? Спасибо!

NB: В случае, если это поможет, у меня есть следующие выходные данные моих переменных среды crontab (при экспорте "env" в файл через crontab):

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
LC_ALL=en_US.UTF-8
PWD=/root

И следующие переменные среды в виртуальной среде проекта:

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=x.x.x.x 53007 22
OLDPWD=/root/production/mydjangoproject
SSH_TTY=/dev/pts/0
LC_ALL=en_US.UTF-8
USER=root
VIRTUAL_ENV=/home/virtualenvs/mydjangoproject-venv
MAIL=/var/mail/root
PATH=/home/virtualenvs/mydjangoproject-
venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=(mydjangoproject-venv)${debian_chroot:+($debian_chroot)}\u@$(hostname -f):\w\$ 
SHLVL=1
HOME=/root
LS_OPTIONS=--color=auto --group-directories-first
LOGNAME=root
SSH_CONNECTION=x.x.x.x 53007 x.x.x.x 22
LC_CTYPE=en_US.UT
7
задан 13 March 2018 в 21:27
1 ответ

Есть несколько способов решить эту проблему:

Во-первых, это не работает, потому что / bin / sh - это оболочка, которую cron использует для запуска команд, но / bin / sh не поддерживает источник . Поэтому быстрое исправление - установить SHELL = / bin / bash в crontab.

Или ...

Во-вторых, нет необходимости исходный код virtualenv / bin / activate так или иначе. Вы можете просто вызвать виртуальный питон напрямую.

* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand

Они были взяты из этого вопроса по SO , ответы на который могут содержать другие идеи для людей, находящихся в аналогичных, но не совсем тех же обстоятельствах.

8
ответ дан 2 December 2019 в 23:35

Теги

Похожие вопросы