Используйте переменную только если она определена в Ansible

Используйте переменную только если она определена в Ansible

Мы с коллегой используем 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 и т. д. в зависимости от локальной среды).

Связанный контент