web-dev-qa-db-ja.com

sudoersファイルの解析エラー

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

何が悪いのですか?

6
jeffreyveon

A "Sudo:parse error in ..."/etc/sudoersまたは#include <filename>または#includedir <path>ディレクティブに含まれるファイルから発生したそのファイルの最後のエントリに欠落している改行。

12
HBruijn

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'
4
Henrik Pingel