我创建了一个名为 的用户,kafka
并尝试授予该用户 sudo 访问权限,以便仅运行/etc/init.d/kafka
命令。
/etc/sudoers.d/kafka
我通过 Ansible添加了以下条目:
kafka ALL = NOPASSWD: /etc/init.d/kafka
但是,这会彻底破坏 sudo,并出现以下错误:
/etc/sudoers.d/kafka:第 1 行附近出现语法错误
sudo:/etc/sudoers.d/kafka 第 1 行附近出现解析错误
sudo:未找到有效的 sudoers 源,退出
sudo:无法初始化策略插件
以下是完整的 Ansible 代码片段:
- name: Create kafka user's group
group:
name: "{{ kafka_group }}"
state: present
- name: Create kafka user
user:
name: "{{ kafka_user }}"
state: present
group: "{{ kafka_group }}"
shell: /bin/bash
- name: Set up password-less sudo for kafka user
copy:
content: "{{ kafka_user }} ALL = NOPASSWD: /etc/init.d/{{ kafka_service_name }}"
dest: "/etc/sudoers.d/{{ kafka_user }}"
owner: root
group: root
mode: 0440
我究竟做错了什么?
答案1
A“sudo:解析错误...”源自或包含或指令/etc/sudoers
的任何文件都可能是由于该文件的最后一项缺少换行符造成的。#include <filename>
#includedir <path>
答案2
使用该copy
模块可能不是处理/etc/sudoers
Ansible 的最佳选择。
这行输入文件模块有一个选项,可以在保存前验证文件。使用该模块还可以更轻松地删除行等。
这文档包含如何使用它的示例。
- name: Set up password-less sudo for kafka user
lineinfile: dest=/etc/sudoers state=present regexp='^%{{ kafka_user }} ALL\=' line='%{{ kafka_user }} ALL= NOPASSWD: /etc/init.d/{{ kafka_service_name }}' validate='visudo -cf %s'