web-dev-qa-db-ja.com

Ansible Playbookファイルでのsshキーの指定

Ansible Playbookは、コマンドラインで--key-fileを使用してssh接続に使用されるキーを指定できます。

ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"

コマンドラインで--key-fileを使用する代わりに、プレイブックファイルでこのキーの場所を指定することは可能ですか?

このキーの場所をvar.yamlファイルに書き込みたいので、このファイルはvars_files:を含むansibleプレイブックによって読み込まれます。

以下は私の構成の一部です。

vars.ymlファイル

key1: ~/.ssh/mykey1.pem
key2: ~/.ssh/mykey2.pem

playbook.ymlファイル

---

- hosts: myHost
  remote_user: ubuntu
  key_file: {{ key1 }}  # This is not a valid syntax in ansible. Does there exist this kind of directive which allows me to specify the ssh key used for this connection?
  vars_files:
    - vars.yml
  tasks:
    - name: Echo a hello message
      command: echo hello

varsの下にansible_ssh_private_key_fileを追加しようとしました。しかし、私のマシンでは機能しません。

vars_files:
  - vars.yml
vars:
  ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
  - name: Echo a hello message
    command: echo hello

上記のansible-playbookplaybook.ymlを実行した場合。次のエラーが表示されました。

TASK [Gathering Facts] ******************************************************************************************************************************
Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/system/setup.py
<192.168.5.100> ESTABLISH SSH CONNECTION FOR USER: ubuntu
<192.168.5.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/Users/myName/.ansible/cp/2d18691789 192.168.5.100 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<192.168.5.100> (255, '', 'Permission denied (publickey).\r\n')
fatal: [192.168.5.100]: UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the Host via ssh: Permission denied (publickey).\r\n",
    "unreachable": true
}
    to retry, use: --limit @/Users/myName/playbook.retry

Sshコマンドでキーファイルの名前が見つかりません。変わっている。

51
Brian

探している変数名はansible_ssh_private_key_fileです。

「vars」レベルで設定する必要があります。

  • インベントリファイル内:

    myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
    myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
    
  • Host_vars内:

    # hosts_vars/myHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
    
    # hosts_vars/myOtherHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
    
  • ホストのグループに同じキーを使用する場合はgroup_varsファイルで

  • プレイのvarsセクション
    EDIT:このソリューションは、変数を定義するには遅すぎるため機能しません。

    - hosts: myHost
      remote_user: ubuntu
      vars_files:
        - vars.yml
      vars:
        ansible_ssh_private_key_file: "{{ key1 }}"
      tasks:
        - name: Echo a hello message
          command: echo hello
    

インベントリドキュメント

58
zigarn

Ansible.cfgファイルを使用できます。次のようになります(含める必要がある他のパラメーターがあります)。

[defaults]
inventory = <PATH TO INVENTORY FILE>
remote_user = <YOUR USER>
private_key_file =  <PATH TO KEY_FILE>

これで入力が楽になることを願っています

19
E.Serra

ansible-playbook -vvvを指定してプレイブックを実行すると、実際のコマンドが実行されているのがわかります。そのため、キーが実際にsshコマンドに含まれているかどうかを確認できます(そして、問題はユーザー名ではなく不足しているキー)。

上記のBrianのコメント(およびzigamの編集)には、varsセクションが遅すぎることに同意します。このようなホストのオンザフライ定義にキーを含めることもテストしました

# fails
- name: Add all instance public IPs to Host group
  add_Host: hostname={{ item.public_ip }} groups=ec2hosts ansible_ssh_private_key_file=~/.aws/dev_staging.pem
  loop: "{{ ec2.instances }}"

しかし、それも失敗します。

したがって、これは答えではありません。いくつかのデバッグヘルプと試してはいけないこと。

0
andrew lorien