问题:我不知道如何启用无密码 sudo 的 apache2 服务。我可以为用户启用所有命令,但这似乎不是一个好主意,所以我只想启用某些命令。
背景:我正在尝试设置一个持续交付/部署系统,作为其中的一部分,我让 Ansible 在目标机器上运行一些命令。不幸的是,其中一些命令需要 sudo,我需要抑制这些命令的密码提示。理想情况下,此过程的所有授权都使用注册密钥而不是密码。
配置: (机器名称已被替换为占位符值。)
target.example.com
运行 Ubuntu 18.04 LTS 和 Apache 2.x 的计算机
control.example.com
运行 Ubuntu 16.04 LTS 和 Ansible 2.7.8 的机器
/etc/sudoers.d/ansible
机器上的文件target.example.com
:
ansible ALL= NOPASSWD: /usr/sbin/service /usr/sbin/apache2 *
/etc/ansible/hosts
机器上的文件control.example.com
:
[production]
target.example.com
~/deploy.yml
机器上的文件control.example.com
:
---
- hosts: production
remote_user: ansible
tasks:
- name: stop apache
shell: service apache2 stop
become: yes
become_method: sudo
- name: start apache
shell: service apache2 start
become: yes
become_method: sudo
附加信息:ansible-playbook ~/deploy.yml
在上 运行时control.example.com
,我收到错误sudo: a password is required
。我可以通过 登录目标然后运行和重现密码提示。因此,我犹豫地声称问题出在 sudo 配置上,而 Ansible 只是信使。ssh [email protected]
sudo service apache2 stop
sudo service apache2 start
target.example.com
我尝试过不同的配置/etc/sudoers.d/ansible
,主要是因为我完全不确定正确的语法,并尝试了各种表达式来查看哪种有效。我发现唯一有效的是ansible ALL= NOPASSWD: ALL
,出于安全考虑,我想避免使用它。
答案1
最初的问题是将两个不同的问题混为一谈。似乎这不可能为 sudoers 文件中的一行命令规范指定参数或标志。因此,命令规范要么必须泛化为/usr/sbin/service
,这同样不安全,要么必须更改为启用NOPASSWD
比允许使用 sudo 运行任何服务更严格的命令。
幸运的是,在这种情况下,我可以直接使用该apachectl
服务来允许 apache 的细粒度 sudo 权限,而无需执行其他任何操作。更新后的文件/etc/sudoers.d/ansible
:
ansible ALL=(ALL) NOPASSWD: /usr/sbin/apachectl
请注意,运行更新为使用的 Ansible 剧本apachectl
仍然会失败,并显示错误消息sudo: a password is required
,但这似乎是我尝试使用 Ansible 或其他方法的单独问题。无论如何,它似乎与sudo
原始问题无关。