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

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

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

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

Q&A

解決済

2回答

2917閲覧

sudoパスワード省略時にタスクをスキップしたい

ryunix

総合スコア1656

Ansible

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

0グッド

1クリップ

投稿2015/08/02 20:10

いつもお世話になっております。

$ ansible-playbook -K-Kを省略した時にTask2をスキップしたいと考えています。

ignore_errors: yesを指定すると望んだ結果にはなりますが、
コンソールが赤く染まってしまうのでskippingにしたいです。

whenで判定するとskippingになりますが、
実行制御のような変数は増やしたくないです。

ずばり、sudoパスワードが未指定という変数が取得できればベストなのですが... :(

よろしくお願いします。

--- - hosts: all gather_facts: no # vars: # exec_task2: yes tasks: - name: Task1 debug: msg={{ 'Task1' }} - name: Task2 lineinfile: dest=/etc/shells line=/usr/local/bin/bash sudo: yes # ignore_errors: yes # when: exec_task2 - name: Task3 debug: msg={{ 'Task3' }}

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

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

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

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

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

guest

回答2

0

自己解決

大変申し訳ありませんが、sudoパスワード省略時にタスクをスキップすると言うのは説明不足でした。

基本的に一回実行すれば良いタスクなので、一回目は-Kありで実行し、
二回目以降は-Kなしで実行したいと言う感じでした。

最終的に以下のように対応しました。
sudoが必要なタスクを実行する際は、本当に実行する必要があるか判定するのが一番良いと判断しました。

--- - hosts: all gather_facts: no tasks: - name: Task1 debug: msg={{ 'Task1' }} - name: Task2 lineinfile: dest=/etc/shells line=/usr/local/bin/bash when: "'/usr/local/bin/bash' not in lookup('file', '/etc/shells')" sudo: yes - name: Task3 debug: msg={{ 'Task3' }}

投稿2015/08/06 13:10

ryunix

総合スコア1656

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

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

pi-chan

2015/08/06 15:31

無事解決したようで、何よりです。 以下、蛇足ながら、ちょっとご参考まで。 構成管理ツールで「冪等性」を保つのは、極めて基本的かつ重要な問題ですが、それはオプションの有無によって「意図的に」切り替えるということではありません。 ですから、最終的な対応内容が、本来あるべき姿(実行の必要性をチェックした上でのスキップ判定)で実装されたのは非常に良かったと思います。 一方、「意図せずに」パスワードを指定し忘れたりタイプミスのために認証エラーになった場合、10分以上待たされた挙句に結果がエラーだったという悲しみを経験される運用管理担当者も実際にいらっしゃいます。 このような悲しみを未然に防ぐには、sudo のパスワードが不正ならタスクをスキップするという実装も、無駄ではないと思います。
ryunix

2015/08/07 01:55

コメントありがとうございます。 私も勉強中の身で正しいかは分かりませんが、以下のように考えます。 >それはオプションの有無によって「意図的に」切り替えるということではありません。 私もそう思います。 タグ指定などで実行するタスクを制御する方法もあると思いますが、実行時にオプションを判断する必要があるので採用しませんでした。 (本当は常に -K なしで実行し、sudoタスクが走る時にパスワードを聞いてくるオプションがあれば良いと思っています。) 続きます。
ryunix

2015/08/07 02:09

>sudo のパスワードが不正ならタスクをスキップするという実装も、無駄ではないと思います。 パスワードが間違ってるパターンを想定してなかった私が言うのもあれなんですが、あまり良い方法ではないと思います。 それまで(sudoタスク)の処理で冪等性が保証されていれば、再実行すれば良いだけに思えるからです。 10分待った処理も再実行すると ok や skip 判定になり、sudoタスクまでそんなに時間も掛からないはずです。 ですので今回は、sudoタスクを実行する必要があるか判断し、必要な時にパスワード未指定やパスワード不正だったら fail しています。 以上、私の考えです。 おそらく間違ってることもあるかと思いますが、私自身の考えの整理にもなると思い書きました :)
guest

0

# ansible は全くの初心者なので、もし的外れだったらゴメンなさい。。

「sudoパスワードが未指定という変数」は取得できそうにないので、「sudoに失敗」したらスキップするという代替案を考えてみました。

一例として、下記ファイルは sudo に失敗すると cat できないので

-r--r----- 1 root wheel 1275 9 10 2014 /etc/sudoers

以下のように playbook を記載してみました。

$ cat test.yaml - hosts: 127.0.0.1 gather_facts: no tasks: - name: check sudo authentication sudo: yes ignore_errors: yes shell: sudo cat /etc/sudoers >/dev/null 2>&1 #shell: ( sudo cat /etc/sudoers >/dev/null 2>&1; echo $? ) register: result - name: Task1 debug: msg={{ 'Task1' }} - name: Task2 debug: msg={{ 'Task2' }} when: result|success #when: ( result.stdout == '0' ) - name: Task3 debug: msg={{ 'Task3' }} $

1)パスワードが正しく指定された場合

$ ansible-playbook -i /etc/ansible/hosts test.yaml -K SUDO password: PLAY [127.0.0.1] ************************************************************** TASK: [check sudo authentication] ********************************************* changed: [127.0.0.1] TASK: [Task1] ***************************************************************** ok: [127.0.0.1] => { "msg": "Task1" } TASK: [Task2] ***************************************************************** ok: [127.0.0.1] => { "msg": "Task2" } TASK: [Task3] ***************************************************************** ok: [127.0.0.1] => { "msg": "Task3" } PLAY RECAP ******************************************************************** 127.0.0.1 : ok=4 changed=1 unreachable=0 failed=0 $

2)パスワードが指定されなかった場合

$ ansible-playbook -i /etc/ansible/hosts test.yaml PLAY [127.0.0.1] ************************************************************** TASK: [check sudo authentication] ********************************************* failed: [127.0.0.1] => {"failed": true, "parsed": false} [sudo via ansible, key=ibhxzsmzkqrgnjypykcxbljzklzidljk] password: ...ignoring TASK: [Task1] ***************************************************************** ok: [127.0.0.1] => { "msg": "Task1" } TASK: [Task2] ***************************************************************** skipping: [127.0.0.1] TASK: [Task3] ***************************************************************** ok: [127.0.0.1] => { "msg": "Task3" } PLAY RECAP ******************************************************************** 127.0.0.1 : ok=3 changed=0 unreachable=0 failed=0 $

この方式のメリットは、パスワードが未指定の場合だけでなく、指定されたパスワードが間違っていた場合もスキップしてくれる点です。

記載方法等、根本的に違っている部分もあるかもしれませんが、なにせ初心者なのでご容赦ください。

投稿2015/08/04 15:10

pi-chan

総合スコア5936

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

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

ryunix

2015/08/05 12:09

お返事が遅くなってしまいました。 回答頂き、ありがとうございます! 質問を投稿してから、ずっと良いやり方を考えており、もう少しでまとまりそうです。 また、要件が少し変わってしまっているので、大変申し訳ないのですがベストアンサーにはできないかもしれません。 パスワードが間違っている場合のパターンを考慮していなかったので、参考になりました! ありがとうございました :D
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問