新しいサーバーインスタンスは、sshを介してパスワードでrootにログインするように構成されています。 Ansibleプレイブックでキーを使用するように再構成し、最初の実行時にパスワードでrootログインを無効にしたいので、次のようなものが必要です。
キーでログインできない場合:
他のタスクを行う
どうすればそれを達成できますか?
[〜#〜] edit [〜#〜]:明確にするために、私はキーを追加する方法やルートを無効にする方法を尋ねていません。キーで認証できなかった場合にパスワードにフォールバックする方法を尋ねています。 --ask-pass
またはansible_ssh_pass
設定、Ansibleは公開鍵認証の使用を試みません
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).
プレイブックの「初回実行」でansible_user
が異なる場合の例を次に示します(たとえば、root
ユーザーのみがあり、SSHを使用して新しいユーザーを設定する場合)キー):
ansible_pass
に保存します(Vaultを使用することを忘れないでください)。これは、プレイブックの「初回実行」に使用するユーザーのパスワードである必要があります。ansible_user
を、サーバーでユーザーが正しく設定されている最初の実行後に使用するユーザーのユーザー名に設定します。ansible_user_first_run
を、プレイブックの「最初の実行」に使用するユーザーに設定します(例:root
)。ignore_errors
およびchanged_when: False
を使用して、ローカルコマンドを使用し、正しいSSHキーでサーバーへの接続を試みます。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
注:一部の構成では、paramikoがサーバーへのログインに予期せず失敗する可能性があるため、transport = ssh
をセットアップする価値があります(たとえば、サーバーがパスワードを受け入れないようにセットアップされており、最初にキー、次にパスワードで試行している場合)。 ..奇妙です!)また、sshトランスポートは高速なので、とにかく価値があります。
さらに注:この方法を使用する場合は、プレイブック定義ファイルでgather_facts: false
を指定して、パスワードのテスト段階に入る前にセットアップ/ファクト収集タスクが自動的に実行されないようにする必要があります。 ansibleファクトのいずれかが必要な場合は、ansible_devices
などの場所で通常利用できるデータにアクセスする前に、ロールでsetup
を明示的に呼び出す必要があります。これを行う1つの良い方法setup
をwhen
句で呼び出して、役割で呼び出す前に、使用しているファクトが空かどうかを確認します。
Ansible-playbookを実行するときは--ask-pass
を使用できます。
あなたが尋ねた他のタスクについては、それはコピーモジュールなどの様々な手段で達成できます。
rootログインを無効にすることもできます。 sshd_conf
をテンプレート化するか、confファイルに行を挿入します。