web-dev-qa-db-ja.com

キーが拒否された場合、Ansibleでパスワードを使用するにはどうすればよいですか?

新しいサーバーインスタンスは、sshを介してパスワードでrootにログインするように構成されています。 Ansibleプレイブックでキーを使用するように再構成し、最初の実行時にパスワードでrootログインを無効にしたいので、次のようなものが必要です。

  • キーでログインしてみてください
  • キーでログインできない場合:

    • パスワードでログイン
    • authorized_keysにキーを追加する
    • パスワードでrootログインを無効にする
    • オプションでキーを使用して再接続する
  • 他のタスクを行う

どうすればそれを達成できますか?

[〜#〜] edit [〜#〜]:明確にするために、私はキーを追加する方法やルートを無効にする方法を尋ねていません。キーで認証できなかった場合にパスワードにフォールバックする方法を尋ねています。 --ask-passまたはansible_ssh_pass設定、Ansibleは公開鍵認証の使用を試みません

15
petr0

PreferredAuthenticationsオプションを試して、publickey,passwordに設定することができます。デフォルトでは、これらがこの順序で他のオプションと一緒に含まれているため、ansibleはおそらくこれを設定しています。 -oまたはクライアントssh_configを介して追加すると、これを防ぐことができます。

ラッパースクリプトを使用できる場合があります。たとえば、これをkey_or_password.shに入れ、pass.shがパスワードを提供する場合、bash key_or_password.sh root@Hostを実行すると、公開鍵に続いて非インタラクティブパスワードログインが試行されます。

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

ログは、どのメソッドが成功したかを示します。

debug1: Authentication succeeded (publickey).
6
eisd

プレイブックの「初回実行」でansible_userが異なる場合の例を次に示します(たとえば、rootユーザーのみがあり、SSHを使用して新しいユーザーを設定する場合)キー):

  • パスワードログインを使用する場合と同様に、パスワードをansible_passに保存します(Vaultを使用することを忘れないでください)。これは、プレイブックの「初回実行」に使用するユーザーのパスワードである必要があります。
  • ansible_userを、サーバーでユーザーが正しく設定されている最初の実行後に使用するユーザーのユーザー名に設定します。
  • 変数ansible_user_first_runを、プレイブックの「最初の実行」に使用するユーザーに設定します(例:root)。
  • ignore_errorsおよびchanged_when: Falseを使用して、ローカルコマンドを使用し、正しいSSHキーでサーバーへの接続を試みます。
  • それが失敗した場合、ansible_useransible_user_first_runの値に更新します

これがコードです:

---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed

注:一部の構成では、paramikoがサーバーへのログインに予期せず失敗する可能性があるため、transport = sshをセットアップする価値があります(たとえば、サーバーがパスワードを受け入れないようにセットアップされており、最初にキー、次にパスワードで試行している場合)。 ..奇妙です!)また、sshトランスポートは高速なので、とにかく価値があります。

さらに注:この方法を使用する場合は、プレイブック定義ファイルでgather_facts: falseを指定して、パスワードのテスト段階に入る前にセットアップ/ファクト収集タスクが自動的に実行されないようにする必要があります。 ansibleファクトのいずれかが必要な場合は、ansible_devicesなどの場所で通常利用できるデータにアクセスする前に、ロールでsetupを明示的に呼び出す必要があります。これを行う1つの良い方法setupwhen句で呼び出して、役割で呼び出す前に、使用しているファクトが空かどうかを確認します。

7
Tom Bull

Ansible-playbookを実行するときは--ask-passを使用できます。

あなたが尋ねた他のタスクについては、それはコピーモジュールなどの様々な手段で達成できます。
rootログインを無効にすることもできます。 sshd_confをテンプレート化するか、confファイルに行を挿入します。

6
titus