Почему эта команда ansible lineinfile для проверки строки в /etc/sudoers не работает, когда очень похожая выполняется успешно?

У меня есть Kodi, работающий на Raspberry Pi, для которого я пишу учебник Ansible. В этом плейбуке есть две задачи, которые проверяют, присутствует ли строка в /etc/sudoers, причем одна из них последовательно проходит, а другая постоянно терпит неудачу. Кажется, я не могу точно определить причину; синтаксис двух задач точно такой же, и обе строки определенно находятся в файле /etc/sudoers. Я включил соответствующий код ниже, любой вклад будет высоко оценен.

/etc/sudoers:

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias      SHUTDOWN = /sbin/shutdown, /sbin/reboot, /sbin/halt, /usr/bin/passwd
Cmnd_Alias      PERMISSIONS = /bin/chmod, /bin/chown
# User privilege specification
root    ALL=(ALL) ALL
pi      ALL=(ALL) NOPASSWD: ALL
debian-transmission     ALL=(ALL) NOPASSWD: PERMISSIONS
Defaults env_keep += "RPI_UPDATE_UNSUPPORTED"
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d

Соответствующий фрагмент из задач playbook:

- name: set pi permissions in /etc/sudoers                                      
  lineinfile: "dest=/etc/sudoers                                                
              state=present                                                     
              line='pi      ALL=(ALL) NOPASSWD: ALL'                            
              validate='visudo -cf %s'"                                         

- name: set debian-transmission permissions in /etc/sudoers                     
  lineinfile: "dest=/etc/sudoers                                                
              state=present                                                     
              line='debian-transmission     ALL=(ALL) NOPASSWD: PERMISSIONS'    
              validate='visudo -cf %s'"                                         

(Я знаю, что первая задача не нужна, так как она используется системой по умолчанию, но я добавил ее, пытаясь выяснить, почему другая задача не работает, просто чтобы доказать свою точку зрения.)

И вот вывод, когда я запускаю playbook:

TASK: [kodi | start transmission-daemon again once settings.json has been copied] *** 
changed: [kodi]

TASK: [kodi | set pi permissions in /etc/sudoers] ***************************** 
ok: [kodi]

TASK: [kodi | set debian-transmission permissions in /etc/sudoers] ************ 
failed: [kodi] => {"cmd": "visudo -cf /tmp/tmpZNRBC3", "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory

FATAL: all hosts have already failed -- aborting

person 3cheesewheel    schedule 29.01.2015    source источник
comment
Обязательно добавьте проверку работоспособности для обработки sudoers.   -  person kaiser    schedule 04.01.2016


Ответы (1)


Я думаю, вы можете столкнуться с тем, что описано в запросе на включение #6652.

Замените visudo в validate на полный путь к visudo, и все должно работать.

- name: set debian-transmission permissions in /etc/sudoers                     
  lineinfile: "dest=/etc/sudoers                                                
              state=present                                                     
              line='debian-transmission     ALL=(ALL) NOPASSWD: PERMISSIONS'    
              validate='/usr/sbin/visudo -cf %s'"

Ваша первая задача (с правами пользователя pi) работает, потому что нужная строка уже есть в файле и проверка с visudo не требуется. Однако необходимо добавить строку с debian-transmission и пройти проверку visudo (которая не найдена).

person Michal Gasek    schedule 29.01.2015