Вказівка ​​ключа ssh у файлі ansible playbook


81

Ansible playbook може вказати ключ, який використовується для підключення ssh за --key-fileдопомогою командного рядка.

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

Чи можна вказати розташування цього ключа у файлі playbook замість використання --key-fileв командному рядку?

Тому що я хочу записати розташування цього ключа у var.yamlфайл, який буде читати ansible playbook with vars_files:.

Далі є частинами моєї конфігурації:

файл 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

Я спробував додати ansible_ssh_private_key_fileпід vars. Але це не працює на моїй машині.

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

Якщо я побіжу ansible-playbookз playbook.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. Це дивно.


1
Думаю --private-key=~/.ssh/keys/id_rsa, спрацює.
zx1986

@ zx1986 --private-key key_file_pathпрацював і на мене.
Kaustubh Desai

Відповіді:


92

Ім'я змінної, яке ви шукаєте, це 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розділі вашої п’єси:

    - 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
    

Інвентаризаційна документація


2
Запис ansible_ssh_private_key_fileUnder varsне працює на моїй машині. Це дивно.
Брайан

Я не хочу вказувати ключ в інвентаризації. Тому що я не можу завантажити vars.ymlз файлу інвентаризації.
Брайан

Точно: varsя думаю, що це вже занадто пізно. Тоді вам слід використовувати файли host_varsабо group_varsфайли, якщо ви не хочете поміщати це у свій інвентар.
zigarn

Було б якось цікаво побачити найкращу практику використання закритого ключа у сховищі, тому приватний ключ можна всунути в репозиторій git, не відчуваючи цього поганого.
ferdy

@fabiog Ви маєте рацію, я щойно перевірив це за допомогою Ansible 2.9 до версії 1.8, і всі (основні) версії працюють із закритим ключем, визначеним у vars:розділі.
zigarn

30

Ви можете використовувати файл ansible.cfg, він повинен виглядати так (Є інші параметри, які ви можете включити):

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

Сподіваюся, це заощадить вам набирати текст


0

Якщо ви запустите свою книгу ігор, ansible-playbook -vvvви побачите фактично виконувану команду, щоб ви могли перевірити, чи справді ключ включений в команду ssh (і ви можете виявити, що проблема полягала в неправильному імені користувача, а не в відсутньому ключі).

Я згоден з коментарем Брайана вище (і редагуванням 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 }}"

але це теж не вдається.

Тож це не відповідь. Просто деяка допомога з налагодження та речі, які не варто намагатись.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.