Задание ключа ssh в файле незанятых файлов для воспроизведения

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

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

Можно ли указать расположение этого ключа в файле playbook вместо использования --key-file в командной строке?

Потому что я хочу записать расположение этого ключа в файл var.yaml, который будет читаться с помощью доступной playbook с 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

Имя переменной, которую вы ищете, - 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.cfg, он должен выглядеть следующим образом (есть и другие параметры, которые вы можете включить):

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

Надеюсь, это сэкономит вам печатать

Ответ 3

Если вы запустите вашу playbook с 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 }}"

но это тоже не удается.

Так что это не ответ. Просто некоторая помощь в отладке и вещи, которые нельзя попробовать.

Ответ 4

Привет, ребята, я написал эту пьесу. В этом я создаю новый сервер e2, создающий группу веб-серверов, указывающую ip этого нового экземпляра для настройки в нем python.


  • имя: создание новых серверов EC2

хосты: localhost

collect_facts: Flase

задачи:

  • ec2:

имя_ключа: DCP_dev

instance_type: t2.micro

изображение: ami-08660f1c6fb6b01e7

подожди: да

группа: запуск-мастер-5

регион: ес-запад-1

Количество: 1

vpc_subnet_id: subnet-5667061e

зарегистрируйтесь: ec2

  • имя: описание

отладки:

msg: "{{ec2}}"

  • Название: Назначение эластичного IP

ec2_eip:

device_id: "{{item.id}}"

private_ip_address: "{{item.private_ip}}"

регион: "{{item.region}}"

цикл: "{{ec2.instances}}"

  • name: добавьте только что созданный хост, чтобы мы могли продолжить его

add_host:

имя: "{{item.private_ip}}"

группы: веб-серверы

with_items: "{{ec2.instances}}"

  • отладки:

msg: "{{item}}"

with_inventory_hostnames:

  • все

  • Название: Установка программного обеспечения

хосты: веб-серверы

набор_фактов: нет

задачи:

  • имя: установка Python

оболочка: sudo apt-get install python -y


Я добавил файл pem в ansible.cfg

host_key_ckecking = False

private_key_file =/home/ubuntu/.ssh/eg.pem

и когда я запускаю эту пьесу

ansible-playbook ec2.yml

Я получаю ошибку при установке программного обеспечения

Из-за невозможности установить соединение с сервером отказано

Кто-нибудь может мне помочь.. Может кто-нибудь дать мне знать, есть ли способ указать файл pem в этой части любой модуль или переменную что-нибудь

  • Название: Установка программного обеспечения

хосты: веб-серверы

собрать_факты: нет

задачи:

  • имя: установка Python

оболочка: sudo apt-get install python -y