web-dev-qa-db-ja.com

Ansible-playbook server.ymlでプロジェクションするときに接続を確立できなかった

私はRoot.ioTrellisワークフローを使っています。

ansible-playbook経由で接続を確立できないというエラーが発生しました。

  1. ansible-playbook server.yml -e env=stagingを実行すると、ssh接続を確立できないというエラーが表示されるので、users.ymlファイルを確認したところ、keysセクションの下に問題がありました。

    - name: "{{ admin_user }}"
      groups:
        - Sudo
      keys:
        - "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
        - https://github.com/dummyuser.keys
    

    私は私が既存のid_rsa.pubキーを持っていることに気づきました、しかし、私はそれを私のサーバー上で認証させていませんでした、私は代わりにhttps://github.com/dummyuser.keysを使っていました。だから私はその行を削除しました

    - "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    

    しかし、それでも問題は解決しません。応答は次のとおりです。

    fatal: [10.10.2.5]: UNREACHABLE! => {
        "changed": false, 
        "msg": "Failed to connect to the Host via ssh.", 
        "unreachable": true
    }
    

    また、sshでログインするのにpublic keyが必要なときに、なぜconfigがprivate keyを指すのですか。私はいつもやる

    ssh -i ~/.ssh/private_key [email protected]
    

    私はSSH経由でサーバーにログインするたびに。

  2. 私は別の方法を使いました。今回はcliのキーを指定しました

    ansible-playbook server.yml -e env=staging -vvvv --key-file=~/.ssh/dummy_rsa
    

    その結果、接続を確立できました。

    <10.10.2.5> ESTABLISH SSH CONNECTION FOR USER: dummy_admin
    

    しかし、別のエラーがありました:それはa password is requiredがここで完全なメッセージであると言います:

    fatal: [10.10.2.5]: FAILED! => {
        "changed": false, 
        "failed": true, 
        "invocation": {"module_name": "setup"}, 
        "module_stderr": "OpenSSH_6.9p1, LibreSSL 2.1.8\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 21: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 85702\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\nShared connection to 10.10.2.5 closed.\r\n", 
        "module_stdout": "Sudo: a password is required\r\n", 
        "msg": "MODULE FAILURE", 
        "parsed": false
    }
    

    なぜパスワードが私のgroup_vars/staging/vault.ymlに設定されているのか、よくわからないのですが、その内容は次のとおりです。

    vault_mysql_root_password: stagingpw
    vault_sudoer_passwords:
      dummy_admin: $6$rounds=656000$8DWzDN3KQkM9SjlF$DhxLkYaayplFmtj9q.EqzMDWmvlLNKsLU0GPL9E0P2EvkFQBsbjcMCXgWkug4a5E66PfwL4eZQXzMLkhXcPBk0
    
  3. それで、私はついに以下のコマンドを使ってログインしました:

    ansible-playbook server.yml -e env=staging -vvvv --key-file=~/.ssh/dummy_rsa --ask-become-pass
    

    私にパスワードを尋ねた後、それは機能し、問題なく私のサーバーを準備します。

誰もがこれに光をあてることができますか?私は何かが足りないのですか?詳細が必要な場合はお知らせください。

2
JohnnyQ

私はこの質問を discourse および @fullyint にも投稿しました。だから私はちょうど答えといくつかの抜粋のためのリンクを投稿しています

Ansibleとsshが必要な秘密鍵を見つけるのを手助けする

つまり、各sshコマンドで秘密鍵を手動で指定していることになります。はい、すべてのansible-playbookコマンドで秘密鍵を手動で指定することの当然の結果は、--private-key =またはkey-file =オプションを追加することです。ただし、sshコマンドとansible-playbookコマンドを使用して目的の秘密鍵ファイルを自動的に検索して使用することで、面倒な作業を省くことができます。 1つの方法は、Host 10.10.2.5で使用されるIdentityFileを指定して、ssh設定ファイルにエントリを追加することです。私はあなたのssh-agentに〜/ .ssh/dummy_rsaをロードすることをお勧めします。これはあなたのために鍵を扱うことができ、接続を試みるときに複数の秘密鍵を試します。
あなたのssh-agentが起動していることを確認してください:ssh-agent bashあなたのキーを追加してください:ssh-add〜/ .ssh/dummy_rsaあなたがMacなら、キーチェーンにキーを追加してください:ssh-add -K 〜/ .ssh/dummy_rsaこれで、sshコマンドが-iオプションなしで、そしてansible-playbookコマンドを--key-file =オプションなしで実行できるようになるはずです。 SSH接続をしてみてください。

「Sudo:パスワードが必要です」というエラーの理由

Trellisがserver.ymlプレイブックを介して実行するタスクの中には、Sudoを必要とするものもあります。これは、プレイブックがrootとして接続している場合は問題ありませんが、プレイブックがrootとして接続していない場合があります。このrootとしての最初の接続試行が失敗した場合は、admin_userとしての接続にフォールバックします。あなたが発見したように、このユーザーはオプション--ask-become-passを通してそのSudoパスワードを指定しなければなりません。
rootとしての接続が失敗した理由はすでにご存知かもしれませんが、いくつかの可能性があります。
リモートがAWS上にあり、rootがデフォルトで無効になっており、admin_user:ubuntuである可能性があります。
group_vars/all/security.ymlでsshd_permit_root_login:falseを指定してserver.ymlを既に正常に実行したため、rootがssh経由でログインすることは許可されなくなりました(優れたセキュリティ)。あなたが使用しようとしている秘密鍵が、rootユーザーのauthorized_keysのリモートにロードされていない可能性があります。

2
JohnnyQ

あなたはおそらくあなたの public キーをマシンのauthorized_keysファイルinsideに追加していないでしょう。ローカルのSSHエージェントに private キーを追加することもできます。

  1. public キーをサーバー内に置きます。すでにサーバー上にあるキーの例

    # Add key directly on the box:
    echo "$(cat your_public_key)" >> ~/.ssh/authorized_keys
    # Add key from local to remote:
    ssh user@server "echo \"$(cat your_public_key)\" >> ~/.ssh/authorized_keys"
    
  2. エージェントに private キーを追加する必要があります。

    # Start agent
    eval "$(ssh-agent -s)"
    # Add private key
    ssh-add ~/.ssh/your_private_key
    
1
kaiser