为什么这个ansible-lineinfle命令用于检查/etc/sudoers中的行失败,而一个非常类似的行成功了?

为什么这个ansible-lineinfle命令用于检查/etc/sudoers中的行失败,而一个非常类似的行成功了?,ansible,ansible-playbook,sudoers,Ansible,Ansible Playbook,Sudoers,我正在写一本关于覆盆子圆周率的剧本。本手册包括两项任务,用于检查/etc/sudoers中是否存在一条线,其中一条线始终通过,而另一条线始终失败。我似乎找不出原因;这两个任务的语法完全相同,而且两行肯定都在/etc/sudoers文件中。我已经在下面包含了相关代码,任何输入都将不胜感激 /etc/sudoers: # /etc/sudoers # # This file MUST be edited with the 'visudo' command as root. # # See the m

我正在写一本关于覆盆子圆周率的剧本。本手册包括两项任务,用于检查
/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
剧本任务中的相关片段:

- 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

我认为您可能正在经历中描述的情况

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传输的线路
,并通过
visudo
验证(未找到)。

确保添加健全性检查。