ansible で become_user が失敗した時の対応


目次

はじめまして。こんにちは。

ピクトリンク事業部インフラ課の粟田です。

今回の内容を書くに至った経緯

ansibleを社内で利用している事は他の記事を参照してもらえればわかると思いますが、今回そんな運用の中で発生した問題とその解決方をメモとして残しておこうという次第です。

ついでに周りからのなんか書いて投稿しろ、という感じだったりします。

 

発生した問題

ユーザ管理とsudoの権限設定にはldapを使用している環境になります。

実際にログインした状態で

sudo visudo

などは実行できます。

また、ansibleを実行する際に、ansible_ssh_userにrootを基本的には使用しないのが運用ルールとしてあります。

どのサーバにもrootでログインしようとする人が居るので、これは禁止すべきでしょ、普通。

この状態で、以下の様なplaybookを実行するとエラーになりました。

---
- name: test
  hosts: all
  tasks:
    - become: yes
      become_user: testuser
      shell: |
        echo "test" > test.txt

エラー内容はこう(あまりにも見難かったのでjqで整形してあります)

fatal: [test-01]: FAILED! => {
 "changed": false,
 "module_stderr": "Warning: Permanently added test-01,192.168.0.1 (RSA) to the list of known hosts.\r\nConnection to test-01 closed.\r\n",
 "module_stdout": "ユーザー ansible は’/bin/sh -c echo BECOME-SUCCESS-phcpdyxnzwswbuuvocghlxahauusvhof; /usr/bin/python /var/tmp/ansible-tmp-1537524345.87-201229513840099/command.py’ を testuser として test-01 上で実行することは許可されていません。すみません。\r\n",
 "msg": "MODULE FAILURE",
 "rc": 1
}

become_userを記載しない場合には問題なく実行完了するので、油断してたんですが、実際にログインして、コマンドを実行してみました。

% sudo -u voyager /bin/sh -c 'echo "test" >> ~/test.txt'
ユーザー ansible は'/bin/sh -c echo "test" >> ~/test.txt' を testuser として test-01 上で実行することは許可されていません。すみません。

ようは、

  • ansibleでログインする際のユーザは一般ユーザ
  • 一般ユーザでもsudoできる
  • sudo -u 別ユーザ コマンド が実行できない

という部分がポイントです。

そんな環境そうそうないでしょうけど…

解決方法

  • 今更ldapの設定を変更して失敗したら影響範囲が大きいのでとっても億劫
  • 一部バッチ処理でもsudoしてるのがあるのでldapいじりたくないな
  • とりあえず、運用としてansibleユーザだけなんとかできれば良い

という事で、ansibleユーザのsudoの権限を単純に解決することにしました。

echo "ansible ALL=(ALL) NOPASSWD:ALL" > ansible

としてローカルで作成したファイルをansibleのcopyモジュールでリモートの/etc/sudoers.d以下に配置するという最も単純な手法で解決としました。

あとがき

ldapサーバ作った時にもうちょっと検証しておけば…

内輪ネタは削除された…