質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Ansible

    172questions

    Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Ansibleでsudoerの登録記法について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,502

Ken.sakanakana

score 1662

Ansibleでたとえば user1 というアカウントをsudoersに以下の通り登録したいとします。
user1 ALL=(ALL) NOPASSWD: ALL

ansibleのplaybookで、

    tasks:
    - name: add users to sudoers
      shell: echo "user1 ALL=(ALL) NOPASSWD{{:}} ALL" > /tmp/user1 \
          && chmod 440 /tmp/user1 \
          && chown root:root /tmp/user1 \
          && visudo -q -c -f /tmp/user1  \
          && mv /tmp/user1 /etc/sudoers.d/user1
※なぜか、NOPASSWDの後ろのコロン(:)でエラーがでますので{{}}で回避
※ユーザアカウントを with_itemsで複数にもできます。この際は上記{{}}問題は回避

    tasks:
    - name: add users to sudoers
      shell: echo "{{ item.user }} {{ item.role }}" > /tmp/{{ item.user }} \
          && chmod 440  /tmp/{{ item.user }} \
          && chown root:root  /tmp/{{ item.user }} \
          && visudo -q -c -f /tmp/{{ item.user }} \
          && mv /tmp/{{ item.user }} /etc/sudoers.d/{{ item.user }}
      with_items:
       - { user: "user1", role: "ALL=(ALL) NOPASSWD: ALL" }


とするのか、

    tasks:
    - name: add users to sudoers
      lineinfile: dest=/etc/sudoers.d/{{ item.user }}
        owner=root group=root mode=0440
        state=present
        create=yes
        line="{{ item.user }} {{ item.role }}"
        validate='visudo -cf %s'
      with_items:
       - { user: "user1", role: "ALL=(ALL) NOPASSWD: ALL" }
※この場合は NOPASSWDの後ろのコロン(:)はエラーが出ません。

とするのか、結構バラつきがありどちらが良いか決めあぐねております。
どちらも、冪等性は問題なく、妥当性チェックもできているので、
どちらでも良いといえばよいのですが、みなさまは如何されておられますか?
※ sudoers登録の良いモジュールがあればよいのですが。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

まず、
なぜか、NOPASSWDの後ろのコロン(:)でエラーがでますので{{}}で回避
についてですが…

これは恐らく、名前: が yaml ではハッシュのキー値を意味してしまうからですね。
なので、echo コマンドの引数をダブルクォート " ではなくシングルクォート ' で括れば良いのではないかと思います。

でもって、
どちらも、冪等性は問題なく、妥当性チェックもできているので、 
どちらでも良いといえばよいのですが…
であれば、本当にどちらでも良いですよ〜、ってそれでは無責任ですよね :p

これはあくまでも個人的な意見ですが、Ansibleのplaybookを書く際に重要なことは下記3点だと思うので、
  • 記述されたコマンドが確実に動作すること
  • 冪等性が保たれていること
  • メンテナンス性(可読性)が高いこと
掲載された記載例の いずれかを選べ と言われれば、自分なら後者を選びます。
(過度に変数を使用すると、後から読んだ時に意味が分かりにくいと思うので)

なお、同様の問題に関して こんな 記載例がありましたので、ご参考になさってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/29 08:12

    さっそくのご回答ありがとうございます。
    分かりやすいポイントご説明ありがとうございました。

    その、可読性なのですが、私を含め、周りが昔ながらのインフラエンジニアで、
    「職人がこころをこめて1台1台設置したアプリケーションサーバ。すべて同じようにみえます。でも近づいてよく見ると少しずつ設定がことなっているのです。大量生産とは違ってそれぞれに個性が」
    というのは、冗談ですが、シェルスクリプトをぱっと見てやってる事を理解する人と、
    Ansibleをぱっとみてやってる事を理解する人との間隔が育っていませんでして、
    でも、使うツールを決めたからには、昔ながらの・・・はさておき、ツールに
    準ずるようにすべきなのでしょうね!

    あと、ちなみにですが、 {{:}} の所は、シングルクォートでも発生します。
    まぁ、こういった特異な状態もダメな所ですね。
    $ ansible-playbook test.yml --syntax-check
    ERROR: Syntax Error while loading YAML script, test.yml
    Note: The error may actually appear before this position: line 8, column 44

    - name: add users to sudoers
    shell: echo 'user1 ALL=(ALL) NOPASSWD: ALL' > /tmp/user1 \
    <snip>

    参考サイトの紹介もありがとうございます。/etc/sudoersの書き換えなら、こんなに
    スマートに書けるんですね。
    その点も悩ましい所なのですが、あえて /etc/sudoers.d/以下にファイルを作る事に
    しました。。。
    あと、visudo によるチェックを入れられれば完璧ですね!

    ひとまず方針は(心は)決まりました!ありがとうございました。

    キャンセル

  • 2015/08/29 08:55

    今更ですが、ちょっと参考になりそうなページを見つけたので貼り付けておきます。
    > http://qiita.com/yteraoka/items/2afaa39d0635c7af1de4

    キャンセル

  • 2015/08/30 09:58

    ありがとうございます!
    lineinfile 以下をダブルクォートするか、ネストすれば大丈夫そうですね :-)
    しかし、論点とは異なるとはいえ、みなさまのサンプルでvisudo による
    チェックが無いのは恐怖です。ファイルに一か所でもミスがあると、他
    アカウントも全部sudo出来なくなるので、rootログインできる奇特な
    環境でない限りOSからセットアップなど手戻りで手間が増えますね ;-(

    キャンセル

同じタグがついた質問を見る

  • Ansible

    172questions

    Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。