Назад | Перейти на главную страницу

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

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