Задание ключа 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
задачи:
имя_ключа: 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:
хосты: веб-серверы
набор_фактов: нет
задачи:
оболочка: 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 в этой части любой модуль или переменную что-нибудь
- Название: Установка программного обеспечения
хосты: веб-серверы
собрать_факты: нет
задачи:
оболочка: sudo apt-get install python -y