kafka
というユーザーを作成しました。このユーザーに、/etc/init.d/kafka
コマンドのみを実行するためのSudoアクセスを付与しようとしています。
Ansibleを使用して/etc/sudoers.d/kafka
に次のエントリを追加しました:
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
何が悪いのですか?
A "Sudo:parse error in ..."/etc/sudoers
または#include <filename>
または#includedir <path>
ディレクティブに含まれるファイルから発生したそのファイルの最後のエントリに欠落している改行。
copy
モジュールを使用することは、おそらく/etc/sudoers
をAnsibleで処理するための最良の選択ではありません。
lineinfile モジュールには、保存する前にファイルを検証するオプションがあります。また、そのモジュールを使用すると、行などを削除するのも簡単です。
documentation の使用例が含まれています。
- 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'