Мы с коллегой используем Ansible для управления группой серверов.
Мы используем файл .ansible.cfg в наших локальных домашних каталогах для настройки наших локальных сред и сохраняем наши сценарии в репозитории git.
При аутентификации на серверах я использую user1, а он — user2. 95% наших серверов имеют такие учетные записи, но исторически сложилось так, что на нескольких серверах есть только учетная запись «user».
Мы используем 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.
решение1
Как обычно, потратив 2 часа на то, чтобы задать вопрос здесь, я нахожу ответ через 5 минут после того, как опубликовал вопрос!
Это действительно просто. Чтобы задать другого remote_user для отдельных систем без необходимости применять кучу хаков к существующим плейбукам, просто добавьте var к хосту в вашем инвентаре:
[web_servers]
server1 ansible_ssh_user=user
server2
В этом случае, всякий раз, когда игра включает server1, "user" будет использоваться как пользователь ssh. Для server2 будет использоваться значение remote_user из вашего файла ansible.cfg (например, user1, user2 и т. д. в зависимости от локальной среды).