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

Найдите программу, которая могла бы быть в нескольких разных местах с Ansible

Я использую пару серверов для приложения Python, некоторые из которых являются CentOS, другие - debian.

Есть ли удобный способ найти программу, которую можно было бы установить в разных местах, не прибегая к приведенному ниже примеру и не повторяя одну и ту же команду несколько раз (с разными when: статей)?

Например, в CentOS это /sbin/nologin, в Debian это /usr/sbin/nologin. Я пытался найти и зарегистрировать путь в переменной, но это кажется глупым:

- name: Find nologin
  command: ls -1 /usr/sbin/nologin
  ignore_errors: yes
  register: nologin_command

- name: Find nologin 
  command: ls -1 /sbin/nologin
  register: nologin_command
  when: nologin_command.stdout == ""

# nologin_command.stdout will be the path to one or the other

В моем конкретном случае я на самом деле пытаюсь найти правильный virtualenv_command для пип модуль. Я должен быть конкретным, иначе я ошибаюсь (например, для Python 2) или путь, которого не существует.

В моих системах будет один из pyvenv, pyvenv-3.4, virtualenv или virtualenv-3.4. По крайней мере, один будет присутствовать, но, в зависимости от операционной системы и того, как был установлен python, они находятся в разных местах или не существуют вообще.

Если бы вы знали правила, которые вы можете использовать для определения местоположения, было бы лучше использовать их (CentOS с python2.7 должен иметь это ...)

Вы, наверное, могли бы сделать что-то вроде

- name: Find nologin
  command: ls -1 /usr/sbin/nologin /sbin/nologin /usr/local/sbin/nologin
  ignore_errors: yes
  register: nologin_command

ИМХО цикл с использованием with_items хотя более читабельный сделает результат более трудным для использования. Или, может быть, использовать find в возможных каталогах:

 - name: Find venv
   command: find /usr/bin /usr/local/bin /opt -executable -type f -name pyvenv -o -name pyvenv-3.4 -o -name virtualenv -o name virtualenv-3.4
   ignore_errors: yes
   register: nologin_command

Как только вы найдете его вместо регистрации переменной, не помешает сохранить его как пользовательский факт, чтобы он был доступен в следующий раз: http://serverascode.com/2015/01/27/ansible-custom-facts.html