Подтвердить что ты не робот

Как определить закрытый ключ 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", чтобы определить, какой секретный ключ следует использовать для вышеуказанных хостов, но не похоже на такой параметр?
  • Если нет способа определить закрытый ключ в файлах, что должно быть определено в командной строке, если для одного динамического сервера будет использоваться другой ключевой файл для одной пьесы?

Спасибо за ваши комментарии

4b9b3361

Ответ 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)