Мы с коллегой используем Ansible для управления группой серверов.
Мы используем файл .ansible.cfg в наших локальных домашних каталогах, чтобы настроить нашу локальную среду и сохранить наши playbooks в репозитории git.
При аутентификации на серверах я использую user1, а он user2. 95% наших серверов имеют эти учетные записи, но исторически сложилось так, что некоторые серверы имеют только «пользовательские» учетные записи.
Мы используем host_vars, чтобы установить переменную remote_user для меньшинства рассматриваемых серверов.
Однако в наших плейбуках мы обычно используем «all», чтобы указать, какие серверы мы хотим задействовать, и используем параметр --limit в командной строке, чтобы точно указать, какие серверы должны получить обновление. Наша серверная ферма - это наследие неправильно спроектированных серверов, которые должны оставаться в сети до тех пор, пока они не будут выведены из эксплуатации через несколько лет, и мы обнаружили, что этот подход лучше всего соответствует нашим потребностям.
Наша проблема в том, что наш параметр remote_user установлен в нашем файле .ansible.cfg, где он отображается как переменная среды, а не как переменная скрипта.
Значит, если наша задача содержит:
remote_user: "{{ remote_user }}"
Это будет работать только для хостов, для которых определена эта переменная.
Для 95% хостов, для которых мы не определяем эту переменную, задача не выполняется.
Есть ли способ использовать переменную, только если она определена?
например
Если remote_user определен, используйте его, если нет, используйте переменную среды, установленную в .ansible.cfg
Примечание: я знаю, что могу использовать:
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
В определении задачи, но это будет применяться только к этой задаче, и я не хочу обновлять всю задачу
Когда мне действительно нужно, чтобы это условие было доступно в определении хоста, то есть:
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
Но это незаконно в Ansible
Как обычно, потратив 2 часа на то, чтобы откладывать вопрос здесь, я нахожу ответ через 5 минут после того, как отправляю вопрос!
Это действительно просто. Чтобы установить другой remote_user для отдельных систем без необходимости применять множество хаков к существующим playbooks, просто добавьте var к хосту в вашем инвентаре:
[web_servers]
server1 ansible_ssh_user=user
server2
В этом случае каждый раз, когда игра включает server1, «пользователь» будет использоваться в качестве пользователя ssh. Для server2 будет использоваться значение remote_user из вашего файла ansible.cfg (например, user1, user2 и т. Д. В зависимости от локальной среды).