Ansible Playbookテンプレートでsudoersファイルを変更する


8

私はansibleテンプレートでsudoersファイルを作成しようとしています。sudoersファイルは次のようになります。

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

これまでに管理したことは以下のとおりです。

Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

テンプレートは次のようになります。

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}

vars

commands:
  - ls
  - less
  - du

私の知る限り、ansibleテンプレートモジュールには、リモートサーバーでコマンドを実行して出力を出力するものはありません。それ以外の場合は、テンプレートファイルを次のように変更することを考えていました。

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}    
{% endfor %}

そして出力は私が欲しかったもののようになります。

それを簡単にすることができる他の方法はありますか?

ところで私はすでにこの投稿をチェックしました


私はちょうどあなたのVARSにコマンドのフルパスを置くだろう
jdog

システムでの変更については、スクリプトをbashに含めて実行を向上させることを好みます。
主は

回答:


5

TL; DR: KISS。より少ないを使用しないでください。

多くの場合、人々はansibleを必要のないものに変えようとすることで間違いを犯します。サポートがアクセスできるコマンドのリストを定義する場所が複数ない限り、それらをテンプレート作成ファイルに置くだけで完全に許容されます。

templates / etc / sudoers.d / support1

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /bin/cat
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

または明示的にCmnd_Aliasをどこでも再利用しないので

%support1 ALL=(ALL) NOPASSWD: /bin/ls
%support1 ALL=(ALL) NOPASSWD: /bin/cat
%support1 ALL=(ALL) NOPASSWD: /usr/bin/du

次のようなタスクを追加します。

- name: add templates
  template:
    src: {{ item }}
    dest: /{{ item }}
    owner: root
    group: root
    mode: 0640
  with_items:
    - etc/sudoers.d/support1

後でファイルに追加する変数があるか、グループを作成する別のロールを取得した場合にグループ名が変数から取得される可能性があるため、ファイルではなくテンプレートのみを使用します。

変数を使用する必要がある場合は、次のようなハッシュのリストを使用することができます。

sudoers.support1.commands:
- { alias: "LS", path: "/bin/ls" }
- { alias: "DU", path: "/usr/bin/du" }

次に、テンプレートで:

{% for item in sudoers.{{ group }}.commands %}
Cmnd_Alias {{ item.alias }} = {{ item.path }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {{ sudoers.{{ group }}.commands | map(attribute='alias') | join(', ') }}

/ usr / bin / lessを使用するのは安全ではありません

これらすべてにおいて、あなたはそれほど重要なことに気づかなかった、そしてそれはビューアとしてのlessの使用である。残念なことに、これはセキュリティホールです。bashを呼び出すには、「!bash」と入力します。そして、「v」を押すと、VISUAL、EDITOR、またはLESSEDIT変数に基づいてエディターに入ります。そのため、それらに「/ bin / cat」を指定すると、コンテンツを常に自分自身にパイプすることができます。たとえば、UNIXの一部のファイルは非常に意図的に制限されているため、これはまだセキュリティホールです。

/etc/shadow
/etc/sudoers
/etc/ssh/ssh_host_rsa_key
$HOME/.ssh/id_rsa

1
私は後編が好きです。less as sudoコマンドは使用しないでください。
Err0rr

1
変更が1か所にある場合、変数の変更とテンプレートの変更の間に差はありません。変数を使用すると、読みにくくなります。変数を本当に使用する必要がある場合は、より適切な名前を付けて、ハッシュのリストを
作成してください

1

まず

スペース/改行のJinja処理を参照する必要があります。あなたの現在のテンプレートには、新しい行を作成することになり、そして、私は、これが混乱すると思いますsudo(IIRC、右の構文を追加することです構文の検証をして失敗する-ように:-%}ループのために、しかし、あなたが「遊び」べきで、何が起こるかを参照してください)。テンプレートをレンダリングするには、実際のターゲットマシンで実行せずに、ワークステーションでテンプレートを実行できます。

また、命令行で1つのコマンドを使用してテンプレートを作成する方が読みやすいと思います。

{% for command in commands %}
%{{group}} ALL=(ALL) NOPASSWD: {{command}}
{% endfor %}

第二に

既存のグローバルファイルをansibleで編集することはお勧めしません。代わりに、カスタムテンプレートを/etc/sudoers.d/(下で見たように)作成します。

次の理由により、これは正しい方法です。

  • システムはすべてのデフォルトをそのままにします。
  • テンプレートははるかに短くなります。
  • あなたがミスをした場合、あなたはあなたがテンプレートのどこを見るべきかを確信するでしょう。

第三に

which内部sudoersで実行することは独創的なアイデアだと思いますが、うまくいかないはずです。


1
確かに私は構文エラーメッセージを受け取りました。構文を調べます。そしてもちろん、このために別のファイルを作成しました。
Err0rr 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.