Ansibleでsudoersファイル管理するときに毎回copyモジュールで管理していたんですが、どうしても/etc/sudoersに直接書かなければならない環境はlineinfileモジュールを使えばいい感じになりそうです。
■lineinfile – Ensure a particular line is in a file, or replace an existing line using a back-referenced regular expression.
http://docs.ansible.com/ansible/lineinfile_module.html
regexpは正規表現。
・Examples
1 2 3 4 5 6 |
# Fully quoted because of the ': ' on the line. See the Gotchas in the YAML docs. - lineinfile: path: /etc/sudoers state: present regexp: '^%wheel\s' line: '%wheel ALL=(ALL) NOPASSWD: ALL' |
■メンテしやすいように変数化してみた
1 2 3 4 5 6 7 8 9 |
- name: add sudoers lineinfile: path: /etc/sudoers state: present regexp: "{{ item.match }}" line: "{{ item.line }}" with_items: - { match: 'adachin', line: 'adachin ALL=(ALL) NOPASSWD: ALL' } - { match: 'new', line: 'new ALL=(ALL) NOPASSWD: ALL' } |
基本stateでWhether the line should be there or not.(指定した行があってもなくても)入れてるので、
・adachinという文字列があったら上書き
・adachinという文字列がなかったら追記
みたいな感じ。これで新しい人が来たら追記すればOK!
■まとめ
正規表現で完全に一致するように書けば問題なし。sudoersファイルは構文エラー(改行コード)気付かずそのまま適用すると死ぬので、特にwindowsだとデフォルトでCRLFからLFに変更するように気をつけましょう〜
2件のコメント
wint: fav魔 (@wint7) · 2018/01/31 3:31 pm
sudoers は設定ミスると危険なので、 validate option を使ったほうがいいですね。
参考:
http://docs.ansible.com/ansible/latest/lineinfile_module.html#examples の sudoers のサンプル
あだちん · 2018/01/31 5:52 pm
おおおおありがとうございます!