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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ansible

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

Q&A

解決済

1回答

8341閲覧

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

Ken.sakanakana

総合スコア1768

Ansible

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

0グッド

0クリップ

投稿2015/08/28 15:44

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

user1 ALL=(ALL) NOPASSWD: ALL

ansibleのplaybookで、

yaml

1 tasks: 2 - name: add users to sudoers 3 shell: echo "user1 ALL=(ALL) NOPASSWD{{:}} ALL" > /tmp/user1 \ 4 && chmod 440 /tmp/user1 \ 5 && chown root:root /tmp/user1 \ 6 && visudo -q -c -f /tmp/user1 \ 7 && mv /tmp/user1 /etc/sudoers.d/user1

※なぜか、NOPASSWDの後ろのコロン(:)でエラーがでますので{{}}で回避
※ユーザアカウントを with_itemsで複数にもできます。この際は上記{{}}問題は回避

yaml

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

とするのか、

yaml

1 tasks: 2 - name: add users to sudoers 3 lineinfile: dest=/etc/sudoers.d/{{ item.user }} 4 owner=root group=root mode=0440 5 state=present 6 create=yes 7 line="{{ item.user }} {{ item.role }}" 8 validate='visudo -cf %s' 9 with_items: 10 - { user: "user1", role: "ALL=(ALL) NOPASSWD: ALL" }

※この場合は NOPASSWDの後ろのコロン(:)はエラーが出ません。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、

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

についてですが…

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

でもって、

どちらも、冪等性は問題なく、妥当性チェックもできているので、
どちらでも良いといえばよいのですが…

であれば、本当にどちらでも良いですよ〜、ってそれでは無責任ですよね :p

これはあくまでも個人的な意見ですが、Ansibleのplaybookを書く際に重要なことは下記3点だと思うので、

  • 記述されたコマンドが確実に動作すること
  • 冪等性が保たれていること
  • メンテナンス性(可読性)が高いこと

掲載された記載例の いずれかを選べ と言われれば、自分なら後者を選びます。
(過度に変数を使用すると、後から読んだ時に意味が分かりにくいと思うので)

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

投稿2015/08/28 19:49

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ken.sakanakana

2015/08/28 23: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 によるチェックを入れられれば完璧ですね! ひとまず方針は(心は)決まりました!ありがとうございました。
Ken.sakanakana

2015/08/30 00:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問