Как установить Ansible имя пользователя и пароль по умолчанию для SSH-соединения?

60

Я использую Ansible, и у меня есть эта конфигурация в моем инвентаре / все:

[master]
192.168.1.10 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[slave]
192.168.1.11 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant
192.168.1.12 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[app]
192.168.1.13 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[all:children]
master
slave

Я не хочу повторять все параметры для каждого нового экземпляра. Как я могу настроить их только в одном месте? Есть ли файл с этими параметрами?

Роберт
источник
3
~/.ssh/config
ceejayoz
1
@ceejayoz Не могли бы вы объяснить немного
Роберт
Я не администратор Ansible, и документы на предмет облачны ( это «переменная» или «параметр» и есть ли разница? ), Но похоже, что вы можете как-то определить переменные на уровне группы.
DerfK

Ответы:

75

Вы можете добавить следующий раздел в свой инвентарный файл:

[all:vars]
ansible_connection=ssh
ansible_user=vagrant
ansible_ssh_pass=vagrant

Примечание: до Ansible 2.0 ansible_userбыла ansible_ssh_user.

Алексей Лабзов
источник
2
Выше Ansible 2.0 должно быть: [all:vars] ansible_connection=ssh ansible_port=22 ansible_user=admin
zx1986
2
@ zx1986 где ты это прочитал?
0:30
2
@ 030 здесь: docs.ansible.com/ansible/...
zx1986
Обратите внимание, что порт 22 используется по умолчанию для ansible_port, поэтому вам не нужно явно указывать его, если не указано иное. Интересно, если кто-нибудь знает, как применять переменные более чем к одной группе за раз (но не ко всем), разделение запятыми не работает.
Уильям Туррелл
1
@WilliamTurrell немного поздно, но .. вы можете создать группу групп (с модификатором: children), а затем установить переменные (с модификатором: vars).
Лассе Хальберг Харби
23

Групповые переменные

Вы можете установить переменные, которые применяются ко всем хостам, используя макет playbook, указанный в документе Best Practices Ansible, и создав group_vars/allфайл, в котором вы их определяете .

---
# file: group_vars/all
ansible_connection: ssh 
ansible_ssh_user: vagrant 
ansible_ssh_pass: vagrant

[править] Я смущен тем, что вы пытаетесь сделать, хотя. Вам не нужно указывать Ansible пользователя или пароль в инвентаре. Если вы используете Vagrant, вы определенно этого не сделаете, и если вы вызываете Ansible из командной строки, вы можете указать пользователя с помощью --user=vagrantи попросить пароль --ask-pass.

Филип Уилсон
источник
1
Мне нужно только лучше организовать свою инфраструктуру. Если я всегда буду использовать vagrant: vagrant, я хочу поместить его в какое-нибудь место, где Ansible загружается по умолчанию, но я не знаю, где. Каждое соединение должно быть использовано.
Роберт
Файл должен быть назван group_vars/all/main.ymlили просто group_vars/all?
Realtebo
этот работал у меня после установки sshpass-"you must install the sshpass program"
user9869932
1
@realtebo Файл должен быть назван group_vars/all.
xloto
1
-k для ask pass - не очень весело для «всех», когда у каждого хоста свой пароль. Да, вам нужен sshpass, и да, вам, вероятно, нужно заполнить known_hosts, если вы никогда не подключались раньше, чем ~ \ .ssh \ config.
Маккензм
5

Я думаю, что лучше использовать установку ключа ssh на всех серверах через натяжение. Вы должны запускать ssh-copy-id только для каждого узла и устанавливать ключ ssh везде, чтобы ansible могла войти в систему с помощью ключа ssh. Будет безопаснее не сохранять пароли в playbook / инвентарь.

Для этого вы должны сгенерировать пару ключей ssh и впоследствии запустить ssh-copy-id для всех серверов.

Podarok
источник
1
Если кто-то сможет украсть пароль из вашего файла конфигурации, он, вероятно, сможет использовать и ваши ssh-ключи. И это никак не связано с ответами на вопросы ОП. Этот вопрос не спрашивал мнения об альтернативах.
Muh
@MuhFugen> Как я могу настроить их только в одном месте? Есть ли файл с этими параметрами? Это точная фраза, которая оставляет дверь для мнения, а ответ дает понимание правильного направления. Конфигурация кражи (которая может находиться где-то в репозитории git) - это не то же самое, что кража личного ключа.
Podarok
4

Добавьте ниже к инвентарю хостов.

Для Ansible <2.0:

[all:vars]
ansible_connection=ssh
ansible_ssh_user=vagrant 
ansible_ssh_pass=vagrant

Для Ansible> = 2.0 :

[all:vars]
ansible_connection=ssh # actually default mode smart is OK
ansible_user=vagrant
ansible_pass=vagrant # or ansible_ssh_pass=vagrant
Mithril
источник
Ссылка упоминает ansible_ssh_pass, нет ansible_pass.
Матиас Вейлер
2

Отказ от ответственности: я только проверял это на OSX. Основываясь на различных документах, я ожидаю, что он будет работать на других платформах.

«каталог проекта» относится к базовому каталогу проекта Vagrant - каталогу, который содержит Vagrantfile.

Файл Ansible Inventory, автоматически сгенерированный Vagrant:

Vagrant создает файл инвентаря с переменными соединения по умолчанию Ansible. Ищите это в <project directory>/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory.

Этот файл будет восстановлен Vagrant по мере необходимости, поэтому ручные изменения будут перезаписаны. Однако, согласно документам Vagrant, вы можете указать несколько машин, групповых переменных и т. Д., VagrantfileИ они будут добавлены в этот файл инвентаризации.

Настройте Ansible по умолчанию для этого файла инвентаризации:

Чтобы сделать этот файл используемым по умолчанию для ansibleкоманды, когда вы находитесь в каталоге проекта (на хосте), добавьте ansible.cfgфайл в каталог проекта с этим содержимым, изменив путь по мере необходимости:

[defaults]
inventory = ./path/to/inventory

Чтобы убедиться, что этот файл инвентаризации используется, найдите его как значение по умолчанию, сообщаемое ansible:

(из каталога проекта)

$ ansible | grep inventory ERROR! Missing target hosts -i INVENTORY, --inventory-file=INVENTORY specify inventory host path (default=./.vagrant/provis ioners/ansible/inventory/vagrant_ansible_inventory) or

Чтобы подтвердить ваши хосты:

$ ansible all --list-hosts hosts (2): master slave

Использование Ansible с этими хостами:

Из каталога проекта вы сможете использовать его ansibleс хостами, которые вы определили, как обычно Vagrantfile.

Например:

ansible slave -a 'hostname'
kentr
источник