キーが拒否された場合にAnsibleがパスワードを使用する方法


14

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

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

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

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

編集:明確にするために、キーを追加する方法やルートを無効にする方法を尋ねているのではありません。それは単にコンテキストのためです。キーで認証できない場合にパスワードにフォールバックする方法を尋ねています。と--ask-passansible_ssh_passセット、Ansibleも、公開鍵認証を使用しようとはしません


良い質問です、これまでに何を試しましたか?
-dawud

1
sshの設定を別のプレイブックに持ち込んで、-kオプションで実行し、次に-kなしでメインプレイブックを実行します(エージェントのキーを使用)。私はそれが単一のプレイブックに包まれることを望んでいた
...-petr0

@ petr0 ask-passパスワードがキーとは異なるユーザー用である場合(つまり、パスワード付きsshを無効にした後にリモートユーザーを切り替える場合)、これは機能します。それが役立つかどうかわからない。
DylanYoung

回答:


6

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

ラッパースクリプトを使用できる場合があります。例えば、この中でkey_or_password.shpass.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).

7

ansible_userプレイブックの「最初の実行」で異なる場合(たとえば、rootユーザーが1人だけで、SSHキーを使用して新しいユーザーを設定する場合)、次のようにします。

  • ansible_passパスワードログインを使用している場合と同じようにパスワードを保存します(Vaultを使用することを忘れないでください)。これは、プレイブックの「最初の実行」に使用しているユーザーのパスワードです。
  • 設定しansible_user、あなたがサーバー上で正しく設定されたユーザーを持っていたときに最初に実行した後に使用したいユーザーのユーザー名に。
  • の変数をansible_user_first_run、プレイブックの「最初の実行」に使用するユーザーに設定します(例:)root
  • 使用して、正しいSSHキーでサーバーに接続しようとする地元のコマンドを使用ignore_errorsし、changed_when: False
  • それが失敗した場合、ansible_user値に更新しますansible_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

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

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


あなたのソリューションは良いですがgather_facts: no、プレイブックを起動するときに接続しようとするansibleを停止するにはa を追加する必要があります:)
k4cy

あなたは正しいです。すべてのPlaybookのgather_factsをoffに設定しているため、「setup」を明示的に呼び出す必要があります。私は答えでこれを言及するのを忘れました、私は今それを更新します。
トム・ブル

5

--ask-passansible-playbookを実行するときに使用できます。

あなたが求めた他のタスクについては、コピーモジュールなどのさまざまな手段で達成できます。
ルートログインを無効にすることもできます。sshd_confconfファイルにテンプレートを作成するか、行を挿入します。


(-kと同じである)--askパスは私がやっていると私は上記のコメントでそれについて書いたものである
petr0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.