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

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

ただいまの
回答率

90.60%

  • Ansible

    148questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,188

ryunix

score 1621

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

$ 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' }}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

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/07 00:31

    無事解決したようで、何よりです。

    以下、蛇足ながら、ちょっとご参考まで。

    構成管理ツールで「冪等性」を保つのは、極めて基本的かつ重要な問題ですが、それはオプションの有無によって「意図的に」切り替えるということではありません。
    ですから、最終的な対応内容が、本来あるべき姿(実行の必要性をチェックした上でのスキップ判定)で実装されたのは非常に良かったと思います。

    一方、「意図せずに」パスワードを指定し忘れたりタイプミスのために認証エラーになった場合、10分以上待たされた挙句に結果がエラーだったという悲しみを経験される運用管理担当者も実際にいらっしゃいます。

    このような悲しみを未然に防ぐには、sudo のパスワードが不正ならタスクをスキップするという実装も、無駄ではないと思います。

    キャンセル

  • 2015/08/07 10:55

    コメントありがとうございます。
    私も勉強中の身で正しいかは分かりませんが、以下のように考えます。

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

    続きます。

    キャンセル

  • 2015/08/07 11:09

    >sudo のパスワードが不正ならタスクをスキップするという実装も、無駄ではないと思います。
    パスワードが間違ってるパターンを想定してなかった私が言うのもあれなんですが、あまり良い方法ではないと思います。

    それまで(sudoタスク)の処理で冪等性が保証されていれば、再実行すれば良いだけに思えるからです。
    10分待った処理も再実行すると ok や skip 判定になり、sudoタスクまでそんなに時間も掛からないはずです。

    ですので今回は、sudoタスクを実行する必要があるか判断し、必要な時にパスワード未指定やパスワード不正だったら fail しています。


    以上、私の考えです。
    おそらく間違ってることもあるかと思いますが、私自身の考えの整理にもなると思い書きました :)

    キャンセル

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/05 21:09

    お返事が遅くなってしまいました。
    回答頂き、ありがとうございます!

    質問を投稿してから、ずっと良いやり方を考えており、もう少しでまとまりそうです。
    また、要件が少し変わってしまっているので、大変申し訳ないのですがベストアンサーにはできないかもしれません。

    パスワードが間違っている場合のパターンを考慮していなかったので、参考になりました!
    ありがとうございました :D

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Ansible

    148questions

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