Как определить закрытый ключ ssh для серверов, извлеченных из динамической инвентаризации в файлах
Я столкнулся с одной проблемой конфигурации при кодировании незанятой пьесы для файла закрытого ключа ssh.
Как мы знаем, мы можем определить комбинацию с хост-сервером, ip и связанным с ним закрытым ключом ssh в файле необработанных хостов для статических серверов инвентаризации.
Но я понятия не имею, как определить это с помощью динамических серверов инвентаризации.
Пример:
---
- hosts: tag_Name_server1
gather_facts: no
roles:
- role1
- hosts: tag_Name_server2
gather_facts: no
roles:
- roles2
Ниже для вызова этой пьесы используется команда ниже:
ansible-playbook test.yml -i ec2.py --private-key ~/.ssh/SSHKEY.pem
Мой вопрос:
- Как я могу определить ~/.ssh/SSHKEY.pem в незаменимых файлах, а не в командной строке.
- Я предполагаю, что в playbook может быть один параметр, например "gather_facts", чтобы определить, какой секретный ключ следует использовать для вышеуказанных хостов, но не похоже на такой параметр?
- Если нет способа определить закрытый ключ в файлах, что должно быть определено в командной строке, если для одного динамического сервера будет использоваться другой ключевой файл для одной пьесы?
Спасибо за ваши комментарии
Ответы
Ответ 1
TL; DR: укажите ключевой файл в файле групповой переменной, так как "tag_Name_server1" - это группа.
Примечание. Предполагаю, что вы используете внешний инвентарь EC2 script. Если вы используете какой-либо другой подход к динамическим запасам, вам может потребоваться настроить это решение.
Это проблема, с которой я изо всех сил боролся в течение нескольких месяцев, и я наконец нашел решение, благодаря предложению Брайана Коки здесь, Хитрость заключается в том, чтобы использовать механизмы переменных группы Ansible для автоматического прохождения по правильному ключевому файлу SSH для машины, с которой вы работаете.
В инвентаре EC2 script автоматически настраиваются различные группы, которые вы можете использовать для ссылки на хосты. Вы используете это в своей пьесе: в первой пьесе вы говорите Ansible, чтобы применить "role1" ко всей группе "tag_Name_server1" . Мы хотим направить Ansible для использования определенного SSH-ключа для любого хоста в группе "tag_Name_server1" , в которую входят файлы групповой переменной.
Предполагая, что ваша playbook находится в каталоге "my-playbooks", создайте файлы для каждой группы в каталоге "group_vars":
my-playbooks
|-- test.yml
+-- group_vars
|-- tag_Name_server1.yml
+-- tag_Name_server2.yml
Теперь, когда вы ссылаетесь на эти группы в учебнике, Ansible проверяет соответствующие файлы и загружает любые переменные, которые вы там определили.
Внутри каждого файла var var мы можем указать файл ключа, который будет использоваться для подключения к хостам в группе:
# tag_Name_server1.yml
# --------------------
#
# Variables for EC2 instances named "server1"
---
ansible_ssh_private_key_file: /path/to/ssh/key/server1.pem
Теперь, когда вы запускаете свою книгу, она автоматически выбирает правильные клавиши!
Использование среды vars для переносимости
Я часто запускаю проигрыватели на разных серверах (локальный, удаленный сервер сборки и т.д.), поэтому мне нравится параметризовать вещи. Вместо использования фиксированного пути у меня есть переменная среды, называемая SSH_KEYDIR, которая указывает на каталог, в котором хранятся ключи SSH.
В этом случае мои файлы групп vars выглядят следующим образом:
# tag_Name_server1.yml
# --------------------
#
# Variables for EC2 instances named "server1"
---
ansible_ssh_private_key_file: "{{ lookup('env','SSH_KEYDIR') }}/server1.pem"
Дальнейшие улучшения
Вероятно, есть несколько опций, которые можно было бы улучшить. Во-первых, вам все равно нужно вручную указать, какой ключ использовать для каждой группы. Поскольку инвентарь EC2 script содержит сведения о ключевой паре, используемой для каждого сервера, возможно, есть способ получить имя ключа непосредственно из самого script. В этом случае вы можете указать каталог, в котором находятся ключи (как указано выше), и выбрать правильные ключи на основе данных инвентаризации.
Ответ 2
Лучшим решением, которое я смог найти для этой проблемы, является указание файла закрытого ключа в файле ansible.cfg(обычно я держу его в той же папке, что и в playbook):
[defaults]
inventory=ec2.py
vault_password_file = ~/.vault_pass.txt
host_key_checking = False
private_key_file = /Users/eric/.ssh/secret_key_rsa
Хотя, он по-прежнему устанавливает закрытый ключ для всех хостов в playbook.
Примечание. Вы должны указать полный путь к ключевому файлу - ~ user/.ssh/some_key_rsa молча игнорируются.
Ответ 3
Вы можете просто определить ключ, который будет использоваться непосредственно при запуске команды:
ansible-playbook \
\ # Super verbose output incl. SSH-Details:
-vvvv \
\ # The Server to target: (Keep the trailing comma!)
-i "000.000.0.000," \
\ # Define the key to use:
--private-key=~/.ssh/id_rsa_ansible \
\ # The `env` var is needed if `python` is not available:
-e 'ansible_python_interpreter=/usr/bin/python3' \ # Needed if `python` is not available
\ # Dry–Run:
--check \
deploy.yml
Копировать/Вставить:
ansible-playbook -vvvv --private-key=/Users/you/.ssh/your_key deploy.yml
Ответ 4
Я использую следующую конфигурацию:
#site.yml:
- name: Example play
hosts: all
remote_user: ansible
become: yes
become_method: sudo
vars:
ansible_ssh_private_key_file: "/home/ansible/.ssh/id_rsa"
Ответ 5
У меня была аналогичная проблема и она была решена с исправлением ec2.py и добавлением некоторых параметров конфигурации в ec2.ini. Патч принимает значение ec2_key_name, префикс его с помощью ssh_key_path и добавляет ssh_key_suffix в конец и записывает в качестве этого значения файл ansible_ssh_private_key_.
Следующие переменные должны быть добавлены в ec2.ini в новом разделе "ssh" (это необязательно, если значения по умолчанию соответствуют вашей среде):
[ssh]
# Set the path and suffix for the ssh keys
ssh_key_path = ~/.ssh
ssh_key_suffix = .pem
Вот патч для ec2.py:
204a205,206
> 'ssh_key_path': '~/.ssh',
> 'ssh_key_suffix': '.pem',
422a425,428
> # SSH key setup
> self.ssh_key_path = os.path.expanduser(config.get('ssh', 'ssh_key_path'))
> self.ssh_key_suffix = config.get('ssh', 'ssh_key_suffix')
>
1490a1497
> instance_vars["ansible_ssh_private_key_file"] = os.path.join(self.ssh_key_path, instance_vars["ec2_key_name"] + self.ssh_key_suffix)